[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 ...
随机推荐
- tree(并查集)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 解决 重启nginx: [alert] kill(189, 1) failed (3: No such process)
解决 nginx: [alert] kill(189, 1) failed (3: No such process) [root@localhost/]# nginx -s reloadnginx: ...
- 动态计算rem的js代码
以最小1024尺寸为例: function rem() { var htmlEle = document.documentElement; var winWidth = htmlEle.clientW ...
- 快速搭建appium自动测试环境
首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到"Do ...
- 邓_Jquery测试题
一.Jquery测试题 下面哪种不是jquery的选择器?(单选)A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数,下面 ...
- vue 开发2017年变化回顾及2018年展望
vue.js 变化 从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9,最后一个为 v2.5.13,主要发布小版本 2.2~2.5.这些发布提升了vue 与 ...
- 单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out
mxc_vpu_test.out是飞思卡尔为IMX6Q编写的VPU示例程序,有编解码和简单的网络传输功能. 首先从/opt/freescale/pkgs/中提取出imx-test-3.0.35-4.1 ...
- Dubbo底层采用Socket进行通信详解
由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n 通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...
- SpringMVC运行原理
一.SpringMVC运行原理图 二.相关接口解释 DispatcherServlet接口: Spring提供的前端控制器,所有的请求都有经过它来统一分发.在DispatcherServlet将请 ...
- vue中什么样的数据可以是在视图中显示
1. Vue中不可以添加不存在的属性,因为不存在的属性是没有getter和setter的. <div id="app"> {{msg.a}} {{msg.b}} < ...