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