什么是最有效的给出素数的算法,最高值(所有 32 位机器都可以处理)
What is the most efficient algorithm to give out prime numbers, up to very high values (all a 32bit machine can handle)
我的程序应该永远循环并通过打印给出它出现的每个质数。在 x86 中执行此操作-NASM 顺便说一句。
我的第一次尝试将它除以之前的每个数字,直到进位为 0(不是质数)或结果为 1。
我的第二次尝试改进了这一点,只每秒测试一次,所以只测试奇数。
我目前正在实施的第三件事是尝试不除以每个先前的数字,而是将所有先前的数字除以 2,因为您不能通过将一个数字除以大于其一半的数来得到偶数
另一件可能有帮助的事情是只用奇数来测试它,比如埃拉托色尼筛法,但只排除偶数。
总之,如果还有什么我能做的,欢迎大家帮忙。
编辑:
如果您需要测试少数几个(可能只有一个)素数,AKS primality test 是长度为 n
的多项式。
如果你想找到一个非常大的密码大小的素数,那么 select 奇数的随机范围并筛选出所有因子为小素数(例如小于 64K-240K)的数字然后测试剩余的素数的数字。
如果你想找到一个范围内的素数,那么 use a sieve,Erathostenes 筛法很容易实现,但 运行 速度较慢并且需要更多内存。
sieve of Atkin is faster, the wheels sieve 需要的内存要少得多。
如果天真地处理问题,问题的规模会呈指数级增长,因此在进行微观优化之前必须首先进行宏观优化。
或多或少,所有素数算法都需要对 Number theory 有信心,因此请特别注意算法正在处理的 group/ring/field,因为数学家会为所有代数使用相同的符号编写诸如逆运算或乘法之类的运算结构。
一旦你有了一个快速的算法,你就可以开始微优化了。
在这个层面上,真的不可能回答如何进行这样的优化。
我的程序应该永远循环并通过打印给出它出现的每个质数。在 x86 中执行此操作-NASM 顺便说一句。
我的第一次尝试将它除以之前的每个数字,直到进位为 0(不是质数)或结果为 1。
我的第二次尝试改进了这一点,只每秒测试一次,所以只测试奇数。
我目前正在实施的第三件事是尝试不除以每个先前的数字,而是将所有先前的数字除以 2,因为您不能通过将一个数字除以大于其一半的数来得到偶数
另一件可能有帮助的事情是只用奇数来测试它,比如埃拉托色尼筛法,但只排除偶数。
总之,如果还有什么我能做的,欢迎大家帮忙。
编辑:
如果您需要测试少数几个(可能只有一个)素数,AKS primality test 是长度为 n
的多项式。
如果你想找到一个非常大的密码大小的素数,那么 select 奇数的随机范围并筛选出所有因子为小素数(例如小于 64K-240K)的数字然后测试剩余的素数的数字。
如果你想找到一个范围内的素数,那么 use a sieve,Erathostenes 筛法很容易实现,但 运行 速度较慢并且需要更多内存。
sieve of Atkin is faster, the wheels sieve 需要的内存要少得多。
如果天真地处理问题,问题的规模会呈指数级增长,因此在进行微观优化之前必须首先进行宏观优化。
或多或少,所有素数算法都需要对 Number theory 有信心,因此请特别注意算法正在处理的 group/ring/field,因为数学家会为所有代数使用相同的符号编写诸如逆运算或乘法之类的运算结构。
一旦你有了一个快速的算法,你就可以开始微优化了。
在这个层面上,真的不可能回答如何进行这样的优化。