トップ
正式版

非負整数解の最小完全ハッシュ関数とその逆変換(列挙)の簡略版

概要

この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 だからである。)

目的は、

テーブルを作成し何通りあるかを求める InitSolu( )
取り出し方に辞書順の番号を求める SoluToNum( )
逆に辞書順の番号から取り出し方を求めるNumToSolu( )

応用例

簡略版プログラム

プログラムの結果

   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