【快速因数分解】Pollard's Rho 算法

26 篇文章 0 订阅
25 篇文章 8 订阅

算法目的

给一个数n,快速提取n的一个因数。

算法根据:生日悖论

讲生日悖论之前,先看一个东西。
给出[1…1000]的数,从中任意选出一个数为k的概率是 1 1000 1\over 1000 10001
但是假如选出两个数p,q要求他们的差值为k,就是|p-q|=k的概率大概是 1 500 1\over 500 5001,因为要取绝对值。
继续向下,选出l个数,使他们之间有两个数的差值为k,那么概率会随l的变大而变大,最终会趋近于1。
接下来是生日悖论:
我们随机选择一名学生,他的生日为 4 月 1 日的概率为 [1…365]
这相当于我们在[1…365]中随机选取一个数,该数为 90 的概率是多少?
那么我们又回到了上面那个问题。
我们随机选取 k(k≥ 2)个人 ,他们的生日相同的概率是多少(就是差值为0)?
可以直接用公式计算 p = P 365 k 36 5 n p={P_{365}^k\over{365^n}} p=365nP365k
通过计算
我们可以看到,k = 10 的时候大概有 11%的可能性存在两个人生日相同的情况,
而 k = 23 时,可能性提高至50%,假如一个班级总共有57个人,而l=57时的可能性已达到99%,几乎可以肯定地说,一个班级里必定有两个同学的出生日期是相同的,而这么多年的求学生涯过来了,这个概率“似乎”是不正确的,这便是悖论了(这个被称为悖论的原因也是因为人为直观感觉的概率和实际概率不同)。

Pollard’s Rho 算法

那么竟然有了这个玄学的悖论,我们就可以随机的快速分解n了,2333。
有一个随机函数f(x)=(x*x+d)%n,d=rand()。然后每次随机出来的数和上一次随机出来的数的差值与n去一个最大公因数,然后判断一下就好了。
但是假如一直找不到符合的数然后死循环了怎么办。
我们可以用Floyd发明的机智判环算法,因为我每次a=f(a),再找一个b=f(f(b)),如果有一个时刻a=b那么就退出循环,因为b是以两倍的速度走得,当b追上了a,那么b至少已经走完一圈了。
复杂度O( n 1 4 n^{1\over 4} n41),看上去O(玄学)。

Code

随机函数f

ll f(ll x){
    int u=rand();
    return (cheng(x,x,n)+po)%n;
}

Pollard’s Rho 算法

a=0;
    b=1;
    po=rand()%n+1;
    while(1){
    	a=b=rand()%n+1;
	    while(1){
	        a=f(a);
	    	b=f(f(b));
	    	if(a==b)break;
	    	ll ui=abs(b-a);
	    	ll tt=gcd(ui,n);
	    	if(tt==1||tt==n)continue;
	    	if(tt>1){
			    p=tt;
			    break;
			}
		}  
		po--;
		if(p)break;
    }
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Pollard Rho快速因数分解算法是一种用于分解大整数的算法。它基于随机函数和Floyd判环算法的思想。算法的核心是通过随机函数f(x) = (x^2 + d) % n来生成一系列的数,并计算这些数与上一次生成的数的差值与n的最大公因数。如果找到了一个非平凡的因子,即不等于1和n的因子,那么就可以将n分解为这个因子和n除以这个因子的商。如果在算法的执行过程中出现了循环,即a和b相等,那么可以利用Floyd判环算法来检测到这个循环并退出循环。通过不断重复这个过程,可以逐步分解出n的所有因子。该算法的时间复杂度为O(n^(1/4))。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [【快速因数分解Pollard's Rho 算法](https://blog.csdn.net/doyouseeman/article/details/51204612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [因数分解 Pollard rho](https://blog.csdn.net/lijf2001/article/details/119053616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值