プロが教えるわが家の防犯対策術!

mathematicaで、「ある多重和を計算することに関する記述の方法などについて」、質問します。
(多少長くなります。ご容赦ください。)

多重和を計算するとき、例えば、
Sum[i*j, {i, 1, 2}, {j, 1, 3}]
と入力すれば、これは、
(i,j)=(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)のそれぞれに対して、i*jを計算し、それらの和をとった結果が返されると思います。

それに関連して、今回は、あるリスト ls に対する関数で、
f[ls_]:=Sum[ lsに依存する何らかの式 , {ls[[1]], 1, a}, {ls[[2]], 1, b},………, {lsの最後の成分, 1, c}]
のようなものを構成したいと考えています。
(ただし、ここでのa,b,cはある自然数を表すものであるとします。)
(上に書いた例で書くと、f[{i,j}]=Sum[i*j, {i, 1, 2}, {j, 1, 3}]のようになります。)

ここで質問があります。
(質問) lsの長さが一定であれば、特に苦労なく、直接上の「, {ls[[1]], 1, a}, {ls[[2]], 1, b},………, {lsの最後の成分, 1, c}」の部分に、i,jのような変数(すなわち、lsの各要素を変数としたもの)と、それらの変数が動く範囲を指定すれば、f[ls_]を具体的に構成できると思います。しかしながら、 lsの長さが一定でないときには、どのようにしたらよいのかがよくわかりません。
もしもその構成方法をわかられる方がおられれば、教えていただけると大変ありがたく思います。

A 回答 (1件)

リストに記号を保持する、というアプローチが余計に問題を難しくしている気がしますが、


とりあえず下記のように再帰を使うことで解決できます。

f[exp_, {x_}, {a_}] := Sum[exp, {x, 1, a}]
f[exp_, {x_, y__}, {a_, b__}] := Sum[f[exp, {y}, {b}], {x, 1, a}]

以下のように使います。
f[u*v*w, {u, v, w}, {2, 3, 4}]
→ 180
直接Sumの中に書くと下記の例に対応します。
Sum[i j k, {i, 1, 2}, {j, 1, 3}, {k, 1, 4}]
→ 180
    • good
    • 0
この回答へのお礼

お教えいただき有り難うございます。
お陰様で上手くいきました。

とても勉強になりました。

お礼日時:2017/03/15 17:23

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