1937年にドイツの数学者Collatz(コラッツ)が,「ある数が偶数なら2で割り,奇数なら3倍して1を足す。これを繰り返すとすべての数は1になるだろう」と予想しましたが,だれもそれを証明することができていません。
Rのプログラムで調べてみましょう。
collatz = function(n) {
cat(n)
while (n > 1) {
if (n %% 2 == 0) {
n = n / 2
} else {
n = 3 * n + 1
}
cat(" →", n)
}
cat("\n")
}
ここで n %% 2
はnを2で割った余りです。
例えば collatz(3)
と打つと次のように出ます。
3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
いろいろな数から出発して,Collatzの予想が正しいかどうか確かめてください。
ところで,Rではもうちょっと簡単に書くこともできます。例えば
collatz = function(n) {
cat(n)
while (n > 1) {
n = ifelse(n %% 2 == 0, n / 2, 3 * n + 1)
cat(" →", n)
}
cat("\n")
}
あるいは
collatz = function(n) {
a = n
while (n > 1) {
n = ifelse(n %% 2 == 0, n / 2, 3 * n + 1)
a = c(a, n)
}
a
}
と書くことができます。