23 lines
664 B
Text
23 lines
664 B
Text
function spermutations(integer p, integer i)
|
|
-- generate the i'th permutation of [1..p]:
|
|
-- first obtain the appropriate permutation of [1..p-1],
|
|
-- then insert p/move it down k(=0..p-1) places from the end.
|
|
integer k = mod(i-1,2*p)
|
|
if k>=p then k=2*p-1-k end if
|
|
sequence res
|
|
integer parity
|
|
if p>1 then
|
|
{res,parity} = spermutations(p-1,floor((i-1)/p)+1)
|
|
res = res[1..length(res)-k]&p&res[length(res)-k+1..$]
|
|
else
|
|
res = {1}
|
|
end if
|
|
return {res,iff(and_bits(i,1)?1:-1)}
|
|
end function
|
|
|
|
for p=1 to 4 do
|
|
printf(1,"==%d==\n",p)
|
|
for i=1 to factorial(p) do
|
|
?{i,spermutations(p,i)}
|
|
end for
|
|
end for
|