RSA算法的基础就是对于两个大质数的乘积进行质因数分解是非常慢的。比如对于一个300位的十进制数字进行质因数分解,普通电脑需要上百万年时间。但是如果这两个大质数比较接近,那使用费马质数分解就不需要几百万年了。
  对于一个奇合数n=p⋅qn=p\cdot qn=p⋅q,可以写成一个平方差:
n=p⋅q=(p+q2)2−(p−q2)2n=p\cdot q=(\frac{p+q}{2})^2-(\frac{p-q}{2})^2 n=p⋅q=(2p+q​)2−(2p−q​)2
  费马质因数分解算法,就是不停地循环尝试,找到两个数:
a=p+q2b=p−q2a=\frac{p+q}{2}\\ b=\frac{p-q}{2} a=2p+q​b=2p−q​
  找到这两个数之后a+ba+ba+b和a−ba-ba−b就是p和q了。我们知道n=a2−b2=(a+b)(a−b)n=a^2-b^2=(a+b)(a-b)n=a2−b2=(a+b)(a−b)。我们让a从⌈n⌉\lceil\sqrt{n}\rceil⌈n​⌉开始尝试,不断+1,直到a2−na^2-na2−n是一个平方数为止。
  需要注意的是这对于奇合数才有用,因为偶数的话,分解出来的两个数如果是一奇一偶,则相加除于2不是一个整数。单次分解的复杂度是O(∣p−q∣)O(|{p-q}|)O(∣p−q∣),在实际应用中费马质数分解的效率其实不高,因为实际上两个质因数相近(∣p−q∣|{p-q}|∣p−q∣比较小)的情况是比较少见的。
  Python代码如下:

# _*_ coding:utf-8 _*_
import mathdef fermat(n):a = math.ceil(math.sqrt(n))# b的平方b2 = a * a - nb = round(math.sqrt(b2))while b * b != b2:a += 1b2 = a * a - nb = round(math.sqrt(b2))print(a, b, n)return a - b, a + bdef factorization(n):factors = []stack = [n]while len(stack) > 0:x = stack.pop()if x == 2:factors.insert(0, x)continuep, q = fermat(x) if x & 1 == 1 else (2, x // 2)if p == 1:factors.insert(0, q)else:stack.append(p)stack.append(q)return factorsif __name__ == '__main__':print(factorization(200))

  测试结果为:

[2, 2, 2, 5, 5]

4.1 费马质数分解相关推荐

  1. 3.3 费马质数测试

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

  2. 费马素数(费马质数)

    0x01 普遍形式 费马素数也叫费马质数. 其中 n 为非负整数. 0x02 历史 法国数学家费马于1640年提出了以下猜想: 可以看出,前4个是质数,因为第5个数实在太大了,费马认为是质数. 由此提 ...

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

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

  4. 整数分解 费马方法c语言,因数分解(费马的方法)

    原标题:因数分解(费马的方法) 触碰标题下面一行的"邵勇老师"查看所有文章:触碰"数学教学研究", 关注本微信公众号(sx100sy). 本公众号内容均由邵勇( ...

  5. 费马小定理与等比数列的求和(MOD 质数)

    费马小定理:任意整数a, a^p≡a (mod p),p是质数. 定理:1.对a/b≡a*x (mod n),则称x 为b的乘法逆元,记为b^-1. 2.当模数p为质数,且b与p互质(即b不为p的倍数 ...

  6. c语言生成两位随机素数算法,[算法]费马小定理求质数的算法之Miller-Rabin算法,C语言实现 | 李大仁博客...

    今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法, ...

  7. 【学习笔记】高斯整数、高斯素数、费马平方和(全部相关概念及例题详解)《初等数论及其应用》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 以下内容摘自 我的文章:算法竞赛中的数论问题 - 数论全家桶(信奥 / 数竞 / ACM)作者孟繁宇, ...

  8. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  9. 循环小数与费马小定理

    循环小数与费马小定理 17/05/29 22:30:51 | Snakes 背景 题目出自之前亮灯问题.杨辉三角与Sierpinski三角形提及的生日题中的第三.四.五题. 题目 第三题 证明:对于任 ...

最新文章

  1. Python——raise引发异常
  2. oracle+system空间满了,oracle审计导致system表空间爆满的处理方法
  3. BlockChain:区块链技术基础概念综合理解——个人总结
  4. svpwm仿真_案例12:三相三线PWM整流仿真建模
  5. QML基础类型之point
  6. mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路
  7. spring mvc 转发跳转
  8. 100道精选面试题,教你怎样轻松晋级!
  9. mysql 临时列可以判断,mysql数据库常用命令
  10. 基于Java的超市商品管理系统
  11. python调用QT界面使用方法
  12. 谈谈多源数据融合-科普基本概念篇
  13. 轻松解决Tomcat启动慢的问题,只需一行代码
  14. 腾讯QQ邮箱、网易163邮箱配置客户端(Windows自带邮件)教程
  15. webpack5css抽离和压缩
  16. linux下安装qt教程
  17. 题目内容:你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。如输入1234,则输出:yi er san si注意,每个字的拼音
  18. 转载--我的AI转型之路与AI之我见(非985211的奋斗路程与视角)
  19. BaseMultiItemQuickAdapter 条目position获取
  20. 2019最新百度、头条、小米、360、网易、等公司 Android 社招面试题目

热门文章

  1. Zotero使用OneDrive云存储附件(OneDrive+Zotero)
  2. win10取消微软帐户绑定使用本地账户登录的解决方法
  3. 基于图像识别测试手机浏览器打开网页首屏时间的方法
  4. SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
  5. 【MQ】Kafka如何保证幂等性
  6. 巴旦木即将成为农业的下一个“风口”河南巴旦木生态农业:值得期待
  7. Java项目:电影院售票管理系统(java+Servlet+JSP+JDBC+Mysql)
  8. 手机版会员中心html,会员中心.html
  9. 2022年最热门三款骨传导测评推荐:骨传导选购指南分享,骨传导耳机选哪款好?
  10. IMX.6ULL_Linux_基础篇(6) soc资源介绍