ジグソーパズルで素数を生成する
第54回冬のプログラミングシンポジウムにて中野先生が発表された「ジグソーパズルによる関数型プログラミング」がとても面白かったです。講演中ではジグソーパズルを置いていくことで3進法表記の数を2進法表記に変換したり、n進表現をグレイコードに変換したり、と「計算」がジグソーパズルできることを示していました。(TODO:論文が掲載されたらリンクを張る)
講演中の「3進法から2進法への変換」を早速実装してみたのがこちら。 https://github.com/nishio/jigsaw_model/blob/master/ex1.py
横方向の情報の流れを「左から右」に変更したので、結果の2進法表記は論文とは逆順です。
start: ['2', '0', '1'] ['0', '0', '0', '0', '0'] finished: ['0', '0', '0'] ['1', '1', '0', '0', '1']
で、僕は講演を聞いていて「これって45度傾ければ1次元セルオートマトンになるんじゃない?」と思ったので帰りの登山電車で考えていたのですが、結論から言うとN状態の1次元セルオートマトンの遷移規則は N**3 + N**2 + 4*N のピースがあれば十分シミュレートできます。あと、初期状態の長さをMとして、M * (M + 1) / 2 のピースがあれば任意の初期状態をセットアップするのに十分です。というわけで2状態で初期状態の長さが1のルール90の挙動は21種類のピースでシミュレートできます。
実行して1ピース1文字で、いくつかのピースを*、他をスペースで表現したものがこちら。キャスケットの模様が浮かび上がっています。上端・左端はまっすぐで、つながるようにピースを並べていくと模様が浮かび上がってくる、と。ジグソーパズルっぽさが上がって来ましたねw
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
さて、セルオートマトンが実現できるなら、素数が計算できるわけなので(see 素数を計算するオートマトンを実装してみた)、せっかくだからそこまで実装してみましょう。
https://github.com/nishio/jigsaw_model/blob/master/ex4.py
出力はこうなります:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . . . . . . . . . . . . . . . . . . . . . . . . | . . . . . . . . . . . . . . . . . . . . . | . . | . . . . . . . . . . . . . . . . . . . | | . . . . . . . . . . . . . . . . . . . . | . . . . . . . . . . . . . . . . . . . . . | | | . . . . . . . . . . . . . . . . | . . . | . . . . . . . . . . . . . . . . . . | | | | . . . . . . . . . . . . . . . . . . | . . . | . | . . . . . . . . . . . . . . . . . | | | | | . . . . . . . . . . . . . . | . . . | . . . . . . . . . . . . . . . . . . | | | | | | . . . . . . . . . . . . . | . . . | . . | . . | . . . . . . . . . . . . . . | | | | | | | . . . . . . . . . . . . . | . . . | . . | . | . . . . . . . . . | | | | | | | | . . . . . . . . . . . . . | . . . | . . | . . . . . . . . . . . . | | | | | | | | | . . . . . . . . . | . . . | . . | . . | | . . . . . . . . . | | | | | | | | | | . . . . . | . . . | . . | . . | . | . . . . . . | | | | | | | | | | | . . . . . . . . . . | . . . | . . | . . | . | | . . . . . . . . . | | | | | | | | | | | | . . . . . . . | . . . | . . | . . | . | | . | . . . . . . | | | | | | | | | | | | | . . . . | . . . | . . | . . | . | | . | . . . . . . . | | | | | | | | | | | | | | . | . . . . . . | . . . | . . | . . | . | | . . | . . | . . . . . | | | | | | | | | | | | | | | . . . | . . . | . . | . . | . | | . . | . . . | . . . . . | | | | | | | | | | | | | | | | . . . . . | . . . | . . | . . | . | | . . | | | | . . . | | | | | | | | | | | | | | | | | . . . . . . | . . . | . . | . . | . | | . . | | . . . . | | | | | | | | | | | | | | | | | | . . | . | . . . | . . | . . | . | | . . | | . | . . | . . . | | | | | | | | | | | | | | | | | | | | . | . | . . . | . . | . . | . | | . . | | . | . | . . . | | | | | | | | | | | | | | | | | | | | | . | . . . | . . | . . | . | | . . | | . | . . . . . . | | | | | | | | | | | | | | | | | | | | | . | . . . | . . | . . | . | | . . | | . | . . | | . | . . | | | | | | | | | | | | | | | | | | | | | | | | . . . | . . | . . | . | | . . | | . | . . | . | . | | | | | | | | | | | | | | | | | | | | | | | | . | . . . | . . | . . | . | | . . | | . | . . | . | . . | | | | | | | | | | | | | | | | | | | | | | | | | . . . | . . | . . | . | | . . | | . | . . | . | | | . . | | | | | | | | | | | | | | | | | | | | | | | | | | . . . | . . | . . | . | | . . | | . | . . | . | | . | . | | | | | | | | | | | | | | | | | | | | | | | | | | | . . . | . . | . . | . | | . . | | . | . . | . | | . |
模様の読み方がわかりにくいかもしれないので解説しておくと、下の2行
. | | | | | | | | | | | | | | | | | | | | | | | | | | | . . . | . . | . . | . | | . . | | . | . . | . | | . |
の「.」があるのは左から何文字目か、を数えると素数列になっています。
2 | | | | | | | | | | | | | | | | | | | | | | | | | | | 3 5 7 |1113 |1719 |23 | |2931 | |37 |4143 |47 | |53 |
広いテーブルにジグソーパズルのピースをきちんと繋がるように並べていくと、素数の縞模様が現れてくるわけです。
ピースの情報はこちら: https://github.com/nishio/jigsaw_model/blob/master/prime_pieces.csv
この素数を計算するオートマトンが16状態で、初期状態の長さが4なので先ほどの計算式から4426種類のピースがあれば十分であることが分かります。