---
# System prepended metadata

title: Untitled

---

```
#生成質數npy檔 v0.5 #Python #更新時間: 2022.11.2
#Generate prime number strings
#生成所有不大於t 的質數，用來質因數分解 t^2 內的數。for t > 10^12
'''
prime10^10 1 1.1.txt 檔案大小是 495mb
prime10^10 8.2 8.3.txt 檔案大小是 455mb
prime10^11 7.11 7.12.txt 檔案大小是 454mb

If t <= 10^8: use eratosthenes(t). 
else: use gmpy2.is_prime(t).

質數列表 https://bit.ly/3TsOtce
質數計算函數 https://bit.ly/3gxCbkh
https://en.wikipedia.org/wiki/Probable_primed

速度
i%3 and i%5 and i%7 and gmpy2.is_prime(i) >
i%3 and i%5 and gmpy2.is_prime(i) >
gmpy2.is_prime(i) >
i%3 and i%5 and i%7 and i%11 and gmpy2.is_prime(i)
'''
import gmpy2, time, pygame
pygame.mixer.init()
soundObj = pygame.mixer.Sound('Se11.wav')

#方法1.6: 使用np.save存檔 for t >= 10^12
def P(u1,s1):
    t = 10**u1 #u1 = 11
    #s1 = 8.76 #起始值
    u2 = u1-9
    b1 = 10**u2
    b2, b3 = b1*10, 1/b1
    s2 = t//b1 # 10**(u1-2)
    s3 = round(s1*b1)
    t1 = s2*s3+1
    for i1 in range(s3,b2):
        start = time.process_time()
        x1 = np.array([i for i in range(t1,t1+s2,2)
              if i%3 and i%5 and i%7 and gmpy2.is_prime(i)])
        s1 += b3
        t1 += s2
        end = time.process_time()

        fn2 = f'10^{u1} {s1-b3:.{u2}f} {s1:.{u2}f}'
        j2 = len(x1)
        print(f'{fn2} 費時{end-start:.2f}秒, {j2}個質數', time.ctime())

        fn3 = f'p{fn2}.npy'
        np.save(fn3, x1)
        soundObj.play() #當i1+=1時，播放聲音，提醒自己進入下一階段
#- -

#方法1.5: 使用gmpy2.is_prime找出質數 for t >= 10^11
def P(u1,s1):
    #gc.collect()
    t = 10**u1 #u1 = 11
    #s1 = 8.76 #起始值
    b1 = 10**(u1-9)
    b2, b3 = b1*10, 1/b1
    s2 = t//b1 # 10**(u1-2)
    s3 = round(s1*b1)
    t1 = s2*s3+1
    for i1 in range(s3,b2):
        start = time.process_time()
        x1 = [i for i in range(t1,t1+s2,2)
              if i%3 and i%5 and i%7 and gmpy2.is_prime(i)]
        s1 += b3
        t1 += s2
        end = time.process_time()

        fn2 = f'10^{u1} {s1-b3:.2f} {s1:.2f}'
        fn1 = f'prime{fn2}.txt'
        j2 = len(x1)
        print(f'{fn2} 費時{end-start:.2f}秒, {j2}個質數', time.ctime())

        xs = sd(x1) #刪除 str(x1) 內的 '[', ']', ',' 檔案大小可減少10%
        with open(fn1, 'w') as fn: fn.write(xs) #儲存字串xs
        #del i #刪除變數
        #gc.collect() #回收機制
        soundObj.play() #當i1+=1時，播放聲音，提醒自己進入下一階段
if __name__ == '__main__':
    P(11,8.63)
#- -

def sd(x1): #input 為 質數list
    xs = str(x1) #刪除 str(x1) 內的 '[', ']', ',' 檔案大小可減少10%
    xs = xs.replace("[", "")
    xs = xs.replace("]", "")
    xs = xs.replace(",", "")
    return xs

#方法1.4: 使用gmpy2.is_prime找出質數 for t > 10^11
if __name__ == '__main__':
    #gc.collect()
    u1 = 11
    t = 10**u1
    s1 = 1 #起始值 (出現 MemoryError)
    s2 = t//100 # 10**(u1-2)
    s3 = round(s1*100)-100
    t1 = t+s2*s3 + 1
    t2 = t1+s2-2
    for i1 in range(s3,1000):
        x1 = []
        j2 = 0
        start = time.process_time()
        for i in range(t1,t2,2):
             if i % 3 and gmpy2.is_prime(i):
                  x1.append(i)
                  j2 += 1 #計算質數的數量
        s1 += 0.01
        t1 += s2
        t2 += s2
        end = time.process_time()

        fn2 = f'10^{u1} {s1-0.01:.2f} {s1:.2f}'
        fn1 = f'prime{fn2}.txt'
        print(f'{fn2} 費時{end-start:.2f}秒, {j2}個質數',time.ctime())

        xs = sd(x1) #刪除 str(x1) 內的 '[', ']', ',' 檔案大小可減少10%
        with open(fn1, 'w') as fn: fn.write(xs) #儲存字串xs
        #del i #刪除變數
        #gc.collect() #回收機制
        soundObj.play() #當i1+=1時，播放聲音，提醒自己進入下一階段
```