[Miller-Rabin & Pollard-rho]【学习笔记】
Miller-Rabin & Pollard-rho
很久之前就学过了...今天重学一遍
利用费马小定理,但不能判断伪素数的情况
基于a的伪素数n:
\(a^{n-1} \equiv 1 \pmod n\)
如果对于所有与n互质的数都成立,则n为Carmichael数
定理:
对于质数\(p\)和\(e \ge 1\)
\]
只有两个解\(x=1,\ x=-1\)
分解$n=u*2^t$,反复平方的时候如果存在非平凡平方根则不是质数
可以证明Carmicheal数一定不是$p^e$
Pollard-rho启发式因子分解期望$O(\sqrt{p})$找到一个为p的质因子
快速乘要用long double黑科技
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
ll n;
ll Mul(ll a, ll b, ll P) {
ll t = (a*b - (ll)((long double)a/P*b+1e-8)*P);
return t<0 ? t+P : t;
}
ll Pow(ll a, ll b, ll P) {
ll ans=1; a%=P;
for(; b; b>>=1, a=Mul(a, a, P))
if(b&1) ans=Mul(ans, a, P);
return ans;
}
bool witness(ll a, ll n, ll u, int t) {
ll x=Pow(a, u, n), y=x;
for(int i=1; i<=t; i++) {
x=Mul(x, x, n);
if(x==1 && y!=1 && y!=n-1) return true;
y=x;
}
return x!=1;
}
bool MillerRabin(ll n) {
if(n==2) return true;
if(n<=1 || !(n&1)) return false;
ll u=n-1, t=0;
while(!(u&1)) u>>=1, t++;
for(int i=1; i<=10; i++)
if(witness(rand()%(n-1)+1, n, u, t)) return false;
return true;
}
ll gcd(ll a, ll b) {return b==0?a:gcd(b, a%b);}
ll rho(ll n, ll c) {
int k=2; ll x=rand()%n, y=x, d=1;
for(int i=1; d==1; i++) {
x=(Mul(x,x,n)+c)%n;
d=gcd(n, y>x?y-x:x-y);
if(i==k) y=x, k<<=1;
}
return d;
}
ll Max;
void solve(ll n) {
if(n==1) return;
if(MillerRabin(n)) {Max=max(Max, n); return;}
ll t=n;
while(t==n) t=rho(n, rand()%(n-1)+1);
solve(t); solve(n/t);
}
int main() {
freopen("in","r",stdin);
srand(317);
int T=read();
while(T--) {
n=read();
Max=0;
solve(n);
if(Max==n) puts("Prime");
else printf("%lld\n",Max);
}
}
[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这两 ...
- 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式
找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- 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外的三个约 ...
- Miller Rabin算法学习笔记
定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...
- 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 ...
随机推荐
- 【自制工具类】struts返回json数据包装格式类
自己写的一个给struts返回的json数据包装格式类,不喜勿喷,原创,需在项目中引入com.alibaba.fastjson的jar包 先看下效果(这里没有使用msg,有兴趣的往下看): 上demo ...
- api接口token验证
接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...
- DESTOON B2B标签(tag)调用手册
路径:include/tag.func.php 1.标签格式的大致说明 {tag("moduleid=9&table=article_9&length=40&cond ...
- MySql优化子查询
用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...
- React源码解析:ReactElement
ReactElement算是React源码中比较简单的部分了,直接看源码: var ReactElement = function(type, key, ref, self, source, owne ...
- linux 从softnet_stat查看内核丢包信息
1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...
- File类实现文件夹和文件复制
package com.jcy.copy; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFou ...
- 前后端分离之CORS和WebApi
目前的项目是前端mv*+api的方式进行开发的,以前都是没有跨域的方案,前后端人员在同一个解决方案里边进行开发,前端人员要用IIS或VS来开发和调试Api,这样就很不方便,迫切需要跨域访问Api. 评 ...
- 如何用docker部署redis cluster
前言 由于本人是个docker控,不喜欢安装各种环境,而且安装redis-trib也有点繁琐,索性用docker来做redis cluster. 本文用的是伪集群,真正的集群放到不同的机器即可.端口是 ...
- git 安装使用
系统ubuntu14.04 1.安装:sudo apt-get install git 2.设置name and Email: git config --global user.name " ...