読者です 読者をやめる 読者になる 読者になる

私が歌川です

@utgwkk が書いている

ウラムの螺旋を作るスクリプト

技術

数学ガールの秘密ノート/整数で遊ぼう

数学ガールの秘密ノート/整数で遊ぼう

先日、「数学ガールの秘密ノート/整数で遊ぼう」を購入、読了しました。
素数やら数学的帰納法やら2進法の話やら、整数好きにはたまらない構成となっていました。
センター試験を解くこともできるので受験生諸君もぜひぜひ。
上のリンクはアフィリエイトではありません、念のため。

で、本題

書籍の中に「ウラムの螺旋」についての話題がありました。(画像付きで)
何これつよすぎる、これを作ろうじゃありませんか。というわけで書きました。


Generate "Ulam spiral (prime spiral)"

このスクリプトを動かすには、Python Imaging Library が必要です。

大雑把な解説

自然数を渦状に書き連ね、素数に印をつけたときに現れるのがウラムの螺旋です。
これを作るのが大変でした。

Max=5のときを用いて説明します。
配列ulamは2次元配列です。ここに、渦状になった自然数を格納していきます。
つまり、

17 16 15 14 13
18  5  4  3 12
19  6  1  2 11
20  7  8  9 10
21 22 23 24 25

こういった配列が欲しいわけです。
なので、まず作りやすそうな、

17 16 15 14 13
    5  4  3
       1
    7  8  9
21 22 23 24 25

だけを作ります。
これを作るのが、

f1 = lambda x,y: sorted(range(x-(y-1)*2+1-y, x-(y-1)*2+1),reverse=True)

for i in range(Max/2+1):
  ulam.append(f1((Max-2*i)**2,Max-2*i))

for i in range(1,Max/2+1):
  ulam.append(range((i*2+1)**2-i*2,(i*2+1)**2+1))

という部分です。

今度は、足りない部分、すなわち、

18          12
19  6     2 11
20          10

の部分を補います。
これに当たるのが、

for i in range(1,len(ulam)-1):
  m = i if i < Max/2+1 else Max - i - 1
  for j in range(m):
    ulam[i].insert(j,ulam[i-1][j]+1)
  ulam[i] += reversed([ulam[i-1][Max-1-x]-1 for x in range(m)])

この部分です。
あとは素数判定をしてから、ごりごり画像に出力しているだけです。

どんな感じ

Max=333、pix=3 のとき、

f:id:utagawakiki:20140119200520p:plain

このような画像が出力されます。
見て楽しむもよし、スマホの待ち受け画像にするもよし、恋文として送るもよし。