min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

ウラムの螺旋(素数螺旋)を描いて、素数番目の素数は青色に光らせる

できた

ウラムの螺旋(素数螺旋)

全て素数の点なんだけど、1から数えて素数番目にある点には青色をつけた

この正方形のサイズ(size)は引数で指定できるようにした

 

$ bash myKINRImath19Makegif.sh ウラムの螺旋のサイズ

$ bash myKINRImath19Makegif.sh 200

 

$ vim myKINRImath19Makegif.sh

youtu.be

 

$ vim myKINRImath19ulam3Arg.py

#@ import numpy as np
#@ import matplotlib.pyplot as plt

import pandas as pd
import pandas_datareader as web

import matplotlib.pyplot as plt
# %matplotlib inline
import matplotlib.font_manager as fm
# plt.rcParams['font.family']='Droid Sans Japanese'
import japanize_matplotlib

from matplotlib import rcParams
rcParams['figure.figsize']=15,10
rcParams['font.size']=15
import sys
import os
import math

#import cv2
#from PIL import Image, ImageFont, ImageDraw
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import numpy as np

import subprocess

#from sympy import Symbol, Derivative, sympify, pprint, pretty
#from sympy import Symbol, Derivative, sympify, pprint, pretty, solve
from sympy import Symbol, Derivative, sympify, pprint, pretty, solve, diff, symbols
from sympy.core.sympify import SympifyError
# ChatGPT from sympy import sympify, Symbol

import datetime
from datetime import datetime as dt
# import sys
# import os
# import numpy as np
# import matplotlib.pyplot as plt

import subprocess
# cdしないとcronで/rootに溜まっちゃう!
# スクリプトディレクトリを取得
script_directory = os.path.dirname(os.path.abspath(__file__))

# スクリプトディレクトリにカレントディレクトリを変更
os.chdir(script_directory)
#os.chdir('/media/WD30EZRX/PT3/')

# 現在の日時を取得
#execution_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
myTIMEE = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
myARG0 = os.path.basename(__file__)

if len(sys.argv) <= 1:
        print(f"書式エラー")
        print(f"書式: python {sys.argv[0]} \'ウラムの螺旋のサイズ\'")
        print(f"書式: python {sys.argv[0]} \'201\'")
        print(f"書式: python {sys.argv[0]} \'501\'")
        sys.exit()

print(f"引数: {sys.argv[1]}")
#print(sys.argv[1])

myARG1 = sys.argv[1]

print('----------------------------')
print('ウラムの螺旋を描くプログラム')
print('----------------------------')
print('見つかった素数が、1から数えて素数番目(1,2,3,5...番目)のときは青色にする')
print('----------------------------')
print('素数が描く美しい螺旋~数学の難問')
print('https://www.youtube.com/watch?v=0WkY1p9uPgU&t=319s')

# 素数判定関数
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(np.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

# ウラムの螺旋を描く関数
def ulam_spiral(size):
    spiral = np.zeros*1
                    #ulam2 #@ 素数ならTrue, それ以外はFalse
                    #ulam2 primes.append(is_prime(num))  
                    coords.append*2
                    if is_prime(num):
                        prime_count += 1  # 素数のカウントを増やす
                        # カウントされた素数の順位が素数かチェック
                        if is_prime(prime_count):
                            #colors.append('red')  # 素数番目の素数なら赤色
                            #colors.append('yellow')  # 素数番目の素数なら黄色
                            colors.append('blue')  # 素数番目の素数ならblue
                        else:
                            #colors.append('blue')  # 通常の素数は青
                            colors.append('lightcyan')  # 通常の素数はライトシアン
                    else:
                        # colors.append('lightgray')  # 非素数はグレー
                        colors.append('darkslategray')  # 非素数はグレー
                # 次の位置に移動
                if direction == 0:
                    x += 1  # 右
                elif direction == 1:
                    y -= 1  # 上
                elif direction == 2:
                    x -= 1  # 左
                elif direction == 3:
                    y += 1  # 下
                num += 1
            direction = (direction + 1) % 4
        step += 1
    #@ return spiral
    #ulam2 return coords, primes
    return coords, colors

# サイズ指定
# size = 201  # 螺旋のグリッドサイズ
size = int(myARG1)
#@ spiral_data = ulam_spiral(size)
#ulam2 coords, primes = ulam_spiral(size)
coords, colors = ulam_spiral(size)

#@ 座標をxとyに分割
x_coords, y_coords = zip(*coords)

# 描画
plt.figure(figsize=(10, 10))

kawacom = ''
#kawacom = f'{datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} ({myARG0})'
#kawacom = f'ウラムの螺旋 size={size}\n {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} ({myARG0})'

# kawacom = f'ウラムの螺旋 size={size}\n {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} ({myARG0})\n 赤色は 素数番目 の素数'
kawacom = f'ウラムの螺旋(素数螺旋)size={size}\n {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} ({myARG0})\n 青色は 素数番目  の素数'


#plt.figtext(0.02, 0.01, kawacom, ha="center", fontsize=10)
#plt.figtext(0.5, 0.01, kawacom, ha="center", fontsize=10)
plt.figtext(0.5, 0.07, kawacom, ha="center", fontsize=10)

#@ plt.imshow(spiral_data, cmap='binary', interpolation='none')

#@ 素数でない数をグレーのドットとしてプロット
#plt.scatter(x_coords, y_coords, c=['lightgray' if not p else 'blue' for p in primes], s=10, marker='o')
#ulam2 plt.scatter(x_coords, y_coords, c=['lightgray' if not p else 'blue' for p in primes], s=10, marker='o')
#plt.scatter(x_coords, y_coords, c=colors, s=10, marker='o')
plt.scatter(x_coords, y_coords, c=colors, s=10)

plt.axis('equal')
plt.axis('off')  # 軸を非表示にする

# plt.savefig("ulam_spiral_primes_only.png", dpi=300, bbox_inches='tight')  # PNG画像として保存
myPNG='myKINRImath19ulam3.png'
# plt.savefig("ulam_spiral_primes_only.png", dpi=300, bbox_inches='tight')  # PNG画像として保存
#plt.savefig("myKINRImath19ulam.png", dpi=300, bbox_inches='tight')  # PNG画像として保存
plt.savefig(myPNG, dpi=300, bbox_inches='tight')  # PNG画像として保存
#plt.show()

print(myPNG + ' を保存しました')
#print('(yの座標軸を画面中央に表示した版)')
print('-------------------------------')
print('http://192.168.3.11:5000/PT3/doLSglob.php?CHDIR=PT3&GREPWORD=myKINRI&MKSORT=goMKSORT')

 

 

 

 

1,000万円を超えたbitcoinを少しだけどもらえるURL

https://bitflyer.com/invitation?id=l50e5ljw&lang=ja-JP

ハピタスからポイントもらえるURL

その買うを、もっとハッピーに。|ハピタス

 

*1:size, size), dtype=int)
    x, y = size // 2, size // 2  # 中心
    num = 1
    step = 1
    direction = 0  # 0:右, 1:上, 2:左, 3:下

    #@ 座標と素数判定の結果を保存するリスト
    coords =
    #primes =
    colors = []
    print('見つかった素数のカウント')
    prime_count = 0

    while x < size and y < size:
        for _ in range(2):  # 同じ距離で2回ループ
            for _ in range(step):
                if 0 <= x < size and 0 <= y < size:
                    # if is_prime(num):
                    #     spiral[y, x] = 1  # 素数の位置を1に
                    #ulam2 coords.append((x, y

*2:x, y