因数分解——Pollard' p-1 Pollard rho
分解因子
Pollard’s p-1 算法
Base concepts
- 对于一个想要分解因子的整数 n
- 如果我们可以找到一个与 n 不互质的整数 s ,则可直接通过求 gcd(s,n)gcd(s,n)gcd(s,n) 求得 n 的一个因子
- 这样的 sss 如何得到?
- 考虑到如下事实:
- 若 p 为 n 的一个素因子
- p未知,希望构造出一个含有因子 p 的数 s,则可通过求gcd(s,n)gcd(s,n)gcd(s,n)求得 n 的因子
- x≡1(modp)  ⟹  p∣gcd(x−1,n)x \equiv 1 \pmod p \implies p | gcd(x-1,n)x≡1(modp)⟹p∣gcd(x−1,n)
- 如何在只知道 n 的有限条件下得到这样的 x?
- 考虑 Fermat 小定理,必有2p−1≡1(modp)2^{p-1}\equiv 1\pmod p2p−1≡1(modp)
- 但 p 未知!
- 考虑构造一个(p−1)(p-1)(p−1)的倍数
- 假定对每一个素数幂 q∣(p−1)q|(p-1)q∣(p−1), 有q≤Bq\leq Bq≤B
- 则可得到(p−1)(p-1)(p−1)的一个倍数 B!B!B!
- 于是,x≡2B!(modn)x\equiv 2^{B!}\pmod nx≡2B!(modn)
- 由于p∣np|np∣n,有x≡2B!≡1(modp)x\equiv 2^{B!}\equiv 1\pmod px≡2B!≡1(modp)
- 依据:Fermat 小定理,(p−1)∣B!(p-1)|B!(p−1)∣B!
- 若 p 为 n 的一个素因子
- s=x−1s=x-1s=x−1
- d=gcd(s,n)d=gcd(s,n)d=gcd(s,n)即为nnn的一个非平凡因子(除非s=0)
Algorithm
Inputs #1: n: a composite number
Inputs #2: B: a smoothness bound
Outputs: a nontrivial factor of nnn or failure
Pollard p-1 Factoring Algorithm(n,B):
a←2B!(modn)a\leftarrow 2^{B!}\pmod na←2B!(modn)
d←gcd(a−1,n)d\leftarrow gcd(a-1,n)d←gcd(a−1,n)
if 1<d<n1<d<n1<d<n then return d
else return failure
Pollard ρ\rhoρ 算法
Base concepts
- 同样是希望找到一个 s, 然后通过求gcd(s,n)gcd(s,n)gcd(s,n)来求得因子
- 但 s 的求法不同
- 有如下事实:设 p 为 n 的最小素因子,假定存在2个整数x,x′∈Z,x,x'\in \mathbb{Z},x,x′∈Z,使得x≠x′x\neq x'x̸=x′且x≡x′(modp)x\equiv x'\pmod px≡x′(modp)
则p≤gcd(x−x′,n)<np\leq gcd(x-x',n)<np≤gcd(x−x′,n)<n,即为所需因子 - s 的获取关键在于x,x′x,x'x,x′的选取
- 有如下事实:设 p 为 n 的最小素因子,假定存在2个整数x,x′∈Z,x,x'\in \mathbb{Z},x,x′∈Z,使得x≠x′x\neq x'x̸=x′且x≡x′(modp)x\equiv x'\pmod px≡x′(modp)
- x,x′x,x'x,x′的选取?
- 假定通过先选择一个随机子集X∈ZnX\in \mathbb{Z}_nX∈Zn来分解n,然后对其中所有不同的x,x′x,x'x,x′计算gcd(x−x′,n)gcd(x-x',n)gcd(x−x′,n),这个方法能成功当且仅当映射x↦smod  px\mapsto s \mod px↦smodp对于x∈Xx\in Xx∈X得到至少一个碰撞
- 根据生日悖论,如果∣X∣≈1.17p|X|\approx 1.17\sqrt p∣X∣≈1.17p,那么至少存在一个碰撞的概率为50%
- 但由于 p 未知,不能显示计算xmod  px \mod pxmodp,这意味着在找到 n 的一个因子前,需要计算超过(∣x∣2)>p2\binom{|x|}{2}>\frac{p}{2}(2∣x∣)>2p次gcd
- 假定通过先选择一个随机子集X∈ZnX\in \mathbb{Z}_nX∈Zn来分解n,然后对其中所有不同的x,x′x,x'x,x′计算gcd(x−x′,n)gcd(x-x',n)gcd(x−x′,n),这个方法能成功当且仅当映射x↦smod  px\mapsto s \mod px↦smodp对于x∈Xx\in Xx∈X得到至少一个碰撞
- Pollard ρ\rhoρ 算法如何对这一技巧进行了优化
- 考虑一种“类似”随机映射x↦f(x)mod  nx\mapsto f(x)\mod nx↦f(x)modn,其中fff为一个具有整数系数的多项式
- 例如f(x)=x2+af(x)=x^2+af(x)=x2+a, 通常取a=1a=1a=1
- 设x1→Znx_1\rightarrow \mathbb{Z}_nx1→Zn,可得到序列x1,x2,...(xi+1=f(xi)mod  n)x_1,x_2,...\quad\quad (x_{i+1}=f(x_i)\mod n)x1,x2,...(xi+1=f(xi)modn)
- 在此序列中寻找xi,xjx_i,x_jxi,xj使得gcd(xj−xi,n)>1gcd(x_j-x_i,n)>1gcd(xj−xi,n)>1
- 每次计算序列中的一个新项xjx_jxj,要对所有i<ji<ji<j计算gcd(xj−xi,n)gcd(x_j-x_i,n)gcd(xj−xi,n)
- 然而,gcd计算次数可以大大减少
- 有如下事实:xi≡xj(modp)  ⟹  f(xi)≡f(xj)(modp)  ⟹  xi+1≡xj+1(modp)x_i\equiv x_j\pmod p \implies f(x_i)\equiv f(x_j)\pmod p\implies x_{i+1}\equiv x_{j+1}\pmod pxi≡xj(modp)⟹f(xi)≡f(xj)(modp)⟹xi+1≡xj+1(modp)
- 于是,如果(xi,xj)(x_i,x_j)(xi,xj)关于 p 同余,则(xi+1,xj+1),(xi+2,xj+2),(xi+3,xj+3)⋯(x_{i+1},x_{j+1}),(x_{i+2},x_{j+2}),(x_{i+3},x_{j+3})\cdots(xi+1,xj+1),(xi+2,xj+2),(xi+3,xj+3)⋯均关于 p 同余
- 为了简化和改进算法,通过取j=2ij=2ij=2i来寻找碰撞
- 因为不一定要找出这种类型的第一个碰撞
- 考虑一种“类似”随机映射x↦f(x)mod  nx\mapsto f(x)\mod nx↦f(x)modn,其中fff为一个具有整数系数的多项式
- 事实上,序列一定会从某处进入循环,因为 p 是一个有限数
- 用顶点集Zp\mathbb{Z}_pZp构造一个图 G,从点ximod  px_i \mod pximodp向点xi+1mod  px_{i+1} \mod pxi+1modp做一条有向边,可知 G 看起来像希腊字母ρ\rhoρ
- “尾巴”:x1mod  p→x2mod  p→⋯→ximod  px_1\mod p\to x_2\mod p\to \cdots\to x_i\mod p x1modp→x2modp→⋯→ximodp
- “环”:ximod  p→xi+1mod  p→⋯→xjmod  p=ximod  px_i\mod p\to x_{i+1}\mod p\to \cdots\to x_j \mod p=x_i\mod p ximodp→xi+1modp→⋯→xjmodp=ximodp
Algorithm
Input #1: n: a composite number
Input #2: x1x_1x1: the starting number
Output: a nontrivial factor of nnn or failure
Pollard ρ\rhoρ Factoring Algorithm(n,x1x_1x1)
external fff
x←x1;  x′←f(x)mod  n;  d=gcd(x−x′,n)x\leftarrow x_1;\;x'\leftarrow f(x)\mod n;\;d=gcd(x-x',n)x←x1;x′←f(x)modn;d=gcd(x−x′,n)
while p=1p=1p=1:
x←f(x)mod  nx\leftarrow f(x)\mod nx←f(x)modn
x′←f(x′)mod  n;  x′←f(x′)mod  nx'\leftarrow f(x')\mod n;\;x'\leftarrow f(x')\mod nx′←f(x′)modn;x′←f(x′)modn
d←gcd(x−x′,n)d\leftarrow gcd(x-x',n)d←gcd(x−x′,n)
if d=n then return failure
else return d
因数分解——Pollard' p-1 Pollard rho相关推荐
- 【快速因数分解】数论--质因数
如何分解质因数? 百度的方法如下: (一) 分解质因数只针对合数.(分解质因数也称分解素因数)求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止. 分解质因数的方法是先用一个合数的最小质因 ...
- 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...
- 因数分解 Pollard rho
因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...
- 【快速因数分解】Pollard's Rho 算法
算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001. ...
- C++实现质因数分解
质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数):否则称为合数.根据算术基本定理,每一个比1大的整数,要 ...
- 编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上
//编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上 //***本题的难点是既要找出质因数,又要保证其连乘为该数 //***需要两个循环,外循环与内循环 /*每个合数 都可以写成几个 质数 相乘 ...
- c语言素数筛法与分解素因数,质因数分解及代码:
计算方法 短除法 求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止.分解质因数的算式的叫短除法,和除法的性质差不多,还可以用来求多个个数的公因式: 求最大公因数的一种方法,也可用来求最小 ...
- 质因数分解及算法实现
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数.而这个因数一定是一个质数. 定义 质因数(或质因子)在数论里是指 ...
- 关于质因数,分解质因数
质因数(素因数或质因子):在数论里是指能整除给定正整数的质数. 互质:除了1以外,两个没有其他共同质因子的正整数称为互质. 因为1没有质因子,1与任何正整数(包括1本身)都是互质. 正整数的因数分解可 ...
- 数论 —— 整数分解
[概述] 整数分解目前仍是世界级难题,是非常重要的研究方向,其有很多种算法,性能上各有差异,本文仅介绍试除法.Fermat 算法.Pollard Rho 算法. [试除法] 试除法也叫穷举法,是整数分 ...
最新文章
- arm el2与el3_ARMv8的学习笔记
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 数据库_第一第二第三范式讲解(通俗易懂)
- 试题 历届试题 幸运数(二分)
- 使用Stackblitz一分钟之内创建一个Angular应用
- apache camel_使用Apache Camel发布/订阅模式
- 系统容灾备份选型的决策表
- 快速幂(一个简单快速适合整数幂次的运算)
- Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?
- nginx源码包安装
- flash遮罩弹性跟随效果
- 2022年T电梯修理报名考试及T电梯修理最新解析
- C语言编程基础— 一维数组 (编程实现从键盘输入20个整数,统计非负数个数,并计算非负数之和。)
- 渗透测试之通道构建Cheat Sheet
- 关于MATLAB直方图的绘制及应用
- Apple watch ,小米微信通知
- cshop是什么开发语言_Fecshop 多语言
- 关键字驱动自动化测试
- Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification
- 如何让plsql记住密码,实现快速登录