裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

コラッツの問題

2014年11月06日 | ブログラミング

自然数 n に対して,n が奇数なら 3 をかけて 1 を加える。偶数なら 2 で割る。
この処理を繰り返すといずれは 1 になる。

これを,n = 99999999999999999999999999999999999999999999999999 についてやってみよという問題。

ただし,「言語は Object Pascal(Delphi) 。Windows 向けコンソールプログラムで,ソースコードは、50 行以内,かつ,Delphi XE7 または Appmethod に標準搭載されているデータ型,クラス,ライブラリのみを使用」という条件がついている。

でもまあ,そんな条件なんかどうでもよいでしょ。

library(gmp)
n = as.bigz(paste(rep("9", 50), collapse=""))
repeat {
  if (n %% 2 == 1) {
    n = 3 * n + 1
  } else {
    n = n %/% 2
  }
  print(n, initLine=FALSE)
  if (n == 1) break
}

で確かめられるんだから。

注意点は,演算を Big Integer ('bigz')  でやるんだけど,2 で割るときに n %/% 2 としないと,結果が Big Rational ('bigq') になってしまうよというところ。

gmp を使わないでもできるだろう。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 天体と脱出速度 | トップ | コラッツの問題(2) »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事