MillerRabin素性测试(数论:素数Template)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 #define random(a , b) ((a) + rand() % ((b) - (a) + 1))
 5 LL QuickPower(LL a , LL b , LL p)
 6 {
 7     LL yaoyuan = 1;
 8     while(b)
 9     {
10         if(b & 1)   yaoyuan = yaoyuan * a % p;
11         a = a * a % p;
12         b >>= 1;
13     }
14     return yaoyuan;
15 }
16 bool MillerRabin(LL p)
17 {
18     for(int i = 1 ; i <= 50 ; ++i)
19     {
20         LL a = random(1 , p - 1);
21         if(QuickPower(a , p - 1 , p) != 1)
22         {
23             return 0;
24         }
25     }
26     return 1;
27 }
28 int main()
29 {
30     LL p = 0;
31     int t;
32     scanf("%d" , &t);
33     while(t--)
34     {
35         scanf("%lld" , &p);
36         if(MillerRabin(p))
37         {
38             printf("Yes\n");
39         }
40         else
41         {
42             printf("No\n");
43         }
44     }
45 }
时间: 2024-10-29 10:46:48

MillerRabin素性测试(数论:素数Template)的相关文章

Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要把询问范围加到 \(10^{18}\) ,再多组询问呢? Miller 和 Rabin 建立了Miller-Rabin 质数测试算法. \(\\\) Fermat 测试 首先我们知道费马小定理: \[ a^{p-1}\equiv 1\pmod p \] 当且仅当 \(p\) 为素数时成立. 逆命题是

@总结 - [email&#160;protected] Miller-Rabin素性测试与Pollard-Rho因数分解

目录 @1 - 素性测试:Miller-Rabin算法@ @1.1 - 算法来源@ @1.2 - 算法描述@ @1.3 - 算法实现@ @2 - 因数分解:Pollard-Rho算法@ @2.0 - 参考资料@ @2.1 - 算法来源@ @2.2 - 算法描述@ @2.3 - 算法实现@ @1 - 素性测试:Miller-Rabin算法@ @1.1 - 算法来源@ 假如我们需要检测一个数 x 是否为素数,我们应该怎么做? 最显然的就是从 2~n-1 尝试去找到 x 的另一个因数. 当然可以稍微优

Miller-Rabin 素性测试

根据费马小定理,若p为素数,则必有a^(p-1) mod p=1 对和p互质的a成立. 根据二次探测定理:如果p是素数,且0<x<p,则方程x^2 mod p=1的解为1或p-1. 所以若p为素数,则必有a^(p-1) mod p 的平方根为1或-1 分解p-1为d*2^s,其中d为奇数 从i=0逐次计算a^(d*2^(s-i)),相当于“开方”,若得到-1或追查到a^d=1 (mod p),则p通过测试,否则不通过 时间复杂度O(k*(logn)^3) (其中k为选的a的个数(the mor

Miller-Rabin素性测试(Python实现)

import random def fast_power(base, power, n): result = 1 tmp = base while power > 0: if power&1 == 1: result = (result * tmp) % n tmp = (tmp * tmp) % n power = power>>1 return result def Miller_Rabin(n, iter_num): # 2 is prime if n == 2: retu

数论部分第一节:素数与素性测试【详解】

数论部分第一节:素数与素性测试 一个数是素数(也叫质数),当且仅当它的约数只有两个——1和它本身.规定这两个约数不能相同,因此1不是素数.对素数的研究属于数论范畴,你可以看到许多数学家没事就想出一些符合某种性质的素数并称它为某某某素数.整个数论几乎就围绕着整除和素数之类的词转过去转过来.对于写代码的人来说,素数比想像中的更重要,Google一下BigPrime或者big_prime你总会发现大堆大堆用到了素数常量的程序代码.平时没事时可以记一些素数下来以备急用.我会选一些好记的素数,比如4567

数论——素数和反素数

素数 素数一般判定方法 bool isPrime(a) { if (a < 2) return 0; for (int i = 2; i * i <= a; ++i) if (a % i) return 0; return 1; } 但对于long long int的数,O(√n)的复杂度还是会时间超限. 此时要用Miller-Rabin 素性测试,但也只是极为可能是素数. 复杂度O(klog3n). #include <iostream> using namespace std

hihocoder 1287 : 数论一&#183;Miller-Rabin质数测试 大质数判定

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,其中有个叫RSA的公钥密码算法.RSA算法的计算过程中,需要找一些很大的质数. 小Ho:要如何来找出足够大的质数呢? 小Hi:我倒是有一个想法,我们可以先随机一个特别大的初始奇数,然后检查它是不是质数,如果不是就找比它大2的数,一直重复,直到找到一个质数为止. 小Ho:这样好像可行,那我就这么办吧. 过了一会儿,小Ho拿来了一张写满数字的纸条. 小Ho:我用程序随机生成了一些初

米勒-拉宾素性测试学习

之前一直对于这个神奇的素性判定方法感到痴迷而又没有时间去了解.借着学习<信息安全数学基础>将素性这一判定方法学习一遍. 首先证明一下费马小定理. 若p为素数,且gcd(a, p)=1, 则有 a^(p-1) = 1 (mod p) 基于以下定理 若(a, p)=1,{x| (x, p)=1}为模p下的一个完全剩余系,则{ax| (x, p)=1}也为模p下的一个完全剩余系. 又{0, 1, 2, ... p-1}为模p下一个剩余系   因此有, {a*0, a*1, a*2, ... a*(p

Miller-Rabin质数测试

这种质数算法是基于费马小定理的一个扩展. 费马小定理:对于质数p和任意整数a,有a^p ≡ a(mod p)(同余).反之,若满足a^p ≡ a(mod p),p也有很大概率为质数. 将两边同时约去一个a,则有a^(p-1) ≡ 1(mod p) 也即是说:假设我们要测试n是否为质数.我们可以随机选取一个数a,然后计算a^(n-1) mod n,如果结果不为1,我们可以100%断定n不是质数. 否则我们再随机选取一个新的数a进行测试.如此反复多次,如果每次结果都是1,我们就假定n是质数. 该测试