python自然底数_如何编程判断一个数是否是质数?

又是喜闻乐见的素数判定问题。本蒟蒻来强答一发

一个人人皆知的方法

你只要知道质数的定义,就可以报出一个正确的

做法;当然是从

一个一个枚举,看看除了

和它本身之外还有没有其他质因数了!

当然这个方法显然太慢了一点,想要快速判断

这种级别的质数怎么办?

改进方法有了!观察一下它的质因数,如果是合数那么必然存在一个

的质因数(想想为什么)。于是我们只要枚举

内的所有数,看看是不是都不能整除,就行啦!

换一种角度

观察一下费马小定理。(这里就不写了,可以看费马小定理_百度百科 )

发现如果它的逆命题成立,那事情就变得十分美好了---随机一个值我们就可以知道

是不是质数。然而现实总是残酷的,费马小定理的逆命题并不成立。但不妨碍我们设计出如下算法:当

为奇数时(偶数时特判一下)让

之间(包括

)选取随机值,如果等式不成立,那么

肯定不是素数,如果成立,那么

就有较大可能是素数,称为伪素数。

然而这种算法误判的概率实在是太高了(最典型的例子,Carmichael数),所以它并没有什么卵用。尝试改进这种方法,于是就有了现在人们耳熟能详的Miller-Rabin素数判定算法,它基于二次探测定理(可看Miller_Rabin素数测试[Fermat小定理][二次探测定理][同余式][Wilson定理] - pi9nc的专栏 - CSDN博客 ):

(版权纠纷不存在的啦,这是窝的课件)

可以发现这种算法极大地提升了正确率。在

范围内出错的只有一个数(忘记是什么了,哪位大佬评论区说一下QwQ)

一般现在我们检测素数都是用的Miller-Rabin啦~

八卦一下,其实Miller原先提出的是一种基于广义黎曼猜想的

算法,然后被Rabin教授改成了不基于广义黎曼猜想的随机化算法~\(≧▽≦)/~

具体可以看https://core.ac.uk/download/pdf/82649441.pdf​core.ac.uk

Update 1.11 有答主提到了AKS算法,目前的复杂度估计是

的。假设Agrawal's conjecture成立那么它的复杂度将降至

。然而测试速度还是远远不及Miller-Rabin(并且甚至更多的证据表明这个猜想并不成立),所以Miller-Rabin仍然是现在最广泛采用的素数判定算法。

update 1.17

昨天 @酱紫君 谴责我没有讲一些modern的做法

但可是我已经看过mma的帮助文档了啊...

大家以后都去学ECPP,别来学米勒拉宾了(逃)

唔,当然了,酱紫早就学完代数数论了,所以嘛...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值