タイトル : 素数の分布1
更新日 : 2022-08-03
カテゴリ : AI、IA、数理
タグ :

素数の分布

以下のように反時計周りで整数を二次元表示する。 分布1

この時、素数を赤、素数でありオイラーの素数生成式の値を青、素数でなくオイラーの素数生成式の時を黄色、素数でなくオイラーの素数生成式でもない時を白で塗りつぶす。

分布をもっと広く表示

nを大きくするとわかるが、オイラーの素数生成式(n**2 + n +41)は素数をちゃんと生成出来るわけではないが(黄色がある)、素数の一部の分布に規則性があるように感じさせてくれる(素数にあらゆる規則性はないけど)。 分布1

表示プログラム

import tkinter
from prime import is_euler_n41, is_prime

# キャンバスの幅と高さ(正方形)
len_canvas = 1000
# セルの1辺の長さ
len_cell = 120
# セルの個数(一次元方向)
cell_num = int(len_canvas / len_cell)

root = tkinter.Tk()
root.title('素数の分布を表示してみよう')
root.geometry(f'{len_canvas}x{len_canvas}')

# Canvasの作成
canvas = tkinter.Canvas(root, bg="white")
# Canvasを配置
canvas.pack(fill=tkinter.BOTH, expand=True)

# 2次元の四角(セル)の情報
cell_info = {}
for i in range((-1)*cell_num, cell_num+1):
    cell_info[i] = {}
    for j in range((-1)*cell_num, cell_num+1):
        cell_info[i][j] = 0

# 2次元での位置
p_i = 0
p_j = 0

# 2次元で次に動く方向
step_i = 0
step_j = -1

# 数値でループ
for v_i in range(1, cell_num*cell_num+1):

    # 2次元セルと一次元の数値情報をマッピングする
    cell_info[p_i][p_j] = v_i

    # 座標からPIXEL位置へ変換
    px = p_i*len_cell + int(len_canvas/2) - len_cell/2
    py = (-1)*p_j*len_cell + int(len_canvas/2) + len_cell/2

    # 塗りつぶす色を決める
    if is_prime(v_i):
        if is_euler_n41(v_i):
            # 素数かつオイラーの素数生成式の値の時
            color_str = 'blue'
        else:
            # 素数の時
            color_str = 'red'
    else:
        if is_euler_n41(v_i):
            # 素数でないかつオイラーの素数生成式の値の時
            color_str = 'yellow'
        else:
            # 素数でない
            color_str = 'white'

    # 四角を書く
    canvas.create_rectangle(
        px - len_cell/2, py - len_cell/2,
        px + len_cell/2, py + len_cell/2, 
        fill=color_str, outline=color_str)

    # セルが大きい時のみ数値を表示する
    if len_cell > 50:
        label = tkinter.Label(root, text=f'{v_i}',)
        label.place(x=px, y=py)

    # 次に動く方向を決める
    if step_j == -1 and cell_info[p_i+1][p_j] == 0:
        step_i = 1
        step_j = 0
    elif step_i == -1 and cell_info[p_i][p_j-1] == 0:
        step_i = 0
        step_j = -1
    elif step_j == 1 and cell_info[p_i-1][p_j] == 0:
        step_i = -1
        step_j = 0
    elif step_i == 1 and cell_info[p_i][p_j+1] == 0:
        step_i = 0
        step_j = 1

    # 次に動く
    p_i += step_i
    p_j += step_j

root.mainloop()