Prime Test(POJ 1811)
素数判定的模板题,运用米勒-罗宾素数判定,然后用Pollard_Rho法求出质因数。使用相应的模板即可,不过注意存储质因子的数组需要使用vector,并且使用long long类型存储,不然存储不下,而且输出最下的质因子时,需要写个迭代器进行查询。
完整代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; typedef long long LL;
vector <LL> fac;
LL gcd(LL a, LL b)
{
return b == ? a : gcd(b, a%b);
} LL mul_mod(LL a, LL x, LL n) ///计算a*x%n,其中t用于存储结果,当t>=n的时候,t对n的模减去n即可(不会出现t>=2*n的情况,因为a也对n取了模)
{
LL t = ;
while(x)
{
if(x & )
{
t += a;
if(t >= n) t -= n;
}
a <<= ;
if(a >= n) a -= n;
x >>= ;
}
return t;
} LL pow2_mod(LL a, LL x, LL n)/// //乘方快速幂
{
LL t = ;
a %= n;
while(x)
{
if(x & ) t = mul_mod(t, a, n);
a = mul_mod(a, a, n);
x >>= ;
}
return t;
}
///不断选取不超过n-1的基b(s次),计算是否每次都有b^(n-1) ≡ 1(mod n),若每次都成立则n是素数,否则为合数。
bool test(LL n, LL a, LL d)///n 为测试数,a为素数表中的数,d为正奇数,这里运用位运算,将n-1不断通过快速幂,同时将n-1向左位移,进行抽出指数中2的操作,从而不断进行素数检测
{
if(n == ) return true;///为2肯定是素数
if(n == a) return true;///如果n等于素数表里面的数则肯定是素数
if((n&) == ) return false;///如果是偶数,则肯定不是素数
while(!(d&)) d >>=;///选取奇数
LL t = pow2_mod(a, d, n);///进行快速幂运算
while((d != n-) && (t != ) && (t != n-))///由二次探测定理可知,只有当t等于1或者n-1时,n才为素数
{
/// t = (LL)t*t%n;
t = mul_mod(t, t, n);
d = d<<;
}
return (t == n- || (d&) == );
} bool isPrime(LL n)
{
///有些题目把1看作质数,但是负数不会是质数
if(n < ) return false;
LL a[] = {, , };
for(int i = ; i <= ; i++) if(!test(n, a[i], n-)) return false;
return true;
} LL Pollard_Rho(LL n, LL c)
{
LL x, y, d;
LL i = , k = ;
x = y = rand() % n;
do
{
i++;
d = gcd(n + y - x, n);
if(d > && d < n) return d;
if(i == k)
{
y = x;
k <<= ;
}
x = (mul_mod(x, x, n) + n - c) % n;
}
while(y != x);
return n;
}
void rhoAll(LL n)
{
if(n <= ) return;
if(isPrime(n))
{
fac.push_back(n);
return;
}
LL t = n;
while(t >= n)
t = Pollard_Rho(n, rand() % (n-) + );
rhoAll(t);
rhoAll(n/t);
return;
} int main()
{
LL n;
int t;
cin>>t;
while(t--)
{
while(cin>>n)
{
if(isPrime(n))
cout<<"Prime"<<endl;
else
{
fac.clear();
rhoAll(n);
LL mins=;
for(vector<LL> ::iterator it=fac.begin();it!=fac.end();++it)
mins=min(mins,*it);
cout<<mins<<endl;
}
}
}
return ;
}
其中米勒-罗宾判断法模板如下:
typedef long long LL;
LL gcd(LL a, LL b)
{
return b == ? a : gcd(b, a%b);
} LL mul_mod(LL a, LL x, LL n) ///计算a*x%n,其中t用于存储结果,当t>=n的时候,t对n的模减去n即可(不会出现t>=2*n的情况,因为a也对n取了模)
{
LL t = ;
while(x)
{
if(x & )
{
t += a;
if(t >= n) t -= n;
}
a <<= ;
if(a >= n) a -= n;
x >>= ;
}
return t;
} LL pow2_mod(LL a, LL x, LL n)/// //乘方快速幂
{
LL t = ;
a %= n;
while(x)
{
if(x & ) t = mul_mod(t, a, n);
a = mul_mod(a, a, n);
x >>= ;
}
return t;
}
///不断选取不超过n-1的基b(s次),计算是否每次都有b^(n-1) ≡ 1(mod n),若每次都成立则n是素数,否则为合数。
bool test(LL n, LL a, LL d)///n 为测试数,a为素数表中的数,d为正奇数,这里运用位运算,将n-1不断通过快速幂,同时将n-1向左位移,进行抽出指数中2的操作,从而不断进行素数检测
{
if(n == ) return true;///为2肯定是素数
if(n == a) return true;///如果n等于素数表里面的数则肯定是素数
if((n&) == ) return false;///如果是偶数,则肯定不是素数
while(!(d&)) d >>=;///选取奇数
LL t = pow2_mod(a, d, n);///进行快速幂运算
while((d != n-) && (t != ) && (t != n-))///由二次探测定理可知,只有当t等于1或者n-1时,n才为素数
{
/// t = (LL)t*t%n;
t = mul_mod(t, t, n);
d = d<<;
}
return (t == n- || (d&) == );
} bool isPrime(LL n)
{
///有些题目把1看作质数,但是负数不会是质数
if(n < ) return false;
LL a[] = {, , };
for(int i = ; i <= ; i++) if(!test(n, a[i], n-)) return false;
return true;
}
Pollard_Rho法求大数的质因子代码模板如下:
vector <LL> fac;
LL Pollard_Rho(LL n, LL c)
{
LL x, y, d;
LL i = , k = ;
x = y = rand() % n;
do
{
i++;
d = gcd(n + y - x, n);
if(d > && d < n) return d;
if(i == k)
{
y = x;
k <<= ;
}
x = (mul_mod(x, x, n) + n - c) % n;
}
while(y != x);
return n;
}
void rhoAll(LL n)
{
if(n <= ) return;
if(isPrime(n))
{
fac.push_back(n);
return;
}
LL t = n;
while(t >= n)
t = Pollard_Rho(n, rand() % (n-) + );
rhoAll(t);
rhoAll(n/t);
return;
}
迭代器书写格式如下:
vector<LL> ::iterator it=fac.begin()///用于遍历vector数组
Prime Test(POJ 1811)的更多相关文章
- 模板题Pollard_Rho大数分解 A - Prime Test POJ - 1811
题意:是素数就输出Prime,不是就输出最小因子. #include <cstdio> #include<time.h> #include <algorithm> ...
- 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 ...
- Miller_rabin算法+Pollard_rho算法 POJ 1811 Prime Test
POJ 1811 Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 32534 Accepted: 8 ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
- Prime Path(POJ - 3126)【BFS+筛素数】
Prime Path(POJ - 3126) 题目链接 算法 BFS+筛素数打表 1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步.要求每次只能变1位,并且变1位后仍然 ...
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- poj 1811 Prime Test 大数素数测试+大数因子分解
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 27129 Accepted: 6713 Case ...
- Miller&&Pollard POJ 1811 Prime Test
题目传送门 题意:素性测试和大整数分解, N (2 <= N < 254). 分析:没啥好讲的,套个模板,POJ上C++提交 收获:写完这题得到模板 代码: /************** ...
- POJ 1811 Prime Test(Miller-Rabin & Pollard-rho素数测试)
Description Given a big integer number, you are required to find out whether it's a prime number. In ...
随机推荐
- possible error
1● regedit 2● path [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Windows Error Reporting] 3● 步 ...
- AI工具5.13
如果想选中上面的很多图形,可以锁定不需要选择的下面的图形.选择需要锁定的对象.“对象”“锁定”“所选对象” “对象”“变换”“再次变换”快捷键“ctrl=d"一般前面有其他操作如“移动”“复 ...
- 线性回归决定系数之Why SST=SSE+SSR
线性最小二乘法的原则是使得误差的平方和最小,即 为了使S最小,令其对参数的偏导数为零: 即 即 根据方程1和方程2,得 又∵ ∴ 参考链接:https://math.stackexchange.com ...
- ajax参数传递之[HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]请求
$.ajax({ type: "get", url: "http://localhost:27221/api/Charging/GetByModel", con ...
- bzoj4278
题解: 把第一个串放好,加一个oo 然后把第二个串倒序放进来 然后就是http://www.cnblogs.com/xuanyiming/p/8510231.html这一题了 代码: #include ...
- 【转载四】Grafana系列教程–Grafana基本概念
在上面几篇文章中,我们介绍了Grafana的安装配置以及运行的方法,本篇文章我们就来介绍下Grafana的基本概念. 有问题欢迎加群讨论,InfluxDB&Grafana技术交流群:58048 ...
- [Leetcode 44]通配符匹配Wildcard Matching
[题目] 匹配通配符*,?,DP动态规划,重点是*的两种情况 想象成两个S.P长度的字符串,P匹配S. S中不会出现通配符. [条件] (1)P=null,S=null,TRUE (2)P=null, ...
- bootstrap table 列求和
<div class="modal fade in" id="_modalDialog" tabindex="1" role=&quo ...
- centos7安装配置tomcat
第一步:下载Tomcat8压缩包 进入 http://tomcat.apache.org/download-80.cgi 下载tar.gz压缩包 第二步:用ftp工具把压缩包上传到/home/data ...
- centos中PATH环境变量查看和修改
PAHT环境变量 :定义的是系统搜索命令的路径.<就是自己写的程序不打绝对路径就可以执行,必须放到 $PATH这个文件中>查看命令:echo $PATH 以添加mongodb server ...