BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][Status][Discuss] Description   Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个.…
判断正整数p是否是素数 方法一 朴素的判定   …
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重要的地位.通过比较各种素数测试算法和对Miller-Rabin算法进行的仔细研究,证明在计算机中构建密码安全体系时, Miller-Rabin算法是完成素数测试的最佳选择.通过对Miller-Rabin 算 法底层运算的优化,可以取得较以往实现更好的性能.[1]  随着信息技术的发展.网络的普及和电…
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 61, 24251, 2147483647, 998244353}这么一大串数作为基底,然后左改右改,总算过去了.特别感谢 @骗分过样例 的提醒,现在张贴的代码应该是值得信赖的了. 之前我的同学好像就指出过我的文章的很多问题.比如说我之前写到,Miller Rabin在…
定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller Rabin主要基于费马小定理: \[a ^ {p-1} \equiv 1 (mod p)\]其中\(p\)是质数. 于是就有闲得没事干的一群科学家们想,这个问题的逆命题是否成立呢? 逆命题:若对于任意\(a\),\(a ^ {p-1} \equiv 1 (mod p)\)都成立,那么\(p\)是质数…
梅森素数 定义: if m是一个正整数 and 2^m-1是一个素数 then m是素数 if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数 if p是一个素数 and M(p)是一个素数 then M(p)被称为梅森素数 Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数 设p是素数,第p个梅森数为M(p)为2^p-1,r1 = 4,对于k >= 2 r(k) = r(k+1)^2-2(modM(p)), 0 <= r(k) <= M…
1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这样,就先算乘方,再算除法. A/B,称为A除以B,也称为B除A. 若A%B=0,即称为A可以被B整除,也称B可以整除A. A*B表示A乘以B或称A乘B,B乘A,B乘以A--都一样. 复习一下小学数学 公因数:两个不同的自然数A和B,若有自然数C可以整除A也可以整除B,那么C就是A和B的公因数. 公倍数:两…
转载自:http://www.dxmtb.com/blog/miller-rabbin/ 普通的素数测试我们有O(√ n)的试除算法.事实上,我们有O(slog³n)的算法. 定理一:假如p是质数,且(a,p)=1,那么a^(p-1)≡1(mod p).即假如p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1.(费马小定理) 该定理的逆命题是不一定成立的,但是令人可喜的是大多数情况是成立的. 于是我们就得到了一个定理的直接应用,对于待验证的数p,我们不断取a∈[1,p-1]且a∈…
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是质数,否则\(n\)是合数. 代码 bool is_prime(int n){ if(n<2) return 0; int m=sqrt(n); for(int i=2;i<=m;i++){ if(n%i==0) return 0; } return 1; } 方法二.线性筛 用 \(O(n)\)…
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Paradox 简单点说就是 在 1到100 内去一个数 ai ai==42的概率很小 但是如果取两个数 ai bi ai-bi==42 的概率就会变大 应用到找素因子上 就不用像试除法那样一个一个的试 但是如果枚举ai bi 显然也很slow 那么有一个非常好使(奇怪)的函数 f(x)=x*x+c 这…
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约数. 思路:大数的质因数分解仅仅能用随机算法Miller Rabin和Pollard_rho.在測试多的情况下正确率是由保证的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include &l…
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是素数,则n至少有一个(1, sqrt(n) ]范围内的素数因子 定理3:定义f(n)为不大于n的素数的个数,则 f(n) 近似等于 n/ln(n) (ln为自然对数) ,具体请参考here 求不超过n的素数                         本文地址 算法1:埃拉托斯特尼筛法,该算法的…
Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. Template: typedef long long ll; ll kmul(ll a,ll b,ll mod) { ll res=0; while (b) { if (b&1) res=(res+a)%mod; a=(a+a)%mod; b>>=1; } return res; }…
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: http://blog.csdn.net/maxichu/article/details/45459533 然后是参考了kuangbin的模板: http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.html 模板如下: //快速乘 (a…
#include<iostream> #include<cstdio> #include<ctime> #include<string.h> #include<stdlib.h> #define LL long long using namespace std; const int S=20;//随机算法判定次数,S越大,判错概率越小 LL ans; //给定一个数,判断是否是素数(常用long long大数) LL mult_mod(LL a,…
公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌输一下费马小定理:若p为素数,a是正整数且gcd(a,p)=1,则a^(p-1)%p=1.信息安全上俗称同余.本人时常将费马小定理与欧拉定理搞混淆,不过真的很类似.这里既是利用费马小定理来判定素数的. 当然了,费马小定理对于已知素数肯定是适用的,但不免存在一些伪素数也符合这个性质,所以我们需要随机数…
//****************************************************************// Miller_Rabin 算法进行素数测试//速度快,而且可以判断 <2^63的数//****************************************************************const int S=20;//随机算法判定次数,S越大,判错概率越小 //计算 (a*b)%c.   a,b都是long long的数,直接相乘…
目录 一.实现原理 二.应用 判断一个正整数是否为素数 三.小结 一.实现原理 我们以前都是怎么判断素数的呢: 试除法: 若一个正整数N为合数,则存在一个能整除N的数k,其中\(2\leqslant k \leqslant \sqrt N\). 具体实施如下: inline int is_prime(int n){ if(n<2) return 0; for(int i=2;i<=sqrt(n);i++){ if(n%i==0) return 0; } return 1; } 这种方法的时间复…
梅森素数 定义: if m是一个正整数 and 2^m-1是一个素数 then m是素数 if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数 if p是一个素数 and M(p)是一个素数 then M(p)被称为梅森素数 Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数 设p是素数,第p个梅森数为M(p)为2^p-1,r1 = 4,对于k >= 2 r(k) = r(k+1)^2-2(modM(p)), 0 <= r(k) <= M…
C - Prime number or not Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 1649 Description Your task is simple.Give you a number N, you should judge whether N is a prime number or not. Input There…
题意:给出p(1<p<=62),让你求Mp=2^p-1是否为梅森素数. 梅森素数:若p为素数,且Mp=2^p-1也是素数,则Mp为梅森素数.若p为合数,Mp=2^p-1一定为合数若p为素数,Mp=2^p-1不一定为素数 判别梅森素数1.卢卡斯-莱默判别法:设p为素数,Mp=2^p-1,R0=4.Rk=(Rk-1)^2-2(mod Mp) 0<=Rk<Mp,k>=1可以得到Rk的序列,k=0,1,2,...,p-2.Mp为素数,当且仅当,Rp-2=0(mod Mp) 2.Mil…
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<iostream> #include<algorithm> using namespace std; //**************************************************************** // Miller_Rabin 算法进…
1702 素数判定 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 一个数,他是素数么? 设他为P满足(P<=263-1) 输入描述 Input Description P 输出描述 Output Description Yes|No 样例输入 Sample Input 2 样例输出 Sample Output Yes 数据范围及提示 Data Size & Hint 算法导论--数论那一节 注意Carmi…
素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 71785    Accepted Submission(s): 24969 Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数.   Input 输入…
集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.html 传说中的随机算法. 效率极高. 可以对一个2^63的素数进行判断. 可以分解比较大的数的因子. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #…
一.梅森素数 素数有无穷多个,却只有极少量的素数能表示成2p-1(p为素数)的形式.在不大于257的素数中,当p=2.3.5.7.13.17.19.31.67.127.257时,2p-1是素数,其它都是合数.前面的7个数(即2.3.5.7.13.17.19)已被前人所证实,而后面的4个数(即31.67.127.257)则是梅森自己的推断.2300多年来,人类仅发现48个梅森素数. 指数为11, 23, 29, 37, 41, 43, 47, 53, 59的时候是合数. 二.过程 给出2-64里面…
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数,a与n互质,则an-1Ξ1(mod n).于是有人想过把它倒过来判断n是否为素数.首先,若a与n不互质,那么n为合数.所以只需要满足an-1Ξ1(mod n)即可,这个a干脆就让它等于2了.即判断2n-1Ξ1(mod n)是否成立.若不成立,那么n必定为合数.但成立时n就是素数吗?又有人找出了个数:…
大数因数分解Pollard_rho 算法 复杂度o^(1/4) #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <map> using namespace std; ; ; map<long long, int>m; long long Random( long l…
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<iostream> #include<algorithm> using namespace std; //**************************************************************** // Miller_Rabin 算法进…
HDU2138 给定N个32位大于等于2的正整数 输出其中素数的个数 用Miller Rabin 素数判定法 效率很高 数学证明比较复杂,略过, 会使用这个接口即可. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> using namespace std; typedef long long int LL; LL get…