费马小定理:

如果 n 是一个素数,a 是小于 n 的任意正整数,那么 a 的 n 次方与 a 模 n 同余。(两个数称为是模 n 的同余,如果它们除以 n 的余数相同。数 a 除以 n 的余数称为 a 取模 n 的余数,或简称为 a 取模 n)。

如果 n 不是素数,那么,一般而言,大部分的 a < n 都将满足上面的关系。这就引出了下面这个检查素数的算法:

对于给定的整数 n,随机任取一个 a < n 并计算出 an 取模 n 的余数。如果得到的结果不等于 a,那么 n 就肯定不是素数。如果它就是 a,那么 n 是素数的机会就很大。现在再另取一个随机的 a 并采用同样的方式检查。如果它满足上述等式,那么我们就能对 n 是素数有更大的信心了。通过检查越来越多的 a 值,我们就可以不断增加对有关结果的信心。这一算法称为费马检查。

读起来理解不直观?那么我这么总结下吧。

假如a是一个整数,p是一个素数,那么 ap = a (mod p)

如果a不是p的倍数,这个定理也可以写成 ap-1 = 1 (mod p)

举个例子,67是一个素数,则266 mod 67 = 1。

import randomdef expmod(base,exp,m):if exp==0:return 1elif exp%2==0:return expmod(base,exp/2,m)**2 % melse:return expmod(base,exp-1,m)*base % m
def fermat_test(n):a=random.randint(1,n-1)if a==expmod(a,n,n):return 1else:return 0
def fermat_prime(n,time):if time==0:return 1elif fermat_test(n)==1:return fermat_prime(n,time-1)else:return 0
#print fermat_test(11)
print fermat_prime(99,100)

对于为啥不直接用 a^exp 来求幂值 解释如下:

【转】http://www.blogjava.net/killme2008/archive/2007/05/11/116813.html

直接定义(expmod base exp m)为base^exp基于m的模(modulo)

(define (expmod base exp m)

(remainder (fast-expt base exp) m))

在理想情况下是正确的,在语义上与原定义是等价的,甚至递归层数

都是一样的,而且更加直观。

但在实践中,这样的定义是不可行的,这也是为什么我们要采用原文中的定义

的原因:因为base^exp很可能是一个非常大的数。比如,当我们取第二个

测试例子中的n=1000000时,base是[1,999999]区间中的任意

随机数,它的平均取值为50000,而exp=1000000。50000^1000000是一个大得

惊人的数,无论是fast-expt的层层函数调用计算,还是用remainder对其取模,

计算量都是很大的。

而相反,原始的expmod函数

(define (expmod base exp m)

(cond ((= exp 0) 1)

((even? exp)

(remainder (square (expmod base (/ exp 2) m))

m))

(else

(remainder (* base (expmod base (- exp 1) m))

m))))

通过分解(a*b mod n) 为 ((a mod n) * (b mod n) mod n),使得每层递归

调用的计算参数和返回值总是小于n (x mod n < n),即便是计算过程中出现

的最大数(a mod n) * (b mod n) 也依然是要小于n^2, 相对于前者n^n的数

量级,实在是小得多,这样就避免了大数的计算问题。

比如经测试,在使用新的expmod的情况下,1009的验证需要1.2ms的时间,

1000003的验证需要 93680ms,远高于原来的expmod函数。

这也同时印证了我们在1.24题中的分析,同样的操作在不同字长的数字上的

代价是不同的。1000000的验证时间现在是1000的8000多倍,远不再是2倍左右

的关系。在1.24中的,因为expmod算法的控制,操作数最多是n^2级的,字长

所引起的差距并不明显,只在10^6-10^12间产生了一点点阶跃;而这里的算法

中, 操作数可以达到n^n级,当n=1000时,1000^1000的字长大约在10000位(二

进制数)左右,而n=1000000时1000000^1000000的字长则达到在20000000位(二

进制数)左右,这字长的巨大差距导致了我们在1.24中已经发现的问题更加明显。

