2つのリスト{k}と{ls}が与えられたとき(ただし、前者のリストの要素数は1つとし、後者のリストの要素数は任意とします。また、リスト内の各要素は、自然数とします。例えば、2つのリストは、{3}と{2,3,4}など。)
、前者のリスト{k}の k という自然数を後者のリスト内の各々の各要素の自然数に振り分けるようにしてにできたリストたちの集まり(リスト)を得たいと考えています。
例えば、2つのリスト{3}と{2,3,4}が与えられたときに、この2つのリストから、新たなリスト{{5,3,4},{4,4,4},{4,3,5},{3,5,4},{3,4,5},{3,3,6},{2,6,4},{2,5,5},{2,4,6},{2,3,7}}を得たいと考えています。

自分でもいろいろと試行錯誤してみましたが、mathematicaになれていないせいからか、なかなか上手くいきません。何かよい方法はないでしょうか?

A 回答 (1件)

キモは整数kをより小さな整数に分割する部分ですが、IntegerPartitionsという組み込み関数でできてしまいます。


あとは、その順列をすべて求めて、それぞれをリスト{ls}に足したものを返せば良くなります。

例えば、
f[a_, b_List] := (b + #) & /@ Flatten[Permutations[PadRight[#, Length[b]]] & /@ IntegerPartitions[a], 1]
として、
f[3, {2, 3, 4}]
とすると、
{{5, 3, 4}, {2, 6, 4}, {2, 3, 7}, {4, 4, 4}, {4, 3, 5}, {3, 5, 4}, {3, 3, 6}, {2, 5, 5}, {2, 4, 6}, {3, 4, 5}}
が得られます。

順序が気になるのであればSortしてください。
    • good
    • 1
この回答へのお礼

大変丁寧にお教え頂き、有り難うございました。
無事に解決致しました。

お礼日時:2015/06/20 09:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報