Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法
Time Limit: 60 Sec Memory Limit: 512 MB
Submit: 1044 Solved: 322
[Submit][Status][Discuss]
Description
Input
第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime
第二,如果不是质数,输出它最大的质因子是哪个。
Output
第一行CAS(CAS<=350,代表测试数据的组数)
以下CAS行:每行一个数字,保证是在64位长整形范围内的正数。
对于每组测试数据:输出Prime,代表它是质数,或者输出它最大的质因子,代表它是和数
Sample Input
2
13
134
8897
1234567654321
1000000000000
Sample Output
Prime
67
41
4649
5
HINT
数据范围:
保证cas<=350,保证所有数字均在64位长整形范围内。
分析:虽然题目叫做Miller rabin算法,不过真正上也需要Pollard rho算法
- /*貌似这个代码在BZOJ上的评测器就会运行错误,但是在POJ上一道原题却通过了(POJ上语言选C++可以过,选择G++就过不了)*/
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #define S 10
- #include<cstdlib>
- #include<ctime>
- #define ll long long
- ll cas, maxz=-;
- ll read()
- {
- ll ans=;char c;
- c=getchar();
- while(c<''||c>'') c=getchar();
- while(c>=''&&c<='')
- {
- ans=ans*+c-'';
- c=getchar();
- }
- return ans;
- }
- ll quick_mul_mod(ll a,ll b,ll c)//a*b%c
- {
- ll ret=;
- a%=c;b%=c;
- while(b)
- {
- if(b&)
- {
- ret+=a;
- ret%=c;
- b--;
- }
- a<<=;
- a%=c;
- b>>=;
- }
- return ret;
- }
- ll gcd(ll a,ll b)
- {
- if(a==) return ;
- if(a<) return gcd(-a,b);
- if(b==)
- return a;
- return gcd(b,a%b);
- }
- ll Pollard_rho(ll x,ll c)
- {
- ll x1=rand()%(x-)+;
- ll x2=x1;
- int i=,k=;
- while()
- {
- i++;
- x1=(quick_mul_mod(x1,x1,x)+c)%x;
- ll d=gcd(x2-x1,x);
- if(d!=&&d!=x) return d;
- if(x2==x1) return x;
- if(i==k)
- {
- x2=x1;
- k+=k;
- }
- }
- }
- ll quick_mod(ll a,ll b,ll c)//ji suan a^b%c
- {
- ll ans=;
- a%=c;
- while(b)
- {
- if(b&)
- {
- b--;
- ans=quick_mul_mod(ans,a,c);
- }
- b>>=;
- a=quick_mul_mod(a,a,c);
- }
- return ans;
- }
- bool Miller_rabin(ll n)
- {
- if(n==) return true;
- if(n<=||!(n&)) return false;
- ll u=n-,t=;
- while(!(u&))
- {
- u>>=;
- t++;
- }
- for(int i=;i<S;++i)
- {
- ll x=rand()%(n-)+;
- x=quick_mod(x,u,n);
- for(int i=;i<=t;++i)
- {
- ll y=quick_mul_mod(x,x,n);
- if(y==&&x!=&&x!=n-)
- return false;
- x=y;
- }
- if(x!=) return false;
- }
- return true;
- }
- void findpri(ll n)
- {
- if(n==) return;
- if(Miller_rabin(n))
- {
- maxz=max(maxz,n);
- return;
- }
- ll p=n;
- while(p==n)
- p=Pollard_rho(p,rand()%(n-)+);
- findpri(p);
- findpri(n/p);
- }
- int main()
- {
- srand(time());
- cas=read();
- while(cas--)
- {
- maxz=;
- ll n=read();
- findpri(n);
- if(maxz==n)/*最大的质因数就是本身*/
- printf("Prime\n");
- else printf("%lld\n",maxz);
- }
- return ;
- }
Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法的更多相关文章
- Pollard Rho 算法简介
\(\text{update 2019.8.18}\) 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Pollard Rho算法浅谈
Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...
- 初学Pollard Rho算法
前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...
- BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho
BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- 浅谈 Miller-Robbin 与 Pollard Rho
前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- Pollard Rho因子分解算法
有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...
随机推荐
- docker使用现有容器生成新的镜像
/*运行docker run后 --则进入该容器里了 我们做一些变更,比如安装一些东西 ,然后针对这个容器进行创建新的镜像 */ 基本形式: docker commit -m "change ...
- 64_p5
php-nette-bootstrap-2.4.3-1.fc26.noarch.rpm 20-Feb-2017 07:19 16290 php-nette-caching-2.5.3-1.fc26.n ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- Freemaker 自定义指令和函数
自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...
- Loadrunner下WebTours系统自带的用户名和密码
打开:http://127.0.0.1:1080/WebTours/ 系统默认自带两个用户名和密码,位于~\WebTours\MercuryWebTours\users: 1.用户名:joe,密码:y ...
- 域名 DNS命令——dig
dig命令详解 1.查看域名的A记录 # dig yahoo.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.e ...
- ios app应用在显示屏幕上改中文名
1.点击项目名 2.选Build settings 搜索 product name 3.双击,改为需要在手机上显示的应用名
- 【转+整理+答案】python315+道面试题
提示 自己整理的答案,很局限,如有需要改进的地方,或者有更好的答案,欢迎提出! [合理利用 Ctrl+F 提高查找效率] 第一部分 Python基础篇(80题) 1.为什么学习Python? # 因为 ...
- javascript练习(二)
案例 输出100个数字 案例 打印100以内 7的倍数 案例 打印100以内的奇数 案例 打印100以内所有偶数的和 打印图形 ********** ********** ********** ...
- 洛谷P1720 月落乌啼算钱 题解
题目传送门 初看题目,好难.再看一次,探索规律,发现这就是有名的斐波那契数列. F[i]=f[i-1]+f[i-2] SO 代码很简单,貌似要开long long,又貌似不用开. #include&l ...