POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意
给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子
题解
看了一整天《初等数论及其应用》相关部分,终于把Miller–Rabin和Pollard's rho这两个算法看懂了O(∩_∩)O~~
Miller–Rabin主要用到了费马小定理,即:设p是一个素数,a是一个正整数且p不整除a,则ap-1≡1(mod p).若x=b(n-1)/2,x2=bn-1≡1(mod n),如果n是一个素数,则x≡1(mod n)或者x≡-1(mod n).因此,一旦我们有bn-1≡1(mod n),则可以检验b(n-1)/2≡±1(mod n)是否成立.若该同余式不成立,则可知n合数.因此我们可以令n-1=2tu,(t>=1且 u是奇数),bn-1≡(bu)^2t(mod n),通过先计算bu,然后对结果连续平方t次来计算bn-1(mod n),如果通过这种这种测试,则称n通过了以b为基数的米勒检验,我们可以多选取几个b,如果都通过了检测,则n有很大的机率是素数~~~
Pollard's rho 主要是基于Floyd's cycle-finding algorithm,算导上图非常形象~~讲得也挺好~~~我就不造轮子了。。。。我选取的函数式f(x)=x^2+1,每次都跑了1000多ms%>_<%。。。
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- typedef unsigned long long LL;
- LL min(LL a,LL b)
- {
- return a<b?a:b;
- }
- LL gcd(LL a,LL b)
- {
- return b==0?a:gcd(b,a%b);
- }
- LL mult_mod(LL a,LL b,LL mod)
- {
- LL ans=0;
- while(b)
- {
- if(b&1)
- ans=(ans+a)%mod;
- a=(a<<1)%mod;
- b>>=1;
- }
- return ans;
- }
- LL pow_mod(LL a,LL b,LL mod)
- {
- LL d=1;
- a%=mod;
- while(b)
- {
- if(b&1)
- d=mult_mod(d,a,mod);
- a=mult_mod(a,a,mod);
- b>>=1;
- }
- return d%mod;
- }
- bool witness(LL a,LL n)
- {
- LL u=n-1,t=0;
- while((u&1)==0)
- {
- u>>=1;
- t++;
- }
- LL x,x0=pow_mod(a,u,n);
- for(LL i=1; i<=t; i++)
- {
- x=mult_mod(x0,x0,n);
- if(x==1&&x0!=1&&x0!=(n-1))
- return true;
- x0=x;
- }
- if(x!=1)
- return true;
- return false;
- }
- bool miller_rabin(LL n)
- {
- if(n==2) return true;
- if(n<2||!(n&1)) return false;
- for(int j=1; j<=8; j++)
- {
- LL a=rand()%(n-1)+1;
- if(witness(a,n))
- return false;
- }
- return true;
- }
- LL pollard_rho(LL n)
- {
- LL i=1,x=2,y=2,k=2,d;
- while(true)
- {
- i++;
- x=(mult_mod(x,x,n)+1)%n;
- d=gcd(y-x,n);
- if(d!=1&&d!=n)
- return d;
- if(x==y) return n;
- if(i==k)
- {
- y=x;
- k<<=1;
- }
- }
- }
- LL find_minfac(LL n)
- {
- if(miller_rabin(n)||n<=1)
- return n;
- LL p=pollard_rho(n);
- LL q=min(find_minfac(p),find_minfac(n/p));
- return q;
- }
- int main()
- {
- int T;
- LL n;
- scanf("%d",&T);
- srand(time(NULL));
- while(T--)
- {
- scanf("%I64u",&n);
- if(n>2&&n%2==0) printf("2\n");
- else if(n==2||miller_rabin(n))
- printf("Prime\n");
- else
- printf("%I64u\n",find_minfac(n));
- }
- return 0;
- }
POJ1811- Prime Test(Miller–Rabin+Pollard's rho)的更多相关文章
- 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 这 ...
- 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式
找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...
- POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)
http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
随机推荐
- MVC-Razor引擎布局
ViewBag.Title:标题 layout: @ViewBag.Title view: @{ViewBag.Title="标题"} @RenderBody():视图的内容直接渲 ...
- 敏捷开发概述与路线(转自MBAlib)
敏捷开发的概述 简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项 ...
- javascript pattern
bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...
- php重定向跳转
一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("Co ...
- POJ 2289 Jamie's Contact Groups & POJ3189 Steady Cow Assignment
这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...
- [jobdu]丑数
由于思维的惯性,用了queue.后来发现一要注意要用集合判重,二是每次往queue里放的多,后来溢出了,要用long long.但这样要用数组,集合,队列,内存多.效率是O(n*logn)的. #in ...
- 这些小众软件让你的效率提升N倍!(必备,收藏)
大部分的我们,电脑买来之后,软件越装越多,电脑越来越卡,导致工作的效率也是越来越低. 同时还可能长期处于软件安装完又卸载的无限恶性循环中.提高工作效率是我们利用电脑办公的一大优势,安装好的软件更是可以 ...
- C语言考试解答十题
学院比较奇葩,大一下期让学的VB,这学期就要学C++了,然后在开学的前三个周没有课,就由老师讲三个周的C语言,每天9:30~11:30听课,除去放假和双休日,实际听课时间一共是12天*2小时,下午是1 ...
- 基于dojo模板的widget
参考:http://niweiwei.iteye.com/blog/1539863 http://dojotoolkit.org/reference-guide/1.8/dijit/_Template ...
- Visual Studio 那些隐藏的调试功能(转)
原文出处: 微软互联网开发支持 Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...