見出し画像

中学の数学 (8-2) ウラムの螺旋を python で描く

[ サイトマップを見る ]


素数の出現パターン

奇数の出現は規則正しいですね。$${1, 3, 5, 7, 9 \cdots}$$ という具合に一つとびに現れます。

一方,素数の出現の仕方には規則性はないように思えます。

ウラムの螺旋

けれども面白い発見があります。

ウラムは数字を以下のように並べました。

図1. 自然数を並べる

素数だけを表示させると以下のようになります。

図2. 奇数だけ並べる

もっと続けてみましょう。Python で続きを書いてみました。コードは以下のとおりです。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import math

fig = plt.figure()
ax = plt.axes()

x, y = 0, 0

l = 2

def right():
    return (1, 0)

def up():
    return (0, 1)

def left():
    return (-1, 0)

def down():
    return (0, -1)

def is_prime_number(n): 
    l = []
    l.append(1) 
    for i in range(2, math.floor(n/2)+1): 
        if n % i == 0: 
            l.append(i) 
    l.append(n) 
    return(len(l) == 2)

# 素数1を描く
n = 1
if is_prime_number(n):
    r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
    ax.add_patch(r)

# 素数2を描く
x = x + 1
n = 2
if is_prime_number(n):
    r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
    ax.add_patch(r)

# 素数3を描く
y = y + 1
n = 3
if is_prime_number(n):
    r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
    ax.add_patch(r)

n = 4
for l in range(2, 300+1, 2):
    xdiff, ydiff = left()
    for i in range(1, l+1):
        x = x + xdiff
        y = y + ydiff
        if is_prime_number(n):
            r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
            ax.add_patch(r)
        n = n + 1

    xdiff, ydiff = down()
    for i in range(1, l+1):
        x = x + xdiff
        y = y + ydiff
        if is_prime_number(n):
            r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
            ax.add_patch(r)
        n = n + 1
        
    xdiff, ydiff = right()
    for i in range(1, l+2):
        x = x + xdiff
        y = y + ydiff
        if is_prime_number(n):
            r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
            ax.add_patch(r)
        n = n + 1

    xdiff, ydiff = up()
    for i in range(1, l+2):
        x = x + xdiff
        y = y + ydiff
        if is_prime_number(n):
            r = patches.Rectangle(xy=(x, y), width=1, height=1, ec='black', fill=True)
            ax.add_patch(r)
        n = n + 1
        
plt.axis('scaled')
ax.set_aspect('equal')

plt.savefig('sosuu-pattern.png')

実行してみましょう。

図3. 素数を並べてみると

素数が現れるところだけ,塗りつぶしてみました。素数のあらわれかたには規則性がないのかな?と思っていましたが,なんだか,斜め45度の線分がいくつか現れています。

これは気のせいなのか,それともなんらかの規則性があることを示唆しているのか?なんだか面白そうなので,もうすこし考えていきましょう。

関連する書籍

[ サイトマップを見る ]

この記事が気に入ったらサポートをしてみませんか?