BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)
题目链接
Pollard_Rho:http://blog.csdn.net/thy_asdf/article/details/51347390
#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
const int p[]={2,3,5,7,11,13,17,19};
typedef long long LL;
LL Ans;
inline LL read()
{
	LL now=0,f=1;register char c=gc();
	for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now*f;
}
inline LL Mult(LL a,LL b,LL p)//O(1)快速乘
{
	LL tmp=a*b-(LL)((long double)a/p*b+1e-8)*p;
	return tmp<0?tmp+p:tmp;
}
LL Fast_Pow(LL n,LL k,LL p)
{
	LL t=1;
	for(;k;k>>=1,n=n*n%p)
		if(k&1) t=t*n%p;
	return t;
}
bool Miller_Rabin(LL n)
{
	if(n==2) return 1;
	if(!(n&1)||n==1) return 0;
	for(int i=0;i<8;++i)
		if(n==p[i]) return 1;
		else if(!(n%p[i])) return 0;
	LL u=n-1,now,las; int t=0;
	while(!(u&1)) u>>=1,++t;
	for(int i=0;i<8;++i)
	{
		now=Fast_Pow(p[i],u,n);
		for(int j=1;j<=t;++j)
		{
			las=now, now=Mult(now,now,n);
			if(now==1&&las!=1&&las!=n-1) return 0;
		}
		if(now!=1) return 0;
	}
	return 1;
}
LL gcd(LL x,LL y)
{
	return y?gcd(y,x%y):x;
}
LL Rho(LL n,LL delta)
{//现要分解n,有两个随机数x,y,若p=gcd(x-y,n)!=1&&p!=n,那么p为n的一个约数...省略
	LL x=rand()%n,y=x,p=1; int k=2;//设定k为此次路径长
	for(int i=1;p==1;++i)
	{
		x=(Mult(x,x,n)+delta)%n;//随机函数f(x)=x*x+d
		p=gcd(std::abs(x-y),n);//多次生成随机数,直至找到p是n的一个因子
		if(i==k) y=x,k<<=1;//达到k次后把y赋值为x。路径每次倍长
	}
	return p;
}
void Find(LL n)
{
	if(n==1) return;
	if(Miller_Rabin(n)) {Ans=std::max(Ans,n);/*fac[++cnt]=n;*/ return;}
	LL t=n;
	while(t==n) t=Rho(n,rand()%(n-1)+1);
	//t=n说明这个随机函数会导致走到n的环上,再换一个重试即可
	Find(t), Find(n/t);
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("3667.in","r",stdin);
#endif
	int t=read();LL n;
	while(t--)
		n=read(),Ans=0,Find(n),Ans==n?puts("Prime"):printf("%lld\n",Ans);
	return 0;
}
BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)的更多相关文章
- [Miller-Rabin & Pollard-rho]【学习笔记】
		Miller-Rabin & Pollard-rho 很久之前就学过了...今天重学一遍 利用费马小定理,但不能判断伪素数的情况 基于a的伪素数n: \(a^{n-1} \equiv 1 \p ... 
- 【模板】SPOJ FACT0 大数分解 miller-rabin & pollard-rho
		http://www.spoj.com/problems/FACT0/en/ 给一个小于1e15的数,将他分解. miller-rabin & pollard-rho模板 #include & ... 
- bzoj 3667: Rabin-Miller算法【Miller-Rabin】
		Miller-Rabin模板 #include<iostream> #include<cstdio> #include<algorithm> using names ... 
- BZOJ  3667 Pollard-rho &Miller-Rabin
		论O(1)快速乘和O(logn)快速乘的差距-. //By SiriusRen #include <cstdio> #include <algorithm> using nam ... 
- BZOJ 3667: Rabin-Miller算法 (Pollard-Rho 模板)
		说实话,我知道每一步都干啥,但我完全不知道为啥这么做,也不知道为什么是正确的,反正会用就行了~ #include <cmath> #include <cstdio> #incl ... 
- 【刷题】BZOJ 3667 Rabin-Miller算法
		Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如 ... 
- bzoj 3667  Rabin-Miller算法
		#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ... 
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
		数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ... 
- 梅森素数 判定总结 - Lucas-Lehmer算法 & Miller-rabin算法
		梅森素数 定义: if m是一个正整数 and 2^m-1是一个素数 then m是素数 if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数 if p是一个素 ... 
随机推荐
- Git相关二三事(git reflog 和彩色branch)【转】
			转自:https://www.jianshu.com/p/3622ed542c3b 背景 git太常用了,虽然,用起来不难,但也有很多小技巧的东西... 1. 后悔药 哪天不小心,写完代码,没comm ... 
- jdk8系列二、jdk8方法引用、重复注解、更好的类型推断、新增注解
			一.方法引用 方法引用使得开发者可以直接引用现存的方法.Java类的构造方法或者实例对象.方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码. 方法 ... 
- 设置linux新用户默认当前目录及使用的shell
			切换到root用户,直接修改/etc/passwd文件,找到你的用户名你一行,如下图所示修改路径,然后保存即可. 
- @PathVariable和@RequestParam
			@PathVariable 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariabl ... 
- route 的标志位
			linux下利用route命令查看当前路由信息时,会打印如下信息: root@root:/# route Kernel IP routing tableDestination Gateway ... 
- VC++文件拖放
			属性Accept Files 设置True,消息WM_DROPFILES 设置事件OnDropFiles void CNWiReworkDlg::OnDropFiles(HDROP hDropInfo ... 
- php测试mysql数据库连通性并且在浏览器每一秒输出一次结果
			有时候网络环境不稳定,需要测试mysql数据库的连接是否畅通,我们可以通过php脚本实现,具体代码如下,在360浏览器测试通过: <?php /* 循环打印出mysql连接测试 */ heade ... 
- jquery引入
			网络地址:http://code.jquery.com/jquery-2.2.0.min.js 在需要的页面中直接使用网络地址,就不需要本地文件 <script type="text/ ... 
- vim使用案例
			1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录: 2. 进入 vitest 这个目录当中: 3. 将 /etc/man.config 复制到本目录底下(或由上述的连结下载 man. ... 
- 04-Bootstrap的插件
			1.下拉菜单 代码如下: <div class="dropdown"> <button class="btn btn-default dropdown- ... 
