このC/C++言語で書かれたソースプログラムは、
順列の最小完全ハッシュ関数(辞書順での順位)を求める。
また、最小完全ハッシュ関数の逆変換もできる。
そして0から順に最大値までをこの逆変換をすれば、
順列を全て列挙することができる。
例えぱ、0 1 2 3 のように 4 種類(N=4,N>0)の要素があるものとし、
これから 3 つ要素(R=3,0<R<=N)を取り出して並べる場合を考える。
並べ方は、24 通りあって、辞書順での番号と並べ方を列挙すると、
0:(0,1,2) 1:(0,1,3) 2:(0,2,1) 3:(0,2,3) 4:(0,3,1) 5:(0,3,2) 6:(1,0,2) 7:(1,0,3) 8:(1,2,0) 9:(1,2,3) 10:(1,3,0) 11:(1,3,2) 12:(2,0,1) 13:(2,0,3) 14:(2,1,0) 15:(2,1,3) 16:(2,3,0) 17:(2,3,1) 18:(3,0,1) 19:(3,0,2) 20:(3,1,0) 21:(3,1,2) 22:(3,2,0) 23:(3,2,1)
となる。目的は、
0 -> (0,1,2) -> 0 1 -> (0,1,3) -> 1 2 -> (0,2,1) -> 2 3 -> (0,2,3) -> 3 4 -> (0,3,1) -> 4 5 -> (0,3,2) -> 5 6 -> (1,0,2) -> 6 7 -> (1,0,3) -> 7 8 -> (1,2,0) -> 8 9 -> (1,2,3) -> 9 10 -> (1,3,0) -> 10 11 -> (1,3,2) -> 11 12 -> (2,0,1) -> 12 13 -> (2,0,3) -> 13 14 -> (2,1,0) -> 14 15 -> (2,1,3) -> 15 16 -> (2,3,0) -> 16 17 -> (2,3,1) -> 17 18 -> (3,0,1) -> 18 19 -> (3,0,2) -> 19 20 -> (3,1,0) -> 20 21 -> (3,1,2) -> 21 22 -> (3,2,0) -> 22 23 -> (3,2,1) -> 23