素数判定Miller_Rabin算法详解:

http://blog.csdn.net/maxichu/article/details/45458569

大数因数分解Pollard_rho算法详解:

http://blog.csdn.net/maxichu/article/details/45459533

然后是参考了kuangbin的模板:

http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.html

模板如下:

//快速乘 (a*b)%mod
//二进制竖式乘法:
//10101*1011=
//10101*1+10101*2^1*1+10101*2^2*0+10101*2^3*1
//位上是1的就加,是0的就不加
ll mult_mod(ll a,ll b,ll mod)
{
a%=mod;
b%=mod;
ll res=0;
while(b)
{
if(b&1)
{
res+=a;
res%=mod;
}
a<<=1;
if(a>=mod) a%=mod;
b>>=1;
}
return res;
} //快速幂 (x^n)%mod
ll pow_mod(ll x,ll n,ll mod)
{
if(n==1) return x%mod;
x%=mod;
ll t=x;
ll res=1;
while(n)
{
if(n&1) res=mult_mod(res,t,mod);
t=mult_mod(t,t,mod);//t平方
n>>=1;//变成n/2
}
return res;
} //若为合数返回true,不一定返回false
//a^(n-1)=1(mod n) -> a^((2^t)*x)=-1(mod n) == a^x=1(mod n)
bool test(ll a,ll n,ll x,ll t)//miller_rabin算法的核心
{
ll res=pow_mod(a,x,n);//a^x mod n
ll last=res;
for(int i=1;i<=t;i++)
{
res=mult_mod(res,res,n);//res=res*res mod n
if(res==1&&last!=1&&last!=n-1)
return true;
last=res;
}
if(res!=1) return true;
return false;
} //若为素数(或伪素数)返回true,合数返回false
bool miller_rabin(ll n)
{
if(n<2) return false;
if(n==2) return true;
if((n&1)==0) return false; //偶数
ll x=n-1,t=0;
while((x&1)==0)//n-1=(2^t)*x;
{
x>>=1;
t++;
}
for(int i=0;i<times;i++)//进行随机判定
{
ll a=rand()%(n-1)+1;//随机找0~n-1的整数
if(test(a,n,x,t))//
return false;
}
return true;
} ll factor[100];//保存质因数分解结果
int tot;//记录质因数个数,下标从0开始 ll gcd(ll a,ll b)
{
if(a==0) return 1;
if(a<0) return gcd(-a,b);
while(b)
{
ll c=a%b;
a=b;
b=c;
}
return a;
} ll pollard_rho(ll x,ll c)
{
ll i=1,k=2;
ll x0=rand()%x;
ll y=x0;
while(1)
{
i++;
x0=(mult_mod(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d!=1&&d!=x) return d;
if(y==x0) return x;
if(i==k)
{
y=x0;
k+=k;
}
}
} //对n进行素因子分解
void find_factor(ll n)
{
if(miller_rabin(n))//若为素数
{
factor[tot++]=n;
return ;
}
ll p=n;
while(p>=n)
p=pollard_rho(p,rand()%(n-1)+1);
find_factor(p);
find_factor(n/p);
}

POJ 1811  完完全全的模板题

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll; const int times=20;//随机算法判定次数 //快速乘 (a*b)%mod
//二进制竖式乘法:
//10101*1011=
//10101*1+10101*2^1*1+10101*2^2*0+10101*2^3*1
//位上是1的就加,是0的就不加
ll mult_mod(ll a,ll b,ll mod)
{
a%=mod;
b%=mod;
ll res=0;
while(b)
{
if(b&1)
{
res+=a;
res%=mod;
}
a<<=1;
if(a>=mod) a%=mod;
b>>=1;
}
return res;
} //快速幂 (x^n)%mod
ll pow_mod(ll x,ll n,ll mod)
{
if(n==1) return x%mod;
x%=mod;
ll t=x;
ll res=1;
while(n)
{
if(n&1) res=mult_mod(res,t,mod);
t=mult_mod(t,t,mod);//t平方
n>>=1;//变成n/2
}
return res;
} //若为合数返回true,不一定返回false
//a^(n-1)=1(mod n) -> a^((2^t)*x)=-1(mod n) == a^x=1(mod n)
bool test(ll a,ll n,ll x,ll t)//miller_rabin算法的核心
{
ll res=pow_mod(a,x,n);//a^x mod n
ll last=res;
for(int i=1;i<=t;i++)
{
res=mult_mod(res,res,n);//res=res*res mod n
if(res==1&&last!=1&&last!=n-1)
return true;
last=res;
}
if(res!=1) return true;
return false;
} //若为素数(或伪素数)返回true,合数返回false
bool miller_rabin(ll n)
{
if(n<2) return false;
if(n==2) return true;
if((n&1)==0) return false; //偶数
ll x=n-1,t=0;
while((x&1)==0)//n-1=(2^t)*x;
{
x>>=1;
t++;
}
for(int i=0;i<times;i++)//进行随机判定
{
ll a=rand()%(n-1)+1;//随机找0~n-1的整数
if(test(a,n,x,t))//
return false;
}
return true;
} ll factor[100];//保存质因数分解结果
int tot;//记录质因数个数,下标从0开始 ll gcd(ll a,ll b)
{
if(a==0) return 1;
if(a<0) return gcd(-a,b);
while(b)
{
ll c=a%b;
a=b;
b=c;
}
return a;
} ll pollard_rho(ll x,ll c)
{
ll i=1,k=2;
ll x0=rand()%x;
ll y=x0;
while(1)
{
i++;
x0=(mult_mod(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d!=1&&d!=x) return d;
if(y==x0) return x;
if(i==k)
{
y=x0;
k+=k;
}
}
} //对n进行素因子分解
void find_factor(ll n)
{
if(miller_rabin(n))//若为素数
{
factor[tot++]=n;
return ;
}
ll p=n;
while(p>=n)
p=pollard_rho(p,rand()%(n-1)+1);
find_factor(p);
find_factor(n/p);
} int main()
{
srand(time(0)); //需要ctime文件,poj的g++无法实现
int t;
scanf("%d",&t);
ll n;
while(t--)
{
scanf("%I64d",&n);
if(miller_rabin(n))
{
printf("Prime\n");
continue;
}
tot=0;
find_factor(n);
sort(factor,factor+tot);
printf("%I64d\n",factor[0]);
}
}

POJ 2689

这道题的函数是自己重新打了一遍的,因为理解不透彻,打算边打边想,结果还是没想清楚,尤其是后面的pollard_rho算法,而且还因为把long long型变量声明成了int型,导致一直TLE。。。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll; const int times=20;//随机算法判定次数
ll factor[1000],tot,ans,mina,k; ll gcd(ll a,ll b)
{
if(b==0)
return a;
return gcd(b,a%b);
} ll mult_mod(ll a,ll b,ll mod)
{
a%=mod; b%=mod;
ll res=0;
while(b)
{
if(b&1)
{
res+=a;
res%=mod;
}
a<<=1;
if(a>=mod) a%=mod;
b>>=1;
}
return res;
} ll pow_mod(ll x,ll n,ll mod)
{
if(n==1) return x%mod;
x%=mod;
ll t=x,res=1;
while(n)
{
if(n&1) res=mult_mod(res,t,mod);
t=mult_mod(t,t,mod);
n>>=1;
}
return res;
} bool test(ll a,ll n)
{
ll x=n-1,t=0,res,last;
while((x&1)==0)
{
x>>=1;
t++;
}
last=pow_mod(a,x,n); for(int i=0;i<t;i++)
{
res=pow_mod(last,2,n);
if(res==1&&last!=1&&last!=n-1)
return true;
last=res;
}
if(res!=1) return true;
return false;
} bool millier_rabin(ll n)
{
if(n==2) return true;
if(n==1||(n&1)==0) return false;
for(int i=0;i<times;i++)
{
ll a=rand()%(n-1)+1;
if(test(a,n))
return false;
}
return true;
} ll pollard_rho(ll x,ll c)
{
ll x0,y,i=1,k=2;
x0=rand()%x;
y=x0;
while(1)
{
i++;
x0=(mult_mod(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d>1&&d<x) return d;
if(y==x0) break;
if(i==k)
{
y=x0;
k+=k;
}
}
return x;
} void find_fac(ll n,int c)
{
if(n==1) return;
if(millier_rabin(n))
{
factor[tot++]=n;
return;
}
ll p=n;
while(p>=n)
p=pollard_rho(p,c--);
find_fac(p,c);
find_fac(n/p,c);
} void dfs(ll i,ll x)
{
if(i>=tot)
{
if(x>mina&&x<=k)
mina=x;
return;
}
dfs(i+1,x);
dfs(i+1,x*factor[i]);
} int main()
{
ll n,m;
while(~scanf_s("%I64d%I64d",&n,&m))
{
srand(time(0)); //需要ctime文件,poj的g++无法实现
if(n==m)
{
printf("%I64d %I64d\n",n,m);
continue;
}
tot=0;
ans=m/n;
find_fac(ans,107);
sort(factor,factor+tot);
int i,j=0;
for(i=1;i<tot;i++)
{
while(factor[i-1]==factor[i]&&i<tot)
factor[j]*=factor[i++];
if(i<tot)
factor[++j]=factor[i];
}
tot=j+1; mina=1;
k=(ll)sqrt(ans*1.0);
dfs(0,1);
printf("%I64d %I64d\n",mina*n,ans/mina*n);
}
return 0;
}

数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429的更多相关文章

  1. Miller_rabin算法+Pollard_rho算法 POJ 1811 Prime Test

    POJ 1811 Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 32534   Accepted: 8 ...

  2. 大数因式分解 Pollard_rho 算法详解

    给你一个大数n,将它分解它的质因子的乘积的形式. 首先需要了解Miller_rabin判断一个数是否是素数 大数分解最简单的思想也是试除法,这里就不再展示代码了,就是从2到sqrt(n),一个一个的试 ...

  3. 大素数判断和素因子分解(miller-rabin,Pollard_rho算法) 玄学快

    大数因数分解Pollard_rho 算法 复杂度o^(1/4) #include <iostream> #include <cstdio> #include <algor ...

  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-Robbin素数判定

    目录 一.实现原理 二.应用 判断一个正整数是否为素数 三.小结 一.实现原理 我们以前都是怎么判断素数的呢: 试除法: 若一个正整数N为合数,则存在一个能整除N的数k,其中\(2\leqslant ...

  6. 数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)

    POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include< ...

  7. 10^9以上素数判定,Miller_Rabin算法

    #include<iostream> #include<cstdio> #include<ctime> #include<string.h> #incl ...

  8. Miller_Rabin()算法素数判定 +ollard_rho 算法进行质因数分解

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

  9. 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

    集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...

随机推荐

  1. 开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释

    软件开发者要开源软件,不单单是开放源代码就可以了,选择一种许可证很重要,一个许可证之于软件就相当于价值观之于普通人,代表了这个软件的基本品性.一个错误的许可证选择可能会直接导致整个项目的失败. 各种开 ...

  2. 前端技术——WebFont与Sprite

    一.WebFont web font是应用在web中的一种字体技术,在CSS中使用font-face定义新的字体. 我们在文档中显示的字体应该在系统中能找到才会正常显示,比如你在word中使用了黑体字 ...

  3. C#如何实现url短地址?C#短网址压缩算法与短网址原理入门

    c# url短地址压缩算法与短网址原理的例子,详细介绍了短网址的映射算法,将长网址md5生成32位签名串,分为4段,每段8个字节,然后生成短网址,具体见文本实例. 短网址映射算法: 将长网址md5生成 ...

  4. python3中str的函数

    # 转换# 'capitalize',# 'lower',# 'upper',# 'casefold',# 'swapcase', 大小写互换# 'title',# 'strip',# 'rstrip ...

  5. 字符函数库 - cctype 和 climits 中的符号常量

    一. C++从C语言中继承一个与字符相关的.非常方便的函数软件包,他可以简化诸如确定字符是否为大写字母‘数字.标点符号等工作,这些函数的原型在头文件cctype(老式的为ctype.h)中定义的.例如 ...

  6. HelloMyBLOG!!!

    还记得刚辞职的时候,心中满是无助.学习Java的期间让我慢慢重拾信心,带我走出最初的迷茫.如今我已不再是一个人,今后渐渐要开始挑起一个家庭甚至几个家庭的重担.现在也算是在异乡暂时站住了脚跟,虽然离我的 ...

  7. 【Android】策略模式封装百度地图路线规划模块

    百度地图的Demo里有个路线规划的功能,但是,这个功能和Activity耦合性太高,所以需要单独抽离出路径规划功能,进行"解耦". 注:由于项目原因,本文只针对驾车路线规划进行封装 ...

  8. 编译C语言单元测试框架CUnit库的方法

    引用: http://blog.csdn.net/yygydjkthh/article/details/46357421 个人备忘使用 /******************************* ...

  9. java 打开浏览器 url

    public class openBrowers { public static void main(String[] args) { try { //String url = "http: ...

  10. iframe自适应高度处理方案

    第一种:这个方案能解决大多数自适应高度问题,方法是在iframe所要加载的页面上添加代码,把它的高度告诉iframe所在页面.缺点显而易见,如果iframe要加载的页面非常多而且不固定那么代码加起来很 ...