python - Python secrets.randbits 一旦增加到 16 以上就永远
问题描述
我一直在尝试在 python 脚本中实现Fermat 测试以生成一个大素数,我希望在大素数上使用它,它可以快速且几乎完美地用于 16 位生成,但如果我将它设置为 32它根本不运行。
对于快速上下文,Fermat 测试应该运行 x 次试验(在我的代码中设置为 5 以便我可以查看它是否有效,但在使用中我可能会将其设置为更高约 20 或其他值)以测试是否数字是否为素数。所以我使用 secrets.randbits 生成大量数字,然后用 Fermat 测试检查它们是否是素数,如果不是,我选择一个不同的素数并再次运行它,直到找到一个。
将位设置为 16 时,代码运行速度很快,在测试的日志中打印许多不同的数字,然后发现它们是复合的并选择不同的,但是一旦设置为 32,则什么都不会打印,我真的不知道为什么。secrets.randbits 是否仅对增加的位起作用/花费的时间呈指数增长,因为在 16 位时程序几乎可以立即运行,但在 32 位时似乎根本不起作用。
这是我的代码:
import secrets
import math
def 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 True
bits = 16 # changing this to 32 the program will seemingly idle, not printing anything to console
rand = 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)
抱歉,如果这太令人费解了,我可以尝试对其进行编辑以改写所有内容。
解决方案
好消息:这与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 位幂 - 结果将变成数十亿个十进制数字),然后才进行模数运算。
推荐阅读
- gnuplot - gnuplot:显示轴上某些点的值?
- php - 如何隐藏 laravel 5.7 http id
- java - 如何修复 StringBuffer 错误
- windows - 在 Windows 上以编程方式连接 BT 设备
- ios - Firebase - 无法将调用结果类型“[_]”转换为预期类型“_?”
- php - 音频自动播放无限次重复html5
- android - ExpandableListView 重复 ID 问题 - 如何解决?
- c# - 计算句子中单词数的控制台应用程序。(C#)
- mysql - SQL 迁移。保留旧 ID 不起作用
- php - 使用PHP将Json嵌套数组到Mysql中