首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小数的简单确定性素性检验

小数的简单确定性素性检验
EN

Stack Overflow用户
提问于 2011-09-29 16:12:41
回答 4查看 1.4K关注 0票数 5

我知道在实践中有许多素性测试算法( Eratosthenes筛法,Fermat's test,Miller-Rabin,AKS等)。然而,它们要么很慢(例如sieve),要么是概率论的(Fermat和Miller-Rabin),要么相对难以实现(AKS)。

确定一个数是否为素数的最佳确定性解决方案是什么?

请注意,我主要(双关语)感兴趣的是针对32位(也可能是64位)的数字进行测试。因此,不需要健壮的解决方案(适用于更大的数字)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-29 16:17:36

到了~2^30,你就可以用审判部门来暴力破解了。

一直到3.4*10^14Rabin-Miller with the first 7 primes has been proven to be deterministic

除此之外,你得靠你自己。目前还没有已知的亚立方确定性算法。

编辑:我记得这一点,但直到现在我才找到引用:

http://reference.wolfram.com/legacy/v5_2/book/section-A.9.4

PrimeQ首先使用小素数测试可除性,然后使用米勒-拉宾强伪素数测试基数2和基数3,然后使用卢卡斯测试。

截至1997年,已知此过程仅适用于n < 10^16,并且可以想象,对于较大的n,它可以声称一个合成数是质数。

所以如果你实现了拉宾-米勒和卢卡斯,你可以达到10^16

票数 11
EN

Stack Overflow用户

发布于 2011-09-29 16:30:04

如果我不关心空间,我会尝试预先计算2^32 (~4e9/ln(4e9)*4字节,小于1 1GB)以下的所有素数,将它们存储在内存中并使用二进制搜索。你也可以使用包含这些预计算素数的文件的内存映射(优点:更快的程序启动,缺点:在所有需要的数据实际在内存中之前会很慢)。

票数 3
EN

Stack Overflow用户

发布于 2011-09-29 22:39:25

如果你能因数n-1,就很容易证明n是素数,这是由爱德华·卢卡斯在19世纪开发的一种方法。您可以在Wikipedia上阅读该算法,或者在my blog上查看我的算法实现。该算法的一些变体只需要部分因子分解。

如果n-1的因式分解很困难,最好的方法是elliptic curve primality proving算法,但这需要比您愿意编写的更多的数学和代码。在任何情况下,这都比AKS快得多。

你确定你需要一个质数的绝对证明吗?Baillie-Wagstaff algorithm比任何确定性质数证明器都要快,而且没有已知的反例。

如果您知道n永远不会超过2^64,那么使用first twelve primes作为基数的强伪素数测试足以证明n素数。对于32位整数,对3个基数2、7和61的强伪素数测试足以证明素性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7594307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档