タイトル : 素数の分布1
更新日 : 2022-08-03
カテゴリ : AI、IA、数理
タグ :
素数の分布
この時、素数を赤、素数でありオイラーの素数生成式の値を青、素数でなくオイラーの素数生成式の時を黄色、素数でなくオイラーの素数生成式でもない時を白で塗りつぶす。
分布をもっと広く表示
nを大きくするとわかるが、オイラーの素数生成式(n**2 + n +41)は素数をちゃんと生成出来るわけではないが(黄色がある)、素数の一部の分布に規則性があるように感じさせてくれる(素数にあらゆる規則性はないけど)。
表示プログラム
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()