数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)
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算法)的更多相关文章
- HDU2138 随机素数测试 Miller-Rabin算法
题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy'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 ...
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
- Miller_Rabin 素数测试
费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...
- Miller-Rabin素数测试算法(POJ1811Prime Test)
题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...
- Miller-Rabin素数测试算法
用来干嘛的 要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) ...
- Miller-Rabbin随机性素数测试算法
//**************************************************************** // Miller_Rabin 算法进行素数测试 //速度快,而且 ...
随机推荐
- “Hello World!”团队第十三次会议
今天是我们团队“Hello World!”团队召开的第十三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2 ...
- python struct详解
转载:https://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 有的时候需要用python处理二进制数据,比如,存取文件,socket操 ...
- flask验证登录学习过程(1)---准备
对应flask的接口开发,目前自己可以熟练的进行.但是深入到更基础的,从注册到验证登录的过程一直不是特别清楚. 趁着年度不是特别忙的时候,特意去学习加强一下.把这个过程记录在此处. 首先是规划一个项目 ...
- 我是IT小小鸟(读后感)
序 1.兴趣,这本书第一个点讲兴趣,可是在中国填鸭式的教育下,有兴趣也被这种教育给泯灭了. 2.他山之石,可以攻玉.但不可照搬.这点我非常赞同作者的看法.别人东西你拿来,一定要在他的基础上进行创 ...
- lintcode-480-二叉树的所有路径
480-二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 您在真实的面试中是否遇到过这个题? Yes 样例 给出下面这棵二叉树: 所有根到叶子的路径为: [ "1-> ...
- Microsoft Orleans 之 开发人员指南
开发一个Grain 在开发Grain之前请先阅读Grains 这篇文章 Grain 接口 Grains通过调用各自定义在接口中的方法相互作用,一个grain实现了事先定义好的一个或多个接口,grain ...
- OSG学习:LOD、数据分页、动态调度
LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.在OSG的场景结点组织结 ...
- python脚本批量生成50000条插入数据的sql语句
f = open("xx.txt",'w') for i in range(1,50001): str_i = str(i) realname = "lxs"+ ...
- floyd最短路
floyd可以在O(n^3)的时间复杂度,O(n^2)的空间复杂度下求解正权图中任意两点间的最短路长度. 本质是动态规划. 定义f[k][i][j]表示从i出发,途中只允许经过编号小于等于k的点时的最 ...
- 520的信心赛——点点玩deeeep
3.点点玩 deeeep(deeeep.cpp) 描述 点点最近迷上了 deeeep(此 de 非彼 de),在研究一个特殊的最长树链问题 ...