A permutation p is self-upgrading if p-:/:p . The phrase sup n computes all the self-upgrading permutations of order n .

sup=: 3 : 0
 if. 1>:y do. i.1,y return. end.
 t=. sup y-1
 x=. (({."1 t)i.1){.t   NB. x=. 0,.1+sup y-2
 k=. }.i.y
 (0,.1+t) , ,/ k ,."_1 ((*+/\"1)-.=k) {"1"_1 x {"_ 1 (i.y)-."1 0 k
)

The algorithm is due to H.A. Rothe as described by E.E. McDonnell, Magic Squares and Permutations, APL Quote-Quad, Volume 7, Number 3, 1976 9. In words, the rows in sup n whose first element is 0 , are form by prefixing 0 to 1+sup n-1 ; the rows whose first element is non-zero k has 0 in column k , the other columns are (sup n-2){(i.n)-.k,0 .

   sup 3
0 1 2
0 2 1
1 0 2
2 1 0
   sup 4
0 1 2 3
0 1 3 2
0 2 1 3
0 3 2 1
1 0 2 3
1 0 3 2
2 1 0 3
2 3 0 1
3 1 2 0
3 2 1 0

If perm n are all the permutations of order n , the phrase (#~ ] -:"1 /:"1) perm n is equivalent to sup n , but requires space (and time) exponential in the size of the desired result.

   perm=: i.@! A. i.
   f=: (#~ ] -:"1 /:"1) @ perm

   (f -: sup)"0 i.9
1 1 1 1 1 1 1 1 1

supcheck has the same argument and result as sup , but incorporates checks:

supcheck=: 3 : 0
 z=. sup y
 assert. 2=#$z
 assert. y={:$z
 assert. (i.y) -:"1 /:~"1 z
 assert. z -: /:~ z
 assert. z -: /:"1 z
)

A computation for the number of self-upgrading permutations derives directly from the way they are generated:

nsup=: 3 : 'if. 1>:y do. 1x else. (nsup y-1)+(y-1)*nsup y-2 end.' M.

   nsup"0 i.10
1 1 2 4 10 26 76 232 764 2620
   #@sup"0 i.10
1 1 2 4 10 26 76 232 764 2620

   nsup 80
245789798368839780414239398545880224872312250090845785136562176



See also


Contributed by RogerHui. Portions of the text previously appeared as part of Some Uses of { and } by Roger Hui, APL87 Conference Proceedings, May 10-14, 1987.

Essays/Self-Upgrading Permutations (last edited 2011-05-09 05:05:17 by RogerHui)