python 费马检测相关推荐

  1. Python:实现费马检测算法(附完整源码)

    Python:实现费马检测算法 def bin_exp_mod(a, n, b):# mod bassert not (b == 0), "This cannot accept modulo ...

  2. SICP:费马小定理与素数检测

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/2329 费马小定理 关于费马小定理,读到注解的时候,还是有点震撼的. 皮埃尔•得•费马(1601 ...

  3. 【原创】【数论】质数判断方法汇总及证明(上-费马素性检测与卡迈克尔数)

    质数 一.定义: 对于一个整数p,除了1和p之外没有别的整因数的整数,称为质数. 若p为质数,则除p=1*p外没有别的分解方式. 二.性质: ≤n的质数粗略的有n/ln(n)个.(非常粗略,误差较大, ...

  4. [变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明

    [变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明 变分法 费马光学原理 最速下降线问题 旋轮线 旋轮线最速下降性质的证明 一些旋轮线及变形 参考书目: 1696年约翰·伯努利在写 ...

  5. 4.1 费马质数分解

      RSA算法的基础就是对于两个大质数的乘积进行质因数分解是非常慢的.比如对于一个300位的十进制数字进行质因数分解,普通电脑需要上百万年时间.但是如果这两个大质数比较接近,那使用费马质数分解就不需要 ...

  6. 3.3 费马质数测试

      说实话,费马质数测试是有点坑的,并不能保证这个数真的是一个质数.费马质数测试的理论依据是费马小定理Fermat's little theorem.费马小定理的内容是,对于一个质数p,和一个与他互质 ...

  7. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  8. 数学小白的探索-欧拉和费马

    文章目录 一些数学趣史 关于欧拉猜想以及欧拉公式 费马大定理特殊情况最简单证明 题外话-三千年一遇的一元二次方程解法 写在最后 一些数学趣史 很久没有发表文章了,也许是最近闲的让一向数学其差的我没事看 ...

  9. 初等数论四大定理(威尔逊定理,欧拉定理,费马小定理,中国剩余定理)

    初等数论四大定理 1. 威尔逊定理 (1) 结论 当且仅当ppp为素数时,(p−1)!≡−1(modp)(p-1)!\equiv -1(\mod p)(p−1)!≡−1(modp). (2) 证明 充 ...

最新文章

  1. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
  2. 若变量均已正确定义并赋值,以下合法的c语言赋值语句是,若变量均已正确定义并赋值,以下合法的C语言赋值语句是()...
  3. R语言break函数和next函数实战
  4. R语言广义线性模型Logistic回归模型亚组分析及森林图绘制
  5. python 重复采样,不重复采样
  6. Across the universe
  7. 页面无法滚动_【前端词典】滚动穿透问题的解决方案
  8. 使用Spring和Hibernate进行集成测试有多酷
  9. VScode我的setting.json设置,和搜狗输入法配置
  10. HTML元素定义 ID,Class,Style的优先级
  11. YOLO系列专题——YOLOv3实践篇
  12. 与孩子一起学编程--Ubuntu环境下
  13. All the python knowledge that I come across
  14. Consul + fabio 实现自动服务发现、负载均衡 - DockOne.io
  15. 修改jar包中class文件
  16. 夜神模拟器开启网络桥接模式共享局域网ip
  17. linux eval命令详解,linux命令详解——eval
  18. 信号与系统->系统的时域分析
  19. 什么是G.654E光纤?
  20. 电脑无法打开Office提示很抱歉,此功能看似已中断解决办法

热门文章

  1. mybatis SQL打印插件
  2. Chromium为视频标签video全屏播放的过程分析
  3. 艾默生手操器TREXLFPNAWS1S
  4. 应聘计算机简历中的爱好怎么写,关于求职个人简历中的爱好特长应该怎么写
  5. win10如何显示我的电脑在桌面
  6. Apple Lossless Audio Codec 苹果无损音频解码器
  7. php网页字号颜色,pc端web、移动端web的字体大小、颜色、字体样式使用
  8. 模糊视频帧插值:CVPR2020论文点评
  9. 个人发展分析:SWOT
  10. python 类函数 实例函数,python_30期【实例函数 类里面的函数】