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测试用的红书模板,将测试 ...
随机推荐
- 在openSUSE13.2上gem install rails -v 4.1成功,但是之后不存在rails命令解决
解决方案为,不要用sudo gem install就好了,卧槽
- 使用eclipse开发
Eclipse下载地址:http://www.eclipse.org/ 下载后进行解压缩,点击eclipse.exe即可使用eclipse workspace:工作区 Project:项目 ...
- java路径问题总结
平时写程序的时候,很多时候提示文件找不到,而抛出了异常,现在整理如下[一 相对路径的获得] 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目) St ...
- Java入门到精通——开篇
本系列博客大体框架构思了一段时间了,本系列博客包含了对现有知识的总结也有对未来知识的展望. 本系列博客包括七大部分如下: 第一部分 Java基础应用 讲述JAVA的基础从以下几方面讲述 ...
- RAP开发入门-搭建RAP开发环境(一)
ps:补充 RAP (Remote Application Platform) 官网地址eclipse.org/rap 1.下载IDE http://www.eclipse.org/downloads ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
- oracle 11g 分区表
查看所有用户分区表及分区策略(1.2级分区表均包括): SELECT p.table_name AS 表名, decode(p.partitioning_key_count, 1, '主分区') AS ...
- 部署ghost博客
wget https://ghost.org/zip/ghost-0.6.4.zip npm install --production NODE_ENV=production npm start &g ...
- vnext 技术两篇文章和评论
研究vnext的两篇 好文章,重点看评论! http://www.cnblogs.com/shanyou/p/4589930.html http://www.cnblogs.com/shanyou/p ...
- Asp.NET网站Session浅谈
.NET网站在Web.config的<configuration>下<system.web>下<sessionState>配置session. sessionSta ...