對于計算機領域的人來說,素數總是一個很熱門的話題。生成素數在密碼學和計算機網絡中扮演重要的角色。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位的素數。
上一篇python 生成慈云
下一篇python 生成小數點