我正在寻找一种算法,可以证明任何大数字的素数。大数字,我指的是至少100,000,000个十进制数字的数字,并且不能用像梅森素数等简单的公式表示。
以下是我的要求:
1-必须完全正确
2-必须在基本家用电脑上运行
3-必须在几周或几个月内完成它的课程。
我的内存限制是8 GB的内存(我可以设置我有多少缓存可用的选项)在具有1tb硬盘的专用机器上。在几个月的时间里,我将一次考虑一个数字。
Edit1:我很清楚这是一个竞争的难题,如果不是几乎不可能使用当前的方法。我没有使用当前的方法,我需要一种方法来证明我的方法对于非常大的数字是正确的。
Edit2:我需要一种非概率方法的部分原因是因为这将是一次EFF奖励的尝试,并且在第二次获得EFF奖项后继续获得奖励。如果我的方法是正确的(那是一个按照IF的方式),我应该可以用我的笔记本电脑完成所有这些。
答案 0 :(得分:1)
据我所知,您正在寻找一种算法:
我不确定最后一部分,因为我从未试图实现它(但是),但我知道素数问题已经解决了一般数字。换句话说,无论表格如何,您都可以100%确定地确定数字是否为素数。你应该看看AKS primality test这是第一个解决这个问题的已知算法。
就像你说的那样,它可能需要一段时间才能运行,但它最终会以一定的答案结束。优化版本的复杂性为O((log n)^ 7.5(log n与n的位数成比例)。
但是,由于此运行时非常大并且您想要测试大量数字,因此您应该考虑首先使用更快,非确定性算法过滤此类数字。换句话说,我会尝试运行Miller-Rabin test几个数字(a = 2,3,5,7,...... - 前十个素数应该足够了,但即使你真的想要一个更好的准确性,你可能不应超过50个素数)。如果我没记错的话,在K Miller-Rabin测试之后测试数字是假素数的概率小于1/4 ^ k。换句话说,你可以运行少量的测试(更不用说这些测试非常快)并且如果数字是素数则非常有信心(如果这些测试中的任何一个失败,那么这个数字肯定不是素数)。在所有MR测试通过之后,在测试数字上运行AKS算法以确保(正如您在MR维基百科页面上看到的那样,即使在几次测试之后,以非常快的速度增加的最小误报)。