Miller-Rabbin随机性素数测试算法】的更多相关文章

//**************************************************************** // Miller_Rabin 算法进行素数测试 //速度快,而且可以判断 <2^63的数 //**************************************************************** ;//随机算法判定次数,S越大,判错概率越小 LL mult_mod(LL a,LL b,LL mod) //(a*b)%c a,b,c<…
题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看了,直接贴代码,以后当模版用. 数据比较大,只能先用Miller_Rabin算法进行素数判断. 在用Pollard_rho分解因子.   #include <iostream> #include <stdio.h> #include <string.h> #include…
\(Miller-Rabin\)​素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的试除法已经不能在规定时间内解决问题.此时,我们可以用\(Miller-Rabin\)素数测试算法,时间复杂度可以降低至\(O(\log_2n)\). 引理 费马小定理 若\(a,p \in \mathbb{Z}\),\(p\)为质数,则 \[ a^{p-1} \equiv 1(mod\;p) \]…
在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安全和密码学上一般都是需要很大的素数.而从目前来看,确定性算法判断素数的性能都不好,所以可以用MC概率算法来解决,其中Miller Rabin算法就是其中的很经典的解决方法.下面首先介绍下相关的数学理论. 数学原理 Fermat小定理:若n是素数,则对所有1≤a≤n-1的整数a,有a^(n-1)mod…
用来干嘛的 ​   要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) 比较大的情况下,时间花销就太大了.这时,我们可以选择牺牲一点点准确度,使用可爱的米勒-拉宾(Miller-Rabin)素性检验算法来判断质数.根据百度百科,使用快速幂运算,这个算法的时间复杂度是 \(O(k\log^3 n)\)的,\(k\)是我们设定对一个数的进行测试的次数.\(k\) 越大,判…
首先需要知道两个定理: 1: 费马小定理: 假如p是素数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p). 2:二次探测定理:如果p是素数,x是小于p的正整数,且,那么要么x=1,要么x=p-1. 证明:这是显然的,因为相当于p能整除,也即p能整除(x+1)(x-1). 由于p是素数,那么只可能是x-1能被p整除(此时x=1) 或 x+1能被p整除(此时x=p-1). 接着 如果a^(n-1) ≡ 1 (mod n)成立,Miller-Rabin算法不是立即找另一个a进行测试,而是…
PS:本人第一次写随笔,写的不好请见谅. 接触MillerRabin算法大概是一年前,看到这个算法首先得为它的神奇之处大为赞叹,竟然可以通过几次随机数据的猜测就能判断出这数是否是素数,虽然说是有误差率,但是相对于他比其他素数判断的高效,真的是可以说是完美级.那时候忙于找工作,所以也没有细究,现在空下来终于对这个算法有了一定的理解. 先说两个定理: (1) 当x<p时,满足x^(p-1) % p = 1,说明x与p互质: (2) 当x<p时,满足x^2 % p = 1; x的解为 x = 1 或…
Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the…
基本原理: 费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)%p=1.        利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过计算d=a^(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n  很可能是素数. 二次探测定理:如果p是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或x=p-1.        利用二次探测定理,可以再利用费尔马小定理计算a^(n-1)%n的过程中增加对整数n的二次探测,一旦发现违背二…
POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include<cstdlib> #include<cstdio> ; ; int tot; long long n; long long factor[maxn]; long long muti_mod(long long a,long long b,long long c) { //(a*b) mod…
0.引入 那年,机房里来了个新教练, 口胡鼻祖lhy 第一节课,带我们体验了暴力的神奇, 第二节课,带我们体验了随机数的玄妙, -- 那节课,便是我第一次接触到Miller Rabbin算法, 直到现在,终于搞懂了一些. 该算法(名字过长,不想打了)主要是解决快速判断一个极大的数是否是质数的问题. 我们知道,能保证正确的最快的算法,就是的复杂度,不能再小了,对于一个很大的long long,复杂度达到O(1e9) 但是该算法却能在的时间复杂度内判断,(如果用了光速乘,还可以变为) 那究竟是为什么…
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long mul(long long a,long long n,long long mo){ ; while (n){ ) ans=(ans+a)%mo; a=(a+a)%mo; n/=; } return ans;…
很好的入门题 先测试是否为素数,若不是则进行素因子分解,算法详见总结贴 miller robin 和pollard rho算法 AC代码 #include <iostream> #include<stdio.h> #include<algorithm> #include<math.h> using namespace std; long long ans; long long gcd(long long a,long long b) { return b?g…
一.RSA与公钥加密系统的起源与影响. 为了更好地突出公钥加密系统相对私钥加密系统的优势,让我们从这两个问题开始: 这个世界上如果没有公钥加密系统会怎么样呢?全用私钥加密系统会出现什么问题呢? 首先,私钥密码系统中的密码,加密解密之间是存在共享性的,也就是说,会加密就能做到会解密,会解密也就能做到会加密. 如果私钥密码系统用来做数字签名,会发生什么呢?你只要告诉了别人验证你的数字签名的正确性方法(解密),就同时告诉了他们伪造这个数字签名的方法(加密).瞬间爆炸Orz. 其次,私钥加密系统需要有一…
伪素数: 如果存在和n互素的正整数a满足a^(n-1)≡1(mod n),则n是基于a的伪素数. 是伪素数但不是素数的个数是非常非常少的,所以如果一个数是伪素数,那么他几乎是素数. Miller_Rabbin素数测试:随机选k个a进行a^(n-1)≡1(mod n)测试,如果都满足则判断n是素数. a^(n-1)%mod用快速幂计算.对于大数相乘(两个大于int的数相乘),中间结果可能溢出,所以需要用快速幂思想进行乘法取模. Miller_Rabbin的出错率为2^(-k). //Miller…
引语:在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法).但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用.所以我们需要学习Miller_Rabin算法. 知识准备 + 算法推导: 1.威尔逊定理:若p是素数,则 (p-1) !≡ -1(mod p). 2.有趣的是,威尔逊定理的逆命题也是正确的:设n是正整数且 n ≥ 2 ,若 (n-1) !≡ -1(mod n),则n 是素数. 很多朋友可能在学习的时候会碰到威尔…
额,我们今天来讲一讲Miller-Rabin素性测试算法. 读者:怎么又是随机算法!!!(⊙o⊙)… [好了,言归正传] [费马小定理] 费马小定理只是个必要条件,符合费马小定理而非素数的数叫做Carmichael Carmichael数是非常少的. 在1~100000000范围内的整数中,只有255个Carmichael数. 为此又有二次探测定理,以确保该数为素数. 这就构成了Miller-Rabin的基本原理 ╰( ̄▽ ̄)╭ [二次探测定理] 二次探测定理 如果p是一个素数,0<x<p,则…
1.Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数: 2.Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)%p=1.利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过 计算d=a^(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n 很可能是素数. (2)二次探测定理:如果p是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或x=p-1…
费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另一篇博文(手动滑稽): 原理明白了,就直接上代码了(KuangBin大神的板子): 代码思路是, Miller_Rabin()函数随机选取 s 个a,a用做“基底” check() 函数是用来判断x是否等于1,也就是判断a是否是n的凭证. Mul_mod()函数是 快速乘 ,求 a^t % n 之后…
板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素数测试基于以下两个原理: 费马小定理 即我们耳熟能详的 对于质数\(p\) \[a^{p - 1} \equiv 1 \pmod p\] 二次探测原理 对于质数\(p\),如果存在\(x\)满足 \[x^2 \equiv 1 \pmod p\] 那么\(x\)只能是\(1\)或者\(p - 1\)…
Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 27129   Accepted: 6713 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the…
前言 \(MillerRabin\)素数测试是一种很实用的素数判定方法. 它只针对单个数字进行判定,因而可以对较大的乃至于\(long\ long\)范围内的数进行判定,而且速度也很快,是个十分优秀的算法. 前置定理 费马小定理:\(a^{p-1}\equiv1(mod\ p)\)(详见此博客:费马小定理) 二次探测定理:若\(p\)为奇素数且\(x^2\equiv1(mod\ p)\),则\(x\equiv1(mod\ p)\)或\(x\equiv p-1(mod\ p)\). 大致思路 假设…
基础素数测试模板 对于大数的素性判断,目前Miller-Rabin算法应用最广泛.一般底数仍然是随机选取,但当待测数不太大时,选择测试底数就有一些技巧了.比如,如果 被测数小于4759123141,那么只需要测试三个底数 a[]={2,7,61} 就足够了.当然,测试的越多,正确的范围也越大.如果你每次都用前7个素数 a[]={2,3,5,7,11,13,17} 进行测试,所有不超过341550071728320的数都是正确的.如果选用 a[]={2,3,7,61,24251} 作为底数,那么1…
链接:传送门 题意:题目给出费马小定理:Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). 我们知道Miller-Rabin素数测试的算法原理就是基于费马小定理的,因为我们在测试底数的时候只是随机一些 a ,所以可能有的合数就脸一白通过了测试,于是就产生了伪素数这一概念,现在给你一对 p and a,判断 p 是否是以 a 为基的伪素数 思路:对于素数来说是不…
0. 前情回顾 上一周的文章中,我们通过kNN算法了解了机器学习的一些基本概念.我们自己实现了简单的kNN算法,体会了其过程.这一周,让我们继续机器学习的探索. 1. 数据集的拆分 上次的kNN算法介绍中,我们只是简单地实现了这样一个算法,并用一组测试数据进行了测试. 然而,在真正的工程应用中,我们设计出的机器学习算法,并不一定非常准确,甚至可能非常不准确.因此我们需要进行测试,如同我们设计好了一个数据结构后,需要使用尽可能涵盖各种情况的参数调用各个操作,并通过一定的方式观察是否符合我们对这种数…
朴素素数测试是O(x1/2)的,每一个数都测试下来就炸了 然而如果全部预处理的话才是做大死,时间空间各种炸(大约有1亿个数) 所以怎么平衡一下呢? 其实在预处理的时候可以只处理一半:把21474836471/2内的质数全部预处理出来(这些就是要用的全部质数),然后用这些质数线性筛一筛就能得到正解 = = 没了? 没了. 还是要吐槽一下数论题目虽然代码.题解都很好写,但我不相信我能在赛场上想到正解... #include <cstdio> #include <iostream> #d…
Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is also given that n is a small number. For example, if n is 10, the output should be “2, 3, 5, 7″. If n is 20, the output should be “2, 3, 5, 7, 11, 13,…
Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Problem Description Senior Pan had just failed in his math exam, and he can only prepare to make up for it. So he began a daily task with Master Dong, D…
Miller-Rabin素数测试 给出一个小于1e18的数,问它是否为质数?不超过50组询问.hihocoder 我是真的菜,为了不误导他人,本篇仅供个人使用. 首先,一个1e18的数,朴素\(O(\sqrt{n})\)素数判定肯定爆炸.怎么办呢? 我们知道,对于素数p,只要a不是p的倍数,一定有\(a^{p-1}=1\mod p\).那么,我们是不是可以选出某些a,对于要判定的数p,看看他是否满足以a为底的费马小定理,以此来判定质数呢?答案是基本可以. 但是很不巧,有一类合数,以任何小于它们的…
根据费马小定理: 对于素数n,a(0<a<n),a^(n-1)=1(mod n) 如果对于一个<n的正整数a,a^(n-1)!=1(mod n),则n必不是素数. 然后就可以随机生成  <n的数,如果都满足,那n就极有可能是素数. 看书上说,一次素数测试的成功率是 3/4,也就是失败率是1/4,那测m次是错误的概率为:(1/4)^m.可见m稍微大一点就基本不会出错. 但是还有一种数叫,卡迈克尔数. 卡迈克尔数: 一个合数n,对所有满足 gcd(b,n)=1的正整数b都有b^(n-1…