我一直在嘗試在 python 腳本中實現(xiàn)Fermat 測試以生成一個大素數(shù),我希望在大素數(shù)上使用它,并且它可以快速且?guī)缀跬昝赖赜糜?16 位生成,但是如果我將它設(shè)置為 32它根本不運行。對于快速上下文,F(xiàn)ermat 測試應(yīng)該運行 x 次試驗(在我的代碼中設(shè)置為 5 只是為了我可以看看它是否有效,但在使用中我可能會將其設(shè)置為更高的 ~20 或其他)來測試是否數(shù)是否為素數(shù)。因此,我使用 secrets.randbits 生成大量數(shù)字,然后使用 Fermat 測試檢查它們是否是素數(shù),如果不是,我會選擇一個不同的素數(shù)并再次運行直到找到一個。將位設(shè)置為 16,代碼運行速度很快,在發(fā)現(xiàn)它們是復(fù)合的并選擇不同的之前,將許多不同的數(shù)字打印到測試的日志中,但是一旦設(shè)置為 32,就什么都沒有打印,我真的不知道為什么。secrets.randbits 是否只對增加的位工作/花費指數(shù)級的時間,因為在 16 位時程序幾乎立即運行,但它似乎在 32 位時根本不起作用。這是我的代碼:import secrets import mathdef fermat_test(n): # this is the correct algorithm from the video and it works set at 16 bits for x in range(1, 5): # to run 5 trials if (pow(secrets.randbelow(n - 1) + 1, (n - 1)) % n) != 1: return False return Truebits = 16 # changing this to 32 the program will seemingly idle, not printing anything to consolerand = secrets.randbits(bits)while (not fermat_test(rand)): # while the number is not prime print(rand) # prints the number being checked rand = secrets.randbits(bits)print(rand)抱歉,如果這太復(fù)雜了,我可以嘗試對其進行編輯以重寫所有內(nèi)容。Python密碼學(xué)
1 回答

一只甜甜圈
TA貢獻1836條經(jīng)驗 獲得超5個贊
好消息:這與secrets
. 改變這個:
if (pow(secrets.randbelow(n - 1) + 1, (n - 1)) % n) != 1:
對此:
if pow(secrets.randbelow(n - 1) + 1, (n - 1), n) != 1:
3 參數(shù)pow()
非常有效地計算模冪。您編寫的內(nèi)容反而創(chuàng)建了一個巨大的整數(shù)(您基本上是將 32 位整數(shù)提升為 32 位冪 - 結(jié)果將達到數(shù)十億位十進制數(shù)字),然后才進行模運算。
添加回答
舉報
0/150
提交
取消