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 ...
随机推荐
- C语言指针大杂烩
By francis_hao Oct 31,2016 指针数组和数组指针 指针数组本身是个数组,数组的内容是指针.形如char *pa[].由于[]优先级高于*,pa先于[]结合表示pa是一个数组,p ...
- powershell for rename server name
Rename server name if server has not yet joined AD $Hostname = "newname" $username = " ...
- 播放video
<html> <head> <title> four in one vedio</title> <style type="text/cs ...
- canvas知识01
本文转自:http://www.cnblogs.com/jsdarkhorse/archive/2012/06/29/2568451.html 更多参考:http://www.cnblogs.com/ ...
- BootStrap弹出框插件popover简单实例
1.网上实例地址 http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html 2.具体demo $("#pieId&q ...
- TCP(二)
TCP半连接和全连接问题 TCP握手过程详解 如上图所示,关键部分:syns queue(半连接队列)和accept queue(全连接队列) 正常情况下的处理过程如下: 1)当server端收到cl ...
- [POJ1845&POJ1061]扩展欧几里得应用两例
扩展欧几里得是用于求解不定方程.线性同余方程和乘法逆元的常用算法. 下面是代码: function Euclid(a,b:int64;var x,y:int64):int64; var t:int64 ...
- 使用dd命令克隆整个系统
神奇的ghost的原理是什么呢?不就是数据复制吗?Linux下的dd命令不就是最强大的数据复制工具! 既然如此,我为什么要使用g4l这样复杂的工具呢?一条dd命令不就可以帮我实现任意 ...
- Oracle基础 07 参数文件 pfile/spfile
--查看数据库运行模式(spfile还是pfile)select decode(count(*),1,'spfile','pfile') from v$spparameterwhere rownum= ...
- Day 14 python 之 字符串练习
一.字符串总结与练习 #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "DaChao" # Date: ...