色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

python 生成大素數

錢斌斌2年前9瀏覽0評論

對于計算機領域的人來說,素數總是一個很熱門的話題。生成素數在密碼學和計算機網絡中扮演重要的角色。Python提供了一種簡單的方法來生成大素數。

import random
import math
# 基于費馬小定理的Miller-Rabin素性測試
def miller_rabin(n, k=5):
if n == 2 or n == 3:
return True
if n % 2 == 0:
return False
# 將n-1轉化成(2**r)*d
r = 0
d = n - 1
while d % 2 == 0:
d //= 2
r += 1
# 進行k次測試
for i in range(k):
a = random.randint(2, n-2)
x = pow(a, d, n)
if x == 1 or x == n-1:
continue
for j in range(r-1):
x = pow(x, 2, n)
if x == n-1:
break
else:
return False
return True
# 生成大素數
def generate_large_prime(bits):
while True:
p = random.getrandbits(bits)
if p % 2 == 0:
p += 1
if miller_rabin(p):
return p
# 測試
bits = 1024
p = generate_large_prime(bits)
print(p)

這段代碼使用了Miller-Rabin素性測試的算法,該算法基于費馬小定理。它可以很快地判斷一個數是否為素數。

我們先定義了一個函數miller_rabin(n, k),它用于在k次測試中判斷n是否為素數。如果n是2或3,則直接返回True。如果n是偶數,則直接返回False。接著將n-1轉化成(2**r)*d的形式,d為奇數,r為正整數。然后選取一個2到n-2之間的隨機數a,計算x = a**d mod n。如果x等于1或者n-1,則跳出這次測試。否則,我們用for循環重復r-1次進行下面的操作:把x的平方對n取模,如果x等于n-1,則跳出這個循環。如果for循環完之后沒有跳出,則表明n是合數,直接返回False。如果完成了k次測試都沒有返回False,則表明n可能是素數。

然后我們定義了一個函數generate_large_prime(bits),它用于生成一個二進制位數為bits的素數。它的方法是隨機地生成一個大整數,并判斷它是否是素數。如果是素數則返回,否則重新生成。

最后,我們測試了一下這個函數,生成了一個1024位的素數。