1. 费马因式分解

1> 对于任一个奇数n,n = ab = x2-y2

2> ∵ n = ab = (x+y)*(x-y)

∴ a = x + y, b = x-y

x = (a+b)/2, y = (a-b)/2 (因为n为奇数,a, b必也为奇数,所以(a+b)和(a-b)必为偶数,故能被2整除,x, y为整数,x > y)

如:1 = 1*1 = 12 – 02

3 = 3*1 = 22 – 12

5 = 5*1 = 32 – 22

7 = 7*1 = 42 – 32

9 = 3*3 = 32 – 02

2. 费马因式分解算法

1> y2 = x2 – n

∵ x2 – n >= y2 >= 0

∴x2 >= n, x >= sqrt(n)

∴我们可以从x = sqrt(n)开始,计算x2 – n为完全平方数即可求出x, y,然后求得a, b

2> python代码

defFermat(num):

x=int(math.sqrt(num));if x*x

x+= 1;#y^2 = x^2 - num

while(True):

y2= x*x -num;

y=int(math.sqrt(y2));if y*y ==y2:break;

x+= 1;return [x+y, x-y];

3>. 利用完全平方数十位和个位数值性质改进费马因式分解算法

完全平方数的最后两个十进制数字(个位和十位)一定是下列数对之一:{00, e1, e4, 25, o6, e9}, 证明见《完全平方数的末两位数字类型的另一种证明》

#PerfectSquare = {00, e1, e4, 25, o6, e9}

defCheckPerfectSquare(num):#tens = 3, mean it is a odd number, tens = 4, mean it is a even number, otherwise, tens equal the value

digitList = [ {'unit' : 0, 'tens': 0},

{'unit' : 1, 'tens' : 4},

{'unit' : 4, 'tens' : 4},

{'unit' : 5, 'tens' : 2},

{'unit' : 6, 'tens' : 3},

{'unit' : 9, 'tens' : 4}];

unit= num % 10;

tens= (num % 100) / 10;for item indigitList:if item['unit'] ==unit:if item['tens'] < 3:return item['tens'] ==tens;else:#Check is odd or even number, check the first bit

return item['tens'] & 1 == tens & 1;returnFalse;defFermat(num):

x=int(math.sqrt(num));if x*x

x+= 1;

times=0;

x0=x;#y^2 = x^2 - num

while(True):

y2= x*x -num;ifCheckPerfectSquare(y2):

times+= 1;

y=int(math.sqrt(y2));if y*y ==y2:break;

x+= 1;print "Loop :", x - x0 +1, ", check perfect square :", times;print "x :", x, ", y :", y;return [x+y, x-y];

测试结果:

可以看出,用了完全平方数的性质后,将原来需要计算y的开方和比较y2的次数减少了13次(86%),我们知道计算乘法和开方式非常耗费时间的,减少这些次数后可以大大提高算法效率

4. 费马因式分解最坏计算次数

x = (a+b)/2

∵ n = ab, b = n/a

∴ x = (a + n/a)/2

我们需求x的最大值,如果(a + n/a)是单调递增或递减的,我们很容易就得到x的最大值

设a >= b(b >=a 也一样)

则 a2 >= ab = n

∴ a2 >= n   (a <= n)

设f(a) =  a + n/a

f(a+1) = (a+1) + n/(a+1)

f(a+1) – f(a) = (a+1) + n/(a+1) – (a + n/a)

= 1 + n/(a+1) –  n/a

= [(a+1)a + na –n(a+1)]/a

= (a2 –n + a)/[a(a+1)]

∵ a2 >= n

∴ (a2 –n + a) > 0

∴f(a+1) > f(a)

∴f(a)时单调递增的

∵a <= n

∴当a = n时,f(a)最大,x也最大,x = (n + n/n)/2 = (n+1)/2

∴费马因式分解最大次数 = x – sqrt(n) = (n+1)/2 – sqrt(n)

5. 费马因式分解算法和素数判定

思考:当费马因式分解算法为最坏次数时,n是什么数

当费马因式分解算法为最坏次数时,可知a = n, b = 1, x = (n+1)/2, y = (n-1)/2

貌似其因子为本身和1,这和素数的性质非常像,看第1部分的1到9的费马因式分解,貌似满足这种条件的都是素数,那么大胆猜想一下:

假设:如果奇数n的费马因式分解式 = n*1, 那么n为一个素数

反证:n不为素数, 则x在最大值之前就使x2 – n = y2

