BZOJ3667:Rabin-Miller算法
来源:互联网 发布:python map 源码 编辑:程序博客网 时间:2024/06/06 11:37
传送门
题意:
大素数判断并分解。
题解:
Robin-Miller随机算法。
http://blog.csdn.net/thy_asdf/article/details/51347390
—————————————————————————————————————————
发现以前写得有点水啊,现在来重写一发。
Rabin-Miller检测素数:
首先,检测前9个质数
其次,发现除了2,
Pollard-Rho 大数分解:
设
根据生日悖论,随机选取
需要两两枚举
考虑
神奇的地方来了:
我们使用一个函数来生成伪随机。
换句话说,我们不断地 使用函数 使用函数
并不是 所有的函都能够这样做,但一个神奇的函数可以。
( 我们可以自己指定
我们从
我们来看下面的伪代码:
x:2
while (.. exit criterion .. )
y := f(x);
p := GCD( | y - x | , N);
if ( p > 1)
return “Found factor: p”; x := y;
end
return “Failed. :-(”
假设
你可以发现对于大部分的数据这个算法能够正常运行,但是对于某些数据,它将会进入无限循环。为什么呢?这是因为存在
当它发生的时候,我们会在一个有限数集中进行无限循环
例如,我们可以构造一个伪随机函数并生成如下伪随机数:
在这个例子中,我们最终将会在
那么,如何探测环的出现呢?
一种方法是记录当前产生过的所有的数
在实际过程中,当
另一种方法是由Floyd发明的一个算法,我们举例来说明这个聪明而又有趣的算法。
假设我们在一个很长很长的圆形轨道上行走,我们如何知道我们已经走完了一圈呢?
当然,我们可以像第一种方法那样做,但是更聪明的方法是让A 和B 按照B 的速度是
A 的速度的两倍从同一起点开始往前走,当B 第一次敢上A 时(也就是我们常说的套圈), 我们便知道,B 已经走了至少一圈了。
a := 2;
b := 2;
while ( b != a )
a = f(a); // a runs once
b = f(f(b)); // b runs twice as fast. p = GCD( | b - a | , N);
p = GCD( | b - a | , N);
if ( p > 1)
return “Found factor: p”;
end
return “Failed. :-(“
发现以前学长写的一篇博客挺好的:关于Pollard_rho的期望复杂度证明
#include<bits/stdc++.h>typedef unsigned int uint;typedef long long ll;using namespace std;inline uint unit(){ static uint state0=19491001; state0^=(state0<<13); state0^=(state0>>17); state0^=(state0<<5); return state0;}const int pr[9]={2,3,5,7,11,13,17,19,23};int T;long long n,mx;inline ll gcd(ll a,ll b){ return (b?gcd(b,a%b):a);}inline ll mul(ll a,ll b,ll mod){ return (a*b-(ll)((long double)a/mod*b)*mod+mod)%mod;}inline ll power(ll a,ll b,ll mod){ ll res=1; for(;b;b>>=1,a=mul(a,a,mod))if(b&1)res=mul(res,a,mod); return res;}inline bool mr(ll now){ if(now<=2)return mx=max(mx,now),true; if(!(now&1))return false; ll d=now-1,cnt=0; while(!(d&1))cnt++,d>>=1; for(int i=0;i<=8;i++){ if(pr[i]==now)return true; if(!now%pr[i])return false; ll t=power(pr[i],d,now); if(t==1||t==now-1)continue; for(int j=1;j<=cnt;j++){ ll tmp=power(t,2,now); if(tmp==1&&t!=1&&t!=now-1)return false; t=tmp; } if(t!=1)return false; } return true;}inline ll phi_rho(ll n,ll c){ ll x=unit()%n+1,y=x; while(true){ x=(mul(x,x,n)+c)%n; x=(mul(x,x,n)+c)%n; y=(mul(y,y,n)+c)%n; ll p=(y>x?y-x:x-y); p=gcd(p,n); if(p!=1)return p; }}inline bool solve(ll n){ if(mr(n)){ mx=max(mx,n); return true; } else{ ll d=phi_rho(n,unit()%n); while(d==n)d=phi_rho(n,unit()%n); solve(n/d);solve(d); return false; }}int main(){ scanf("%d",&T); while(T--){ mx=0;scanf("%lld",&n); if(solve(n))puts("Prime"); else printf("%lld\n",mx); }}
- 【BZOJ3667】Rabin-Miller算法
- BZOJ3667: Rabin-Miller算法
- bzoj3667: Rabin-Miller算法
- bzoj3667: Rabin-Miller算法
- bzoj3667 Rabin-Miller算法
- BZOJ3667:Rabin-Miller算法
- bzoj3667 Rabin-Miller算法【Rabin-Miller+pollard_rho】
- 【BZOJ3667】Rabin-Miller算法(Pollard_pho算法)
- 【bzoj3667】Rabin-Miller算法 素数测试
- BZOJ3667: Rabin-Miller算法 (Miller-Rabin&&pol_rho&&特技快速乘学习笔记)
- Miller-Rabin算法
- miller-rabin,Pollard_rho算法
- Miller-Rabin算法
- Rabin-Miller算法
- Miller Rabin算法
- 3667: Rabin-Miller算法
- Miller-Rabin算法
- 3667: Rabin-Miller算法
- Python-图像加噪实现(Gaussian noise+salt and pepper noise)
- 数据库
- 配置Tomcat使用https协议
- 调用电话薄打电话
- Android Html.fromHtml(String)过时的替代方法
- BZOJ3667:Rabin-Miller算法
- VR中录屏效果
- KEIL L107 ADDRESS SPACE OVER
- 现代启发式算法(一)——遗传算法
- 1006. 换个格式输出整数 (15)
- ARM linux 时区开发
- Python学习笔记6_class
- css复习——文字与文本 day3
- CentOS 7配置aliyun的yum源