4.2 Pollard p-1算法
文章目录
- 算法
- Python实现
算法
1974年,John Pollard发明了p-1算法,其灵感来自于费马小定理。p-1算法一个重要的概念就是B-powersmooth,这个不太好翻译,power,幂,smooth,光滑,就叫幂滑吧。其定义如下,对于质数p,将p-1进行质因数分解,最大的因子dkd^kdk就是B,而这个质数就是B-powersmooth。举个例子,质数p=1303,p−1=1302=2⋅3⋅7⋅31p-1=1302=2\cdot3\cdot7\cdot31p−1=1302=2⋅3⋅7⋅31,那么质数1303就是31-powersmooth。再举个例子,质数3697,p−1=3696=24⋅3⋅7⋅11p-1=3696=2^4\cdot3\cdot7\cdot11p−1=3696=24⋅3⋅7⋅11,那么3697就是16-powersmooth。
Pollard p-1算法基于费马小定理。费马小定理我们已经讲过无数遍了,实际上很多算法都是基于费马小定理的,比如米勒罗宾素性检验。我们从费马小定理开始展开讲讲,其公式如下:
ap−1≡1modpa^{p-1}\equiv1\;mod\;p ap−1≡1modp
假使我们要对整数n进行质因数分解,他的其中一个质因数是p,数学里的整除符号是p∣np\;|\;np∣n。对于p,有:
d=ap−1−1=0modpd=a^{p-1}-1=0\;mod\;p d=ap−1−1=0modp
所以d是p的倍数,也就是p∣dp\;|\;dp∣d,可以得到p=gcd(d,n)p=gcd(d,n)p=gcd(d,n)。讲得这么复杂,其实就是:
gcd(ap−1−1,n)=pgcd(a^{p-1}-1,n)=p gcd(ap−1−1,n)=p
当然不可能一个个地尝试,那么和原始质因数分解没什么区别。Pollard p-1算法采用了一种随机数的策略。如果随机不出结果,那么就从小于B(这个B代表B-powersmooth)的质数列表里去连成,组成上述公式中的d,直到质数列表被用尽。
Python实现
# _*_ encoding:utf-8 _*_import randomdef gcd(m, n):if m < n:m, n = n, mwhile m % n != 0:m, n = n, m % nreturn ndef sieve(n):mpfs = [0] * (n + 1)pn = []for i in range(2, n + 1):mpf = mpfs[i]if mpf == 0:pn.append(i)mpf = ifor p in pn:if p > mpf:breakx = p * iif x > n:breakmpfs[x] = preturn pndef pollard(n):b = 10_0000while b <= 100_0000:a = random.randint(2, n - 1)g = gcd(a, n)if g > 1:return g, n // gfor p in sieve(b):if p >= b:continuep_power = 1while p_power * p <= b:p_power *= pg = gcd(p_power - 1, n)if g > 1 and g < n:return g, n // gb <<= 1return 1, ndef factor(n):factors = []stack = [n]while len(stack) > 0:x = stack.pop()if x == 2:factors.insert(0, x)continuep, q = pollard(x) if x & 1 == 1 else (2, x >> 1)if p == 1:factors.insert(0, q)else:stack.append(p)stack.append(q)return factorsif __name__ == '__main__':print(factor(200))
测试结果:
[2, 2, 2, 5, 5]
4.2 Pollard p-1算法相关推荐
- 【快速因数分解】Pollard's Rho 算法
算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001. ...
- 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 如何检测链表中的循环?
假设您在Java中有一个链表结构. 它由节点组成: class Node {Node next;// some user data } 每个节点都指向下一个节点,但最后一个节点除外,后者的下一个为空. ...
- pollard_rho
复习整理一下PollardRho的相关知识把,刚好密码,acm都要用 Miller Rabin素性检验 Miller Rabin素性检验是一种素数判定的法则,由CMU的教授Miller首次提出,并由希 ...
- 一起来读书361- 应用密码学:第十一章 数学背景
摘要 密码学的数学背景 详情 知识点 1.信息量(amount of information):假设信息是等可能的,对消息中所有可能的值进行编码所需要的最小位数 2.语言信息率(rate of lan ...
- 杭电oj题目题型分类(转)
1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...
- HDOJ题目分类大全
版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...
- HDU题目分类大全【大集合】
基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.105 ...
- 【sigma 协议】
文章目录 Schnorr 简介 使用场景 交互式 Schnorr 交互式Schnorr协议流程 零知识解释 安全性分析 非交互式Schnorr 非交互式Schnorr协议流程 安全性分析与非交互式 零 ...
- 椭圆曲线介绍(四):椭圆曲线安全性,与RSA对比
内容来自ANDREA CORBELLINI的椭圆曲线密码学的介绍:Elliptic Curve Cryptography: a gentle introduction 本文是椭圆曲线介绍中的第四篇:椭 ...
最新文章
- weblogic10重置控制台密码
- 图解Reformer:一种高效的Transformer
- sysbench测试mysql性能(TPS、QPS、IOPS)(重要)
- 下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?
- linux7yum安装mysql,CentOS7 使用yum安装mysql
- WCF并存Asp.net
- Rational Rose学习笔记01:安装与注册
- flask + apidoc 生成接口文档(附加一个坑)
- 《史蒂夫·乔布斯传》中文PDF文字版官方传记电子书下载
- 苹果cms V10 七色中文 二开苹果cms视频 图片 小说网站源码模板
- Linux E: 无法定位软件包
- 【Latex系列】括号用法总结
- vht160什么意思_802.11n 中HT20 HT40是什么意思
- odoo:开源 ERP/CRM 入门与实践 -- 上海嘉冰信息技术公司提供咨询服务
- 思维导图(二):绘制规则
- php还款功能,智能还款的原理
- java计算机毕业设计-线上自助旅游报名网-源程序+mysql+系统+lw文档+远程调试
- anyRTC RTSP转WebRTC方案
- IntelliJ IDEA 如何实现代码展示自动换行
- 【计算机毕业设计】超市管理系统