春休み自由研究 コラッツ予想
-
Upload
akira-yamaguchi -
Category
Science
-
view
513 -
download
0
Transcript of 春休み自由研究 コラッツ予想
コラッツ予想とは…任意の正の整数(1以上) n について、
● n が偶数なら n / 2● n が奇数なら 3n + 1
この操作を繰り返し適用すると、どんなnについてもきっと1になる!
● 7 → 22 → 11 → 34 → 17 → 52 → 26 → 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
プログラマーの視点で遊ぶ
● 数を2進数で見る。○ 7 = 111(2)○ 6 = 110(2)
● 先頭ビットが0なら右シフト○ 110 → 11
● 先頭ビットが1なら
○ 101
1010 左シフト (2n)
1111 元の値と加算 (2n + n)10000 1を足す
● つまり、単純なビット判定・ビットシフト・加算だけで表現できる!
数をビット配列で見る
プログラミング的都合から、桁の数え方を逆にします。
10 = [0,1,0,1] = 0101 左が低位ビット、上が高位ビット
5 = 1016 = 0117 = 1118 = 00011234567890 = 0100101101000000011010011001001
などなど
7が処理される様子
[ 0] 111[ 1] 01101[ 2] 1101[ 3] 010001[ 4] 10001[ 5] 001011[ 6] 01011[ 7] 1011[ 8] 000101[ 9] 00101[10] 0101[11] 101[12] 00001[13] 0001[14] 001[15] 01[16] 1
3n+1の伸びかた
基本的には3nなので、1ステップでlog23 ≒1.58桁くらい増える
01101000000011010011001001
010110100000001101001100100110101101000000011010011001001
D言語くん救出計画
● 桁が増える方向には上限がある。(約1.58桁)● 下からの桁の削除は、0が連続していれば何桁でも削られてしまう。
● だが、もし神のようなビット列があって、下に1を多く出現させることができたら?
111111111100000000000000000001神
ビット列でプログラミングする
使えそうなメンバーを紹介するぜ!
● 111000111000……といったビット列は、3n+1の2ステップで1の連続になる○ 11100011100○ 011100011101○ 10101010101○ 1111111111111○ ※ +1は遥か下のビットと見なして無視しています。
● 1111……というビット列は、前のビットを高位ビットにワープさせる○ 1 + 1111…..11○ 0000000 ... 001
アルゴリズム妄想
● 11100011100 … といったビット列を用意する。
● の直前で111111111000000...0001といったビット列に変化させる。
● が111...111を喰っている間に、ワープ先で新たに111000111000...を用意
する。
周期的にこんなビット列が作れるよう
プログラミングできれば、
D言語くん救出成功!
3n+1で、初期値の情報が保存されない
● 加算(XORと桁上げ)は情報を壊す作用があるみたい……。
● 3nでは、実はビット数が増えるパターンは孤立した”1”のみ。○ 1 → 11○ 11 → 1001○ 111 → 10101○ 1111 → 101101○ 11111 → 1011101○ つまり、n個の1の連続は、10 (1がn-2個) 01になる。1が増えず、歯抜けになっていく。
● 3nが作るビットパターンはランダムに近い○ 無理数を計算する過程そのものだから?
○ 実測したところ、3n+1の1ステップで平均2桁ずつ削られる。
○ 伸びるほうは約1.6桁ずつなので、いずれ桁が全て喰われてしまう。