又是喜闻乐见的素数判定问题。本蒟蒻来强答一发
一个人人皆知的方法
你只要知道质数的定义,就可以报出一个正确的
做法;当然是从
到
一个一个枚举,看看除了
和它本身之外还有没有其他质因数了!
当然这个方法显然太慢了一点,想要快速判断
这种级别的质数怎么办?
改进方法有了!观察一下它的质因数,如果是合数那么必然存在一个
的质因数(想想为什么)。于是我们只要枚举
到
内的所有数,看看是不是都不能整除,就行啦!
换一种角度
观察一下费马小定理。(这里就不写了,可以看费马小定理_百度百科 )
发现如果它的逆命题成立,那事情就变得十分美好了---随机一个值我们就可以知道
是不是质数。然而现实总是残酷的,费马小定理的逆命题并不成立。但不妨碍我们设计出如下算法:当
为奇数时(偶数时特判一下)让
在
之间(包括
和
)选取随机值,如果等式不成立,那么
肯定不是素数,如果成立,那么
就有较大可能是素数,称为伪素数。
然而这种算法误判的概率实在是太高了(最典型的例子,Carmichael数),所以它并没有什么卵用。尝试改进这种方法,于是就有了现在人们耳熟能详的Miller-Rabin素数判定算法,它基于二次探测定理(可看Miller_Rabin素数测试[Fermat小定理][二次探测定理][同余式][Wilson定理] - pi9nc的专栏 - CSDN博客 ):
(版权纠纷不存在的啦,这是窝的课件)
可以发现这种算法极大地提升了正确率。在
范围内出错的只有一个数(忘记是什么了,哪位大佬评论区说一下QwQ)
一般现在我们检测素数都是用的Miller-Rabin啦~
八卦一下,其实Miller原先提出的是一种基于广义黎曼猜想的
算法,然后被Rabin教授改成了不基于广义黎曼猜想的随机化算法~\(≧▽≦)/~
具体可以看https://core.ac.uk/download/pdf/82649441.pdfcore.ac.uk
Update 1.11 有答主提到了AKS算法,目前的复杂度估计是
的。假设Agrawal's conjecture成立那么它的复杂度将降至
。然而测试速度还是远远不及Miller-Rabin(并且甚至更多的证据表明这个猜想并不成立),所以Miller-Rabin仍然是现在最广泛采用的素数判定算法。
update 1.17
昨天 @酱紫君 谴责我没有讲一些modern的做法
但可是我已经看过mma的帮助文档了啊...
大家以后都去学ECPP,别来学米勒拉宾了(逃)
唔,当然了,酱紫早就学完代数数论了,所以嘛...