Collatzの問題

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
}

と書くことができます。