Miller-Rabin与Pollard-Rho备忘
Miller-Rabin素性测试算法:
根据费马小定理当p为素数时成立,所以如果存在一个a使x不满足此定理,则x必然不为素数。
但这是充分条件而不是必要条件,所以对于每个a,可能存在满足定理的x,这时就要选取多个a同时检测,这种验证素性的方法即为Miller-Rabin算法。
当a取2,3,5,7时,可以直接检测1e13内的所有整数。
但是存在非素数通过检测,这时需要进行二次检测。
可以证明当p为奇素数时,$x^2\equiv 1(mod\ p)$的解有且仅有两个:1和p-1。根据这个定理可以再次检测出一些非素数。
但是仍然存在一些数无法辨别,这些数被称为“强伪素数”,多选取一些数为底数检测即可(一般在[1,p)内选3个左右做二次检测就可以保证一定的正确率了)。
概括一下算法的具体流程:
1.先特判掉1,2和2的倍数。
2.选取3个以上[1,p)的数a。
3.对每个a先将p-1中2的因子去除,再逐个加上并实时检测是否出现不合法情况。
4.同时要注意判定$a^{p-1}\equiv 1(mod\ p)$
Pollard-Rho质因数分解算法:
一种复杂度证明较为复杂的算法,主要思想是先求出n的一个因子p,然后对于p和n/p分别递归下去,如果发现p为素数则停止递归。(这里判断素数需要用到Miller-Rabin)。
主要思想是,让a和b同时在$f(x)=x^2+c$的轨迹上走(c需要变化),每2的次幂步进行一次a=b。每次判定若gcd(|a-b|,n)在(1,n)中则返回,当a==b时退出。
这样的算法,如果将a和b直到a=b的轨迹画出来,会是一条链加一个环,a每次在上面走1步,b走两步,形如$\rho$。
#include<cstdio>
#include<vector>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; vector<ll>ls;
const int A[]={,,,,,,,};
ll T,e,n,c,d,y,p,r,w,mx;
ll Rand(ll l,ll r){ return (((ll)rand()<<)+rand())%(r-l+)+l; }
ll gcd(ll a,ll b){ return (b) ? gcd(b,a%b) : a; } ll ksc(ll a,ll b,ll p)
{
ll t=a*b-(ll)((long double)a*b/p+0.5)*p;
return (t<)?t+p:t;
} ll ksm(ll a,ll b,ll mod){
ll res=;
for (; b; a=ksc(a,a,mod),b>>=)
if (b & ) res=ksc(res,a,mod);
return res;
} ll find(ll n,int c){
ll i=,k=,x=Rand(,n-),y=x,d;
while (){
i++; x=(ksc(x,x,n)+c)%n; d=gcd(abs(y-x),n);
if (d> && d<n) return d;
if (y==x) return -;
if (i==k) y=x,k<<=;
}
} ll Rho(ll n,int c){ ll p=-; while (p==-) p=find(n,c--); return p; } bool chk(ll a,ll n){
ll m=n-,x,y; int k=;
while (!(m&)) m>>=,k++;
x=ksm(a,m,n);
rep(i,,k){
y=ksm(x,,n);
if (y== && x!= && x!=n-) return ;
x=y;
}
return y!=;
} bool Miller(ll n){
if (n==) return ;
if (!(n&)) return ;
rep(i,,) if (chk(Rand(,n-),n)) return ;
return ;
} void Fac(ll x,int c){
if (x==) return;
if (Miller(x)) { ls.push_back(x); return; }
ll p=Rho(x,c); Fac(p,c);
while (x%p==) x/=p;
Fac(x,c);
} int main(){
for (scanf("%lld",&T); T--; ){
scanf("%lld",&n); ls.clear();
if (Miller(n)) { puts("Prime"); continue; }
Fac(n,); mx=;
for (vector<ll>::iterator it=ls.begin(); it!=ls.end(); it++) mx=max(mx,*it);
printf("%lld\n",mx);
}
return ;
}
Miller-Rabin与Pollard-Rho备忘的更多相关文章
- POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)
题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- 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 ...
随机推荐
- [POJ2777] Count Color
\[Count Color\] Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 50865 Accepted: 15346 Des ...
- java的多构造函数的处理方式
/** * */ package P; import java.awt.List; import java.lang.reflect.Array; import java.util.ArrayList ...
- windows下maven打包eclipse工程
打包过程中,可能出现的2个问题: ①.[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build ...
- 关于ora-12154:TNS:could not resolve the connect identifier specified
一:前言 刚刚出来实习,在公司配的电脑里面装的oracle和PL SQL时一次性就搞定,但是在自己的电脑上装了就出现这个问题,刚刚在网上看了下,所以自己就写份记载吧! 二: 在打开PLSQL Deve ...
- L3-003. 社交集群(并查集)
L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...
- Drupal7导入语言包
下载语言包 然后把包存放在profiles\standard\translations目录下,安装. 如果出现如下错误 1.错误有MySql数据库默认引擎innoDB引起,只要mysql\bin\my ...
- 51nod 1040 最大公约数之和
给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= ...
- 【NOIP1999】邮票面值设计 dfs+dp
题目传送门 这道题其实就是找一波上界比较麻烦 用一波 背包可以推出上界mx 所以新加入的物品价值一旦大于mx+1,显然就会出现断层,所以可以以maxm+1为枚举上界,然后这样进行下一层的dfs. 这样 ...
- React module methods with passing props to child or invoking callback to parent.
Some code samples for this pupose: import React from "react"; import MyDemo from "./m ...
- ajax获取django的csrf_token
''' 方法一: data: { 'teamid': teamid, csrfmiddlewaretoken: '{{ csrf_token }}' //data: {name: 'john', cs ...