if not perm2cycles then perm2cycles = function(perm) local n = #perm; local i = 1; -- already reached number local ret = {}; local visited = {}; local step = 0; while (true) do local cycle = {i} local j=i; while (true) do step = step +1 if step > 2*n then return {} end j=perm[j]; visited[j] = 1; if j and j~=cycle[1] then cycle[#cycle+1]=j else break end end i=n+1; for k=1,n do -- find smallest non visited yet if not visited[k] and k cycles = " .. arr2string(cycles) ) end