POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime。若为合数,输出最小的素因子。
思路:Pollard rho大整数分解,模板题
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cstdlib>
#include <cmath> using namespace std;
long long n;
long long minf;
long long multi(long long a,long long b,long long mod){
a=a%n;
long long ret=;
while(b){
if(b&){
//ret=(ret+a)%mod;
ret=ret+a;
if(ret>=mod)
ret-=mod; //原来用取模1500ms,现在547ms。速度变为原来的1/3,没想到取模那么慢。。。
}
a=a<<;
if(a>=mod)
a-=mod;
//a=(a+a)%mod;
b=b>>;
}
return ret;
}
long long quickPow(long long a,long long b,long long mod) {
long long ret=;
while(b) {
if(b&)
ret=multi(ret,a,mod);
a=multi(a,a,mod);
b=b>>;
}
return ret;
} bool witness(long long a,long long n) {
long long m=n-;
int j=;
while(!(m&)) {
j++;
m=m>>;
}
long long x=quickPow(a,m,n);
if(x==||x==n-)
return false;
while(j--) {
x=(x*x)%n;
if(x==n-)
return false;
}
return true;
}
//用这个547ms
bool Miller_Rabin(long long n) {
if(n<)
return false;
if(n==)
return true;
if(!(n&))
return false;
long long m=n-;
int j=;
while(!(m&)) {
j++;
m=m>>;
}
for(int i=; i<=; i++) {
long long a=rand()%(n-)+;
long long x=quickPow(a,m,n);
if(x==||x==n-)
continue; //n可能为素数
int k=j;
bool flag=false;
while(k--) {
x=(x*x)%n;
if(x==n-){
flag=true; //n可能为素数
break;
}
}
if(flag)
continue;
return false; //n为合数
}
return true;
}
//用这个454ms
bool Miller_Rabin2(long long n)
{
if(n==)return ;
if(n<||!(n&))return ; long long a, u=n-, x, y;
int t=;
while(u%==){
t++;
u/=;
}
srand();
for(int i=;i<;i++)
{
a = rand() % (n-) + ;
x = quickPow(a, u, n);
for(int j=;j<t;j++)
{
y = multi(x,x,n);
//如果n是素数那么x^2mod n = 1,仅有两个根(不同余),+1和-1(n-1)。如果当x^2 mod n=1,但是x不为1或n-1,那么n是合数
if ( y == && x != && x != n- )
return false; //为合数
x = y;
}
if( y!=) return false;//最后y的值为a^(n-1)。由费马小定理 a^(n-1) mod n 恒等于 1 则可以认为 n 是素数。若有不为1的情况,则n为合数
}
return true;
} long long gcd(long long a,long long b) {
return b==?a:gcd(b,a%b);
}
long long pollard_rho(long long n,long long c) {
long long x,y,d,i=,k=;
x=rand()%(n-)+;
y=x;
while() {
i++;
x=(multi(x,x,n)+c)%n;
d=gcd(y-x,n);
if(<d && d<n)
return d;
if(y==x)
return n;
if(i==k) {
y=x;
k=k<<;
}
}
}
//对n进行素数分解
void factorFind(long long n,int k) {
if(n==)
return;
if(Miller_Rabin(n)) {
if(n<minf)
minf=n;
return;
}
long long p=n;
while(p>=n)
p=pollard_rho(p,k--);
factorFind(p,k);
factorFind(n/p,k);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%I64d",&n);
minf=n+;
if(Miller_Rabin(n))
printf("Prime\n");
else {
factorFind(n,);
printf("%I64d\n",minf);
}
}
return ;
}
POJ 1811 Prime Test (Pollard rho 大整数分解)的更多相关文章
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- Pollard Rho大质数分解学习笔记
目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...
- Miller&&Pollard POJ 1811 Prime Test
题目传送门 题意:素性测试和大整数分解, N (2 <= N < 254). 分析:没啥好讲的,套个模板,POJ上C++提交 收获:写完这题得到模板 代码: /************** ...
- POJ 1811 Prime Test( Pollard-rho整数分解经典题 )
链接:传送门 题意:输入 n ,判断 n 是否为素数,如果是合数输出 n 的最素因子 思路:Pollard-rho经典题 /************************************** ...
- Miller_rabin算法+Pollard_rho算法 POJ 1811 Prime Test
POJ 1811 Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 32534 Accepted: 8 ...
- POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)
题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...
- POJ 1811 Prime Test
题意:对于一个大整数,判断是否质数,如果不是质数输出最小质因子. 解法:判断质数使用Miller-Rabin测试,分解质因子使用Pollard-Rho,Miller-Rabin测试用的红书模板,将测试 ...
随机推荐
- EmguCV学习——简单算法 差分与高斯
公司项目需要检测运动物体,我对opencv也没啥研究,google了好久看了好多方法,最简单的就是差分与高斯背景建模了. 旁边搞c++的同事正在搞更nb的算法,等出来了 我再转成C#版的分享. 先看差 ...
- python2 编码问题详解
实例对比 定义 type str unicode print encode('utf8') decode('utf8') encode('unicode-escape') encode('string ...
- hdu 5253 连接的管道
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5253 连接的管道 Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老 ...
- Object C学习初步
最近乘着项目不太紧张的时候,赶紧给自己冲了一下电.其实我自己最熟悉的平台应该是.net,所以当初上手windows phone的话是很快,我记得当初是一边跟着项目进展,一边自己开始学习前台的XAML语 ...
- iOS学习之C语言循环结构
一.while循环 while (循环条件) { 循环体: } // 1.定义循环变量 int time = 1; // 2.循环条件 while ( ...
- iOS8 超简单的设置圆角按钮 ImageView等UIView
button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...
- VC++ MFC 如何实现在编辑框中输出具有换行功能的文段 01
很久不来写东西了,昨天睡觉前写个小工具,突然,这玩意不会换行怎么整... 首先是第一步,获取字符串的长度,转载自白乔的文章. ------------------------------------- ...
- Indigo Studio
http://www.infragistics.com/products/indigo-studio?gclid=CIXrnav4lcQCFdclvQoduVEAnA
- SQL-行转列(PIVOT)实例1
--未旋转之前的查询结果 select s.Name ShiftName,h.BusinessEntityID,d.Name as DpartmentName from HumanResources. ...
- REST API 基于ACCESS TOKEN 的权限解决方案
REST 设计原则是statelessness的,而且但客户端是APP时,从APP发起的请求,不是基于bowers,无法带相同的sessionid,所以比较好的方案是每次请求都带一个accesstok ...