Mathematica を好きで使っている人」には2種類いると思う。 数学や算数が得意で Mathematica を使っている人。 そして、数学や算数に興味がないわけじゃないけどすごく苦手で、だからこそ Mathematica を使っている人だ。 ナサケナイことに僕は後者。 僕が書く Mathematica ネタの記事が、算数や数学にちょっとも踏み込まないのは、そのせいである。

そうは言っても、せっかくの Mathematica なのだから、たまにはちょっと算数っぽいこともやってみよう。今日は、ちょっとした数学クイズに Mathematica 7 で挑戦してみる話。さっそく問題。

問題1:50 円玉・100 円玉・500 円玉の3種類の硬貨を使って、600 円を作る方法は何通りあるか?

答えは9通り。500 円玉を1枚に、残りの 100 円を 100 円玉1枚で作るか 50 円玉2枚で作るかの2通り。全部を 100 円玉で作る場合が1通り。100 円玉を5枚使う場合、4枚使う場合、3枚使う場合、2枚使う場合がそれぞれ1通り。100 円玉1枚に 50 円玉を 10 枚使うのが1通り。すべてを 50 円玉にするのが1通り。

このくらいなら、まぁ、順番に数えていくだけでなんとかなる。だが、問題の規模が上がって、次のようになったらどうだろう。

問題2:1 円玉・5 円玉・10 円玉・50 円玉・100 円玉・500 円玉の6種類の硬貨を使って、600 円を作る方法は何通りあるか?

答えは 36363 通り。そらで数え上げるには無理がある。

この問題を見たとき、僕は、手をつける方針がまったく湧かず、もういきなりググった。そこで見つけた、世の中の人たちが解説しているところによると、ちょっとしたスクリプトで数え上げることができるとのこと。それを Mathematica コードにしたら、例えば次のようになる。

m = ConstantArray[0, 600];
Do[
  m[[i]]++;
  For[j = i + 1, j <= 600, j++, m[[j]] += m[[j - i]]]
, {i, {1, 5, 10, 50, 100, 500}}]
m[[600]]

これで、m[[xx]] に、xx 円を作る方法の数が収まるんだそうだ。だが、哀しいかな僕にはちっとも分かんね。いや、もちろん、コードが実現する個々の行が行なっている処理の形の上での意味は分かるのだが、どうしてこの処理で、今回の問題の場合の数の数え上げになるのかが分からない。スミマセン。算数ダメで。ほんとスミマセン。そんな感じ。

...いやいやいやいや。せっかくの Mathematica なんだから、なんかもうちょっとスルッと求める方法あるんじゃないの?と、 Mathematica ヘルプの「整数関数」に載っているのを順に眺めていたら...ありました、 IntegerPartitions 関数。この関数を使うと、この問題は、次の1行で解ける。

IntegerPartitions[600, All, {1, 5, 10, 50, 100, 500}] // Length

この関数は、第1引数で指定した整数を、第3引数で指定した整数で分割したリストを生成してくれる。もう、今回の問題にとって、そのものずばりの関数だ。

あー、やっぱ、Mathematica ってば、僕みたいな算数苦手君の味方だわ。ヘルプの関連項目を芋づるであれこれ辿っていくのに算数力はいらないし、それでもこうして問題の答えにたどり着けるんだもの。

ちなみに、今回の問題の出典は、Project EulerProblem 31。元の問題は、イギリスの硬貨 1p, 2p, 5p, 10p, 20p, 50p, £1, £2 を使って £2 を作るもの)。Project Euler は、大数学者オイラーの名前を冠した数学問題集のサイトで、有志による和訳サイトもある。僕は、これに最近ちょこちょこと挑戦してみてるんだが、さすがに、算数苦手だと考え方すら分からない問題も多い。それでも今回みたいに、Mathematica でスパッと解けたりすると、自分の手柄でもなんでもないのに、なんだかニンマリしてしまうのだ。

この Project Euler については、実例が溜まってきたら、またこのブログで紹介しようと思う。...紹介するつもり...紹介できるといいな。

追記:上記の問題2は、さらに調べたら、FrobeniusSolve 関数を使って次のようにしても求められることが分かった。違いは両方のヘルプをご参照あれ。

FrobeniusSolve[{1, 5, 10, 50, 100, 500}, 600] // Length

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/420
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報