Miller-Rabin素性测试算法:

  根据费马小定理当p为素数时成立,所以如果存在一个a使x不满足此定理,则x必然不为素数。

  但这是充分条件而不是必要条件,所以对于每个a,可能存在满足定理的x,这时就要选取多个a同时检测,这种验证素性的方法即为Miller-Rabin算法。

  当a取2,3,5,7时,可以直接检测1e13内的所有整数。

  但是存在非素数通过检测,这时需要进行二次检测。

  可以证明当p为奇素数时,$x^2\equiv 1(mod\ p)$的解有且仅有两个:1和p-1。根据这个定理可以再次检测出一些非素数。

  但是仍然存在一些数无法辨别,这些数被称为“强伪素数”,多选取一些数为底数检测即可(一般在[1,p)内选3个左右做二次检测就可以保证一定的正确率了)。

  概括一下算法的具体流程:

  1.先特判掉1,2和2的倍数。

  2.选取3个以上[1,p)的数a。

  3.对每个a先将p-1中2的因子去除,再逐个加上并实时检测是否出现不合法情况。

  4.同时要注意判定$a^{p-1}\equiv 1(mod\ p)$

Pollard-Rho质因数分解算法:

  一种复杂度证明较为复杂的算法,主要思想是先求出n的一个因子p,然后对于p和n/p分别递归下去,如果发现p为素数则停止递归。(这里判断素数需要用到Miller-Rabin)。

  主要思想是,让a和b同时在$f(x)=x^2+c$的轨迹上走(c需要变化),每2的次幂步进行一次a=b。每次判定若gcd(|a-b|,n)在(1,n)中则返回,当a==b时退出。

  这样的算法,如果将a和b直到a=b的轨迹画出来,会是一条链加一个环,a每次在上面走1步,b走两步,形如$\rho$。

 #include<cstdio>
#include<vector>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; vector<ll>ls;
const int A[]={,,,,,,,};
ll T,e,n,c,d,y,p,r,w,mx;
ll Rand(ll l,ll r){ return (((ll)rand()<<)+rand())%(r-l+)+l; }
ll gcd(ll a,ll b){ return (b) ? gcd(b,a%b) : a; } ll ksc(ll a,ll b,ll p)
{
ll t=a*b-(ll)((long double)a*b/p+0.5)*p;
return (t<)?t+p:t;
} ll ksm(ll a,ll b,ll mod){
ll res=;
for (; b; a=ksc(a,a,mod),b>>=)
if (b & ) res=ksc(res,a,mod);
return res;
} ll find(ll n,int c){
ll i=,k=,x=Rand(,n-),y=x,d;
while (){
i++; x=(ksc(x,x,n)+c)%n; d=gcd(abs(y-x),n);
if (d> && d<n) return d;
if (y==x) return -;
if (i==k) y=x,k<<=;
}
} ll Rho(ll n,int c){ ll p=-; while (p==-) p=find(n,c--); return p; } bool chk(ll a,ll n){
ll m=n-,x,y; int k=;
while (!(m&)) m>>=,k++;
x=ksm(a,m,n);
rep(i,,k){
y=ksm(x,,n);
if (y== && x!= && x!=n-) return ;
x=y;
}
return y!=;
} bool Miller(ll n){
if (n==) return ;
if (!(n&)) return ;
rep(i,,) if (chk(Rand(,n-),n)) return ;
return ;
} void Fac(ll x,int c){
if (x==) return;
if (Miller(x)) { ls.push_back(x); return; }
ll p=Rho(x,c); Fac(p,c);
while (x%p==) x/=p;
Fac(x,c);
} int main(){
for (scanf("%lld",&T); T--; ){
scanf("%lld",&n); ls.clear();
if (Miller(n)) { puts("Prime"); continue; }
Fac(n,); mx=;
for (vector<ll>::iterator it=ls.begin(); it!=ls.end(); it++) mx=max(mx,*it);
printf("%lld\n",mx);
}
return ;
}

Miller-Rabin与Pollard-Rho备忘的更多相关文章

  1. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  2. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  3. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  4. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  5. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  6. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  7. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  8. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  9. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  10. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 解决mysql的日志文件过大的问题

    https://www.2cto.com/database/201203/122984.html

  2. wget、yum、rpm、apt-get区别

    wget 类似于迅雷,是一种下载工具, 通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理 名字是World Wide Web”与“get”的结合. yum: 是 ...

  3. jsp分页完善版

    明天要考网络工程师了,而且这两天校运会,把那个分页的完善了下,明天考试,祈祷吧,我根本都没看书啊,所以只能去长见识了.100大洋啊,下个学期我想考考证了,不然以后出去麻烦了.呵呵,不多说还是说说自己对 ...

  4. 金山中学 rugular SRM 04 ——纪念我的第一次Ak

    虽然只是一场比较简单的比赛 但奈何我也比较弱啊.... T1 一道计算概率的题目 T SRM 04 描述 给个长度为 n 的数列,每次操作能将数列打乱(RandomShuffle),问在期望下需要多少 ...

  5. 关于jQuery.extend

    这次来了解下jQuery的extend吧,作为菜鸟的我学艺不精,看插件时经常看到extend函数的使用,从网上看到一篇不错的介绍,特地转载过来留给自己收藏学习: ------------------- ...

  6. js判断浏览器是否为ie

    使用传统方式 if ((navigator.userAgent.indexOf('MSIE') >= 0) && (navigator.userAgent.indexOf('Op ...

  7. loggin

    # 参考:https://www.cnblogs.com/DI-DIAO/p/8793136.html BASE_LOG_DIR = os.path.join(BASE_DIR, "log& ...

  8. 让Playground支持UIKit框架

    http://blog.diveinedu.cn/playground_uikit_ios/ 让Playground支持UIKit框架 发表于 作者 排云鹤 — 暂无评论 ↓ Xcode 6新增了Pl ...

  9. Linux内核线程之深入浅出【转】

    转自:http://blog.csdn.net/yiyeguzhou100/article/details/53126626 [-] 线程和进程的差别 线程的分类 1     内核线程 2     轻 ...

  10. Android源码的BUG

    在Android系统移植过程中,遇到很多源码上的BUG.但是我们看到市面上都是没有这些问题的.难道这些BUG在每个开发商都要经历一次解BUG的过程吗?Android释放的源码是否是最新的?暂时没有想法 ...