連載
» 2014年11月11日 10時15分 UPDATE

無償ソフトで技術計算しよう【プログラミング応用編】(2):コンピュータ「オイラと数学しよう」 ――オイラープロジェクトの問題にチャレンジ(その1) (1/2)

「プログラミング応用編」では、プログラミングコンテストの問題などをFreeMatでプログラム作成していく。今回は「オイラープロジェクト」の問題を解こう。

[伊藤孝宏,MONOist]

 前回は、「MATLABにはなく、FreeMatにはない」関数を作ってみました。今回は、「オイラープロジェクト」の問題を例に、FreeMatのプログラミングについて学習していきます。

筆者注:FreeMatはコマンド入力後にエンターキーを押すとコマンドを実行します。本連載ではエンターキーの記述を省略しますが、操作の際にはコマンド入力後にエンターキーが必要です。



 オイラープロジェクトとは、与えられた数学の問題をコンピュータとの2人3脚で解く、要は数学問題集です。答えが合っているかどうかを問うので、プログラミング言語は何でも問題ありません。極端な話、別にコンピュータを使わなくても、紙と鉛筆で答えを求めてもよいのです。

 オイラープロジェクトのWebサイトに登録後、問題を選んで解答欄に入力して正解すると“正解者”として登録されます。Webサイトの右上「Problems」をクリックすれば、登録しなくても問題が見られます。問題は英文ですが、日本語で解説したサイトもあります。

 簡単な問題から想像を絶するほど難しい問題までさまざまですが、今回はこのうち簡単な問題をFreeMatで解いていきます。

参考リンク

問題1

1.Problem 1  Multiples of 3 and 5

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

 意味は、「10未満の自然数のうち、3または5の倍数となっているのは、3,5,6,9であり、これらの合計は23である。1000未満の3または5の倍数の合計を求めなさい」。

 1000未満の自然数なので、1〜999の整数のなかで、3の倍数の和と5の倍数の和を求めます。このうち、15の倍数は重複するので、15の倍数の和を引きます。

 FreeMatでは、以下のように3:3:999で3から999までの3の倍数を生成し、sum()で和を求めています。

--> sum(3:3:999)+sum(5:5:999)-sum(15:15:999)
ans = 233168

 これは“サービス問題”ですね。なお、問題の構成として、例を示してから問題を出すようになっています。プログラムを作成したら、例で試してみることをお勧めします。

問題2

2.Problem 2  Even Fibonacci numbers

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

 意味は、「フィボナッチ数列は前2項の和を求めていくことで得られます。1と2から始めると10項目までは、1, 2, 3, 5, 8, 13, 21, 34, 55, 89となります。フィボナッチ数が400万未満のフィボナッチ数列の偶数の項の和を求めなさい」。

 例では100未満のフィボナッチ数列となり、偶数の項の和は、2+5+13+34+89=143となります。ex325.mにFreeMatでのプログラムを示します。n未満のフィボナッチ数列は、while(a(k-1)<n)として、a(k)=a(k-2)+a(k-1)で生成します。偶数の項の和なので、sum(a(2:2:k-1))とします。

function p2=ex325(n)
    a(1)=1;a(2)=2;
    k=3;
    while(a(k-1)<n)
        a(k)=a(k-2)+a(k-1);
        k=k+1;
    end
    p2=sum(a(2:2:k-1));
ex325.m

>>「ex325.m」ダウンロード

 例で確認してみると、下記のように正しく求められていることが分かります。

--> ex325(100)
ans = 143

 本番の問題を解いてみると、下記のようになります。

--> ex325(4e6)
ans = 5702886
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.