即需证明,当n不为素数,n = ab = (x+y)(x-y), x < (n+1)/2

那么 n = ab (n > a)

根据第4部分证明知 x = (a + n/a)/2 ,且f(a) =  a + n/a 是单调递增的

∵a < n

∴f(a) < f(n) < n + n/n = n + 1

∴x < (n+1)/2

∴x不可能到最大次数,得证

增加部分code和测试如下:

if __name__ == '__main__':while(True) :

num= int(raw_input("Input a odd num for fermat :"));if(1 == num & 1):break;

retList=Fermat(num);print num, "=", retList[0], "*", retList[1];if num > 1 and 1 == retList[1]:print num, "is a prime number";

python因式分解算法_费马因式分解算法优化及素数判定相关推荐

  1. 【费马小定理】判断素数

    [知识点] ·费马小定理:假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的 ...

  2. 什么是python编程例子_案例详解:优化Python编程的4个妙招

    全文共3510字,预计学习时长7分钟 作为数据科学家,敲出最优的Python代码非常非常重要.别无他法,杂乱低效的代码笔记本会消耗你的时间,也会浪费大量项目资金.经验丰富的数据科学家和专业人士都很清楚 ...

  3. 朴素贝叶斯算法python sklearn实现_朴素贝叶斯算法优化与 sklearn 实现

    进行拉普拉斯平滑运算后,我们运行程序,仍然得出了两个测试样本均属于非侮辱类的结果,这是为什么呢? 我们查看最终计算出的 p0 和 p1 会发现,他们的结果都是 0,这又是为什么呢? 这是因为出现了另一 ...

  4. 判断素数(费马小定理)

    1)Sieve of Eratosthenes筛法 由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了.例如要查找100以内的质数,首先 ...

  5. 4.1 费马质数分解

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

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

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

  7. python 费马检测

    费马小定理: 如果 n 是一个素数,a 是小于 n 的任意正整数,那么 a 的 n 次方与 a 模 n 同余.(两个数称为是模 n 的同余,如果它们除以 n 的余数相同.数 a 除以 n 的余数称为 ...

  8. tensorboard ckpt pb 模型的输出节点_乐学初中数学研究|第七期:最值问题之费马点模型...

    熊俐老师 同济大学硕士毕业:以数学第一及总分第一考入研究生:具有较强的逻辑思维能力,解题方法独特:从研究生开始就从事初中数学教学辅导工作:熟悉初中教材,能准确把握教学重点难点,教学风格细致 最值问题之 ...

  9. 3.3 费马质数测试

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

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

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

最新文章

  1. 开源大数据周刊-第30期
  2. python opencv 实现任意角度的透视变换
  3. 【干货】路由黑洞的5种解决方法大PK
  4. Linux I/O模型
  5. shell编程系列23--shell操作数据库实战之mysql命令参数详解
  6. 删除有序链表中的重复结点
  7. window 系统上传文件到linux 系统出现dos 格式换行符
  8. jq之toggle()
  9. 小爱同学100个奇葩回复_小爱同学深度体验报告:这6个问题值得思考
  10. [转载] Python 中 pass 语句的作用是什么?
  11. SQL Server 2005 Beta 2 Service Broker: Stored Procedure acts as a service program
  12. mysql必知必会学习笔记
  13. android代码设置digits,android:digits属性
  14. Kafka运维大全来了!优化、监控、故障处理……
  15. UPDATE更新数据库数据详解
  16. 虚拟机无法重启服务器,windows2019虚拟机管理服务无法启动
  17. 【侯捷 C++ 面向对象高级开发】课程笔记以及个人注释(附带课程资源)
  18. idea 注释 rendered view
  19. Linux通过df命令查看显示磁盘空间满,但实际未占用问题
  20. 恢复系统自带的office软件

热门文章

  1. GoTop给网站加一个悬挂猫效果上吊猫
  2. 计算机室无线网络,在小型办公室中设置无线网络
  3. 汽车自动变速器的共性技术
  4. ​你不是真正的“匿名”:如何划定匿名数据和去识别化数据?
  5. Oracle dmp文件结构探秘
  6. 什么是Autorun病毒?它的运作原理是什么?如何手工清除?
  7. bzoj 4134 ljw和lzr的hack比赛
  8. 山寨小小军团开发笔记 之 GamePool
  9. 新加坡圣淘沙亲子游自助游景点购票攻略
  10. 使用融资的心得和教训