2
応用数学解説
文献あり

自然数の分割の列挙アルゴリズム

201
0

nの分割を列挙したくなったとき,どうやるんだったか毎回忘れるので,自分用に書いておく.

自然数の単調非増加な有限列で,和がnであるものをn分割という.
例えば,(3,3,3,1)は長さ410の分割である.
長さknの分割の集合をP(n,k)とかく.

本稿ではP(n,k)の元を列挙するアルゴリズムを与える.
なおこのアルゴリズムは,k=1nP(n,k)とすることでnの全ての分割を列挙するためにも使うことができる.

記法の定義

自然数の列λ=(λ1,,λr)に対して
λ+1(λ1+1,λr+1),λ1(λ1,,λr,1)
と定義する.
また,1n(1,1,,1)1n個並べたもの)と定義する.

アルゴリズムのもととなる数学的性質

P(n,k)が満たす漸化式.

P(n,k)=(λP(n1,k1){λ1})(λP(nk,k){λ+1})

P(n,k)の元は,末尾が1であるものと,末尾が1でないものに分けられる.前者は末尾の1を消去するとP(n1,k1)の元になり,後者は各要素から1を減じるとP(nk,k)の元になる.

疑似コード

procedure P(n,k)
if n=k then return {1n} end if;
if n0 or n<k then return end if;
SP(n1,k1);
TP(nk,k);
return (λS{λ1})(λT{λ+1})
end procedure

参考文献

投稿日:20231121
更新日:20231121
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

Do everything bijectively.

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中