Collatz 予想の無限リスト使うやつ

http://ll.jus.or.jp/2006/blog/doukaku2

無限リストは,それより若い位置の要素を使って求めるもんだと思ってたけど
そうでもないのか.それ以前に求まっている要素ならどこでもいいのかな.

zipWith' fromMaybe ...

http://www.kmonos.net/wlog/63.html#_1701060713

例えば稲葉さんのコードだと次みたいに求まっていく.
パターンマッチ実装の zipWith じゃなくて head, tail 実装の zipWith' にしてるのはなんでだろ.
後の要素を求める前にパターンマッチしようとしちゃうからなのかな.
確かにzipWithだとスタックオーバーフローで落ちる.どういうことだろん….

# g(n) は g !! (n-1) のつもり.

  • 偶数番目の 要素 g(2n) は g(n) + 1

偶数はそのまんま d2

  • 奇数番目の 要素 g(2n+1) は g(6n+4) + 1

奇数は 6 つ先の要素に1を加えたものと等しい.偶数,奇数と交互に g を作成していくので,3つずつ飛ばしながら作っていく.
m3p1 の偶数番目の要素は fromMaybe によって選ばれないのでそれ以上は計算されないのかな.

idx _ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
(_:_:m3p1) g(1) g(4) g(7) g(10) g(13) g(16) g(19) g(22) g(25) g(28) g(31) g(34) g(37) g(40) g(43) g(46) g(49) ...
d2 _ _ J g(1) N J g( 2) N J g( 3) N J g( 4) N J g( 5) N J g( 6) N J g( 7) N J g( 8) ...
g _ 1 g(1)+1 g(10)+1 g( 2)+1 g(16)+1 g( 3)+1 g(22)+1 g( 4)+1 g(28)+1 g( 5)+1 g(34)+1 g( 6)+1 g(40)+1 g( 7)+1 g(46)+1 g( 8)+1 ...
_ 2 ...
_ 3 ...
_ 4 ...
_ 5 ...
_ 6 ...
_ 7 ...
_ 8 ...
_ 9 10 ...
_ g(22)待ち g(28)待ち g(34)待ち g(40)待ち g(7)待ち g(46) 待ち ...

g(3) が求まるには, g(10) が必要,g(10) には... とまさに今回の問題の回数がそのまま入る.

interleave

http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20060714#p01

酒井さんのコードだと g の求め方が interleave (/\/) つかってて 6個飛ばしの辺がわかりやすい.

/\/ の第2引数 の map ... は,g を 9 個捨てたの([g(10), g(11), ...])を初期値にして,
そこから6個とばしの無限リストの無限リストになって ([[g(10),...], [g(16),...], [g(22)...],...] ←イメージ),
map head する([g(10), g(16), g(22), ...].

idx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
g /\/ - g(1)+1 g( 2)+1 g( 3)+1 g( 4)+1 g( 5)+1 g( 6)+1 g( 7)+1 g( 8)+1 ...
/\/ map ... - g(10)+1 g(16)+1 g(22)+1 g(28)+1 g(34)+1 g(40)+1 g(46)+1 ...
g 1 g(1)+1 g(10)+1 g( 2)+1 g(16)+1 g( 3)+1 g(22)+1 g( 4)+1 g(28)+1 g( 5)+1 g(34)+1 g( 6)+1 g(40)+1 g( 7)+1 g(46)+1 g( 8)+1 ...

あとは同じ.

こんなん思いつかんがな….絵かいてやっとわかったがな….