このC/C++言語で書かれたソースプログラムは、
非負整数解の最小完全ハッシュ関数(辞書順での順位)を求める。
また、最小完全ハッシュ関数の逆変換もできる。
そして0から順に最大値までをこの逆変換をすれば、
非負整数解を全て列挙することができる。
例えぱ、3 個の球(SN=3,SN>=0)があるものとし、これを 3 つの箱
(SR=3,SR>=2)に分ける場合を考える。
分け方は、10 通りあって、辞書順での番号と非負整数解を列挙すると、
0:(0,0,3) 1:(0,1,2) 2:(0,2,1) 3:(0,3,0) 4:(1,0,2) 5:(1,1,1) 6:(1,2,0) 7:(2,0,1) 8:(2,1,0) 9:(3,0,0)
となる。
非負整数解の配列 X は、方程式 X[0]+X[1]+X[2]=3 の解である。
(非負整数解の数は rHn であるがこれは n+1Hr-1 に等しい。
なぜなら nHr=n+r-1Cr であり nCr=nCn-r だからである。)
目的は、
0 -> (0,0,3) -> 0 1 -> (0,1,2) -> 1 2 -> (0,2,1) -> 2 3 -> (0,3,0) -> 3 4 -> (1,0,2) -> 4 5 -> (1,1,1) -> 5 6 -> (1,2,0) -> 6 7 -> (2,0,1) -> 7 8 -> (2,1,0) -> 8 9 -> (3,0,0) -> 9