亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python secrets.randbits 一旦增加到 16 以上就永遠需要

Python secrets.randbits 一旦增加到 16 以上就永遠需要

胡子哥哥 2023-06-13 11:09:29
我一直在嘗試在 python 腳本中實現Fermat 測試以生成一個大素數,我希望在大素數上使用它,并且它可以快速且幾乎完美地用于 16 位生成,但是如果我將它設置為 32它根本不運行。對于快速上下文,Fermat 測試應該運行 x 次試驗(在我的代碼中設置為 5 只是為了我可以看看它是否有效,但在使用中我可能會將其設置為更高的 ~20 或其他)來測試是否數是否為素數。因此,我使用 secrets.randbits 生成大量數字,然后使用 Fermat 測試檢查它們是否是素數,如果不是,我會選擇一個不同的素數并再次運行直到找到一個。將位設置為 16,代碼運行速度很快,在發現它們是復合的并選擇不同的之前,將許多不同的數字打印到測試的日志中,但是一旦設置為 32,就什么都沒有打印,我真的不知道為什么。secrets.randbits 是否只對增加的位工作/花費指數級的時間,因為在 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)抱歉,如果這太復雜了,我可以嘗試對其進行編輯以重寫所有內容。Python密碼學
查看完整描述

1 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超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 參數pow()非常有效地計算模冪。您編寫的內容反而創建了一個巨大的整數(您基本上是將 32 位整數提升為 32 位冪 - 結果將達到數十億位十進制數字),然后才進行模運算。


查看完整回答
反對 回復 2023-06-13
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號