POJ1811

给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数

随机素数测试(Miller_Rabin算法)

求整数素因子(Pollard_rho算法)

科技题

 #include<cstdlib>
#include<cstdio>
const int maxn=;
const int S=;
int tot;
long long n;
long long factor[maxn];
long long muti_mod(long long a,long long b,long long c)
{
//(a*b) mod c a,b,c<2^63
a%=c;
b%=c;
long long ret=;
while(b)
{
if(b&)
{
ret+=a;
if(ret>=c) ret-=c;
}
a<<=;
if(a>=c) a-=c;
b>>=;
}
return ret;
}
long long pow_mod(long long x,long long n,long long mod)
{
//x^n mod c
if(n==) return x%mod;
int bit[],k=;
while(n)
{
bit[k++]=n&;
n>>=;
}
long long ret=;
for(k=k-;k>=;k--)
{
ret=muti_mod(ret,ret,mod);
if(bit[k]==) ret=muti_mod(ret,x,mod);
}
return ret;
}
bool check(long long a,long long n,long long x,long long t)
{
long long ret=pow_mod(a,x,n),last=ret;
for(int i=;i<=t;i++)
{
ret=muti_mod(ret,ret,n);
if(ret==&&last!=&&last!=n-) return ;
last=ret;
}
if(ret!=) return ;
return ;
}
bool Miller_Rabin(long long n)
{
long long x=n-,t=;
while((x&)==) x>>=,t++;
bool flag=;
if(t>=&&(x&)==)
{
for(int k=;k<S;k++)
{
long long a=rand()%(n-)+;
if(check(a,n,x,t)) {flag=;break;}
flag=;
}
}
if(flag==||n==) return ;
return ;
}
long long gcd(long long a,long long b)
{
if(a==) return ;
if(a<) return gcd(-a,b);
while(b)
{
long long t=a%b;a=b;b=t;
}
return a;
}
long long Pollard_rho(long long x,long long c)
{
long long i=,x0=rand()%x,y=x0,k=;
while()
{
i++;
x0=(muti_mod(x0,x0,x)+c)%x;
long long d=gcd(y-x0,x);
if(d!=&&d!=x) return d;
if(y==x0) return x;
if(i==k)
{
y=x0;
k+=k;
}
}
}
void findfac(long long n) //递归分解质因数
{
if(!Miller_Rabin(n))
{
factor[tot++]=n;
return;
}
long long p=n;
while(p>=n) p=Pollard_rho(p,rand()%(n-)+);
findfac(p);
findfac(n/p);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%I64d",&n);
if(!Miller_Rabin(n))
{
printf("Prime\n");
continue;
}
tot=;
findfac(n);
long long ans=factor[];
for(int i=;i<tot;i++)
if(factor[i]<ans) ans=factor[i];
printf("%I64d\n",ans);
}
return ;
}

数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)的更多相关文章

  1. HDU2138 随机素数测试 Miller-Rabin算法

    题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...

  2. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  3. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  5. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  6. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

  7. Miller-Rabin素数测试算法(POJ1811Prime Test)

    题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...

  8. Miller-Rabin素数测试算法

    用来干嘛的 ​   要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) ...

  9. Miller-Rabbin随机性素数测试算法

    //**************************************************************** // Miller_Rabin 算法进行素数测试 //速度快,而且 ...

随机推荐

  1. 下载与安装APache Cordova

    最近老师留了写网页版或手机版程序,但先前没有好好听javaweb,而今年又没选Android移动应用开发.所以去图书馆借了一本书是关于HTML5+CSS3+jQueryMobile的. 这几天配置了打 ...

  2. Strust2: 工作流程

    以下为Struts2的体系结构图: Struts2框架处理用户请求,大体分为以下几个过程: (1)用户发出一个HttpServletRequest请求 (2)请求经过一系列过滤器,最后达到Filter ...

  3. node+express搭建个人网站(1)

    我的个人网站 http://yangchaojie.top/ 首先了解一下node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个 ...

  4. 第190天:js---String常用属性和方法(最全)

    String常用属性和方法 一.string对象构造函数 /*string对象构造函数*/ console.log('字符串即对象');//字符串即对象 //传统方式 - 背后会自动将其转换成对象 / ...

  5. HDU4473_Exam

    很考验智商的一个题目,赛后看完别人的题解后秒懂了. 首先定义一个函数f(x)表示a,b的有序组合情况数使得a*b为x的一个约数. 现在给定你一个n,要你求出f(1)+f(2)+……+f(n): 题目智 ...

  6. java map的 keyset()方法

  7. bzoj4754[JSOI2016]独特的树叶

    这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...

  8. [十七]SpringBoot 之 使用自定义的properties

    Springboot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们应该怎么做呢. 如果继续在application.properties中添加 如: ...

  9. DNA Sequence POJ - 2778 (ac自动机 + 快速幂)

    题意: 给出患病的DNA序列,问序列长度为n的,且不包含患病的DNA序列有多少种 解析: 以给出的患病DNA序列建trie树  患病结点要用flag标记 对于长度为n的序列 位置i有四种 情况A  C ...

  10. atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)

    题目大意: 把一个字符串s分割成m个串,这m个串满足至多有一种字符出现次数为奇数次,其他均为偶数次,问m的最小值 题解: 首先我们想一下纯暴力怎么做 显然是可以n^2暴力的,然后dp[i]表示分割到i ...