数学ガールの秘密ノート/整数で遊ぼう (数学ガールの秘密ノートシリーズ)
- 作者:結城 浩
- 発売日: 2013/12/18
- メディア: 単行本
先日、「数学ガールの秘密ノート/整数で遊ぼう」を購入、読了しました。
素数やら数学的帰納法やら2進法の話やら、整数好きにはたまらない構成となっていました。
センター試験を解くこともできるので受験生諸君もぜひぜひ。
上のリンクはアフィリエイトではありません、念のため。
で、本題
書籍の中に「ウラムの螺旋」についての話題がありました。(画像付きで)
何これつよすぎる、これを作ろうじゃありませんか。というわけで書きました。
大雑把な解説
自然数を渦状に書き連ね、素数に印をつけたときに現れるのがウラムの螺旋です。
これを作るのが大変でした。
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)])
この部分です。
あとは素数判定をしてから、ごりごり画像に出力しているだけです。