首页 > 解决方案 > 给出素数的最有效算法是什么,最高值(所有 32 位机器都可以处理)

问题描述

我的程序应该永远循环并通过 print 给出它出现的每个素数。顺便说一句,在 x86-NASM 中执行此操作。

我的第一次尝试将它除以之前的每个数字,直到进位为 0(不是素数)或结果为 1。

我的第二次尝试通过仅每秒测试一次来改进这一点,所以只有奇数。

我目前正在实施的第三件事是尝试不除以之前的每个数字,而是将之前的所有数字除以 2,因为你不能通过将数字除以大于一半的数字来得到偶数

另一件可能有帮助的事情是只用奇数来测试它,比如埃拉托色尼筛,但只排除偶数。

无论如何,如果我能做另一件事,欢迎大家帮忙。

编辑: 左:计算一切。 然后它只使用每个第二个数字。 然后它只通过奇数除。 最后一个也只计算该数字的较低的 50%

标签: algorithmassemblyx86nasmprimes

解决方案


如果您需要测试少数几个(可能只有一个)素数,AKS 素数测试是长度为 的多项式n
如果你想找到一个非常大的密码大小的素数,那么选择一个随机范围的奇数并筛选出所有因数为小素数的数字(例如小于64K-240K),然后测试剩余数字的素数。

如果你想在一个范围内找到素数然后使用筛子,Erathostenes 筛子很容易实现,但运行速度较慢,需要更多内存。Atkin
的筛子速度更快,轮子筛子需要的内存要少得多。

如果天真地接近问题的大小是指数级的,因此在微观优化必须首先进行宏观优化之前。
或多或少,所有素数算法都需要对数论有信心,因此要特别注意算法正在处理的组/环/场,因为数学家为所有代数结构编写了诸如逆或乘法之类的运算。

一旦你有了一个快速的算法,你就可以开始微优化。
在这个级别上,真的不可能回答如何进行这样的优化。


推荐阅读