基於 Python3.8
舍友的作業要手撕 RSA,雖然我 RSA 一點都不會但是生成1024位的素數還是挺好玩的。就簡單實現了一下
其實就是暴力枚舉,生成一個1024位的整數,然后判斷是否為素數,不是的話就加一,如此往復...
素數的密度大致與 \(\ln n\) 成反比,也就是說,隨機一個 n bit 的正整數,如果不是素數,則往后取 n 個數字,大概率會碰到一個素數
判斷是否位素數可以用 MillerRabin,然后利用 Python 的高精度寫起來會很舒服
最后生成100個1024位的素數用時 132.7102403s。平均每個 1.3 秒,可以接受
################################
# Withinlover
# 2020.11.2
# 大質數生成
################################
from random import randint
import time
def miller_rabin(p):
if p == 1: return False
if p == 2: return True
if p % 2 == 0: return False
m, k, = p - 1, 0
while m % 2 == 0:
m, k = m // 2, k + 1
a = randint(2, p - 1)
x = pow(a, m, p)
if x == 1 or x == p - 1: return True
while k > 1:
x = pow(x, 2, p)
if x == 1: return False
if x == p - 1: return True
k = k - 1
return False
def is_prime(p, r = 40):
for i in range(r):
if miller_rabin(p) == False:
return False
return True
if __name__ == '__main__':
T = time.perf_counter()
for _ in range(100):
index = 1024
print(index, "位質數: ", end="")
num = 0
for i in range(index):
num = num * 2 + randint(0, 1)
while is_prime(num) == False:
num = num + 1
print(num)
print("----------------------------")
print("用時:", time.perf_counter() - T)
