このレポートでは、コラッツ問題が任意の整数nがn=150の時まで成り立つか調べ、その時のnと試行回数iの関係をグラフで表す。
このレポートでの目的は、数学の未解決問題の一つであるコラッツ問題において、nが1から150まで成り立つかを調べ、それをグラフで表すことで規則性を見つけたい。
結果、n=150まで成り立つ。しかしn=150まででは規則性は見当たらなかった。
コラッツ問題とは、1937年にローター・コラッツが問題を提示したもので、コラッツ予想ともいわれる。数学の未解決問題の一つ。
コラッツ問題の内容は
「任意の正の整数nを取り
・nが偶数の場合、nを2で割る
・nが奇数の場合、nに3かけて1を足す
という操作を繰り返すと、有限回の捜査のうちに必ず1になる」
というものである。
以下、使用する数はコラッツ問題の特性上、正の整数とする。
プログラムの発想としては、コラッツ問題はnが1になるまで場合分けをしたうえで繰り返しの操作をするものなので、「if」で場合分けをし、それらを「repeat」の中に入れることで繰り返しの操作をさせた。以下具体的なコマンドの説明に入る。
1行目では、2行目から14行目までで入力する関数をCollatzとおいた。ここでの変数はaとしている。
2行目では、i=0と定めている。
3行目では、4行目から10行目までの間で、「if」によって定まるある条件を満たすとき、その関数を繰り返す「repeat」という関数を定めている。
4行目では、1行目で定めた変数aが1以下の時、5行目の「break」によって繰り返しの作業を終了させる。
6,7行目ではaが2で割ると1余るとき、aを3倍して1足すという操作をする。
8行目ではaが2で割れるとき、aを2で割るという操作をする。
9行目では「repeat」によって4から8行目が繰り返されるごとに、iに1を足すという操作をする。
11行目でiを表示させる。つまり何回「repeat」によってこの操作が繰り返されたのかを表示させる。
12,13行目ではa,iの操作後の値を表示させる。しかしこの場合、シャープをつけることで表示しないようにしている。なぜ消しているのかというと、図を作成する際にaの値を150個とっているので、それを表示させると見づらくなるためである。
Collatz<-function(a){
i<-0
repeat{
if(a<=1){
break
}else if(a %% 2==1){
a<- a*3+1
}else if(a %% 2==0){a <- a/2}
i<-i+1
}
i
#print(a)
#print(i)
}
ここから図のプログラムの説明に入る。
1行目ではnを1から150までの数列としている。
2行目では「sapply」によって、nの各成分を上のプログラムで定めた「Collatz」に適用させ、それによって得られる数列をzとしている。
3行目ではx軸にn、y軸にzを定めて図を表示している。
n<-1:150
z<-sapply(n,Collatz)
plot(n,z)
結果として上のグラフが得られた。
このことから、1から150まではコラッツ問題が成り立つことが分かった。しかし操作の試行回数iは任意の正の整数nに対して規則性が見当たらなかった。
よってコラッツ問題は、任意の正の整数nが1から150の間では成り立つが規則性見当たらない。
謝辞
この数値計算の基礎1の授業、また本レポートの作成において、宮部教授の熱心なご指導と適切な助言を頂き心より感謝いたします。ありがとうございました。
参考文献