Miller-Rabin算法本质上是一种概率算法,存在误判的可能性,但是出错的概率非常小。出错的概率到底是多少,存在严格的理论推导。

一、费马小定理

假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)

如果存在a<p,且a(p-1) % p != 1,则p肯定不是素数。

二、有限域上的平方根定理

三、Miller-Rabin算法

对于一个大数n,判断n是不是素数的时候,可以先考虑a(n-1)≡ 1(mod n)

对于n-1,一定可以拆分成2s+d:

可以从x = ad开始,依次平方s次,每次平方的时候模上n,按照之前的平方根定理,如果模上n的结果为1的话,那么x一定是1,或者是n-1,如果不满足则不是素数,x=x2,再次循环。

每次随机选一个在2-n-1的数字作为a,可以重复测试。

由于mod上的是n,n是一个大数,所以快速幂中的乘法,需要用快速加法来实现。不然就算模上之后再相乘也会溢出。

  1. #include<iostream>
  2. #include<ctime>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn = +;
  7. ll mul(ll a, ll b, ll m)
  8. //求a*b%m
  9. {
  10. ll ans = ;
  11. a %= m;
  12. while(b)
  13. {
  14. if(b & )ans = (ans + a) % m;
  15. b /= ;
  16. a = (a + a) % m;
  17. }
  18. return ans;
  19. }
  20. ll pow(ll a, ll b, ll m)
  21. //a^b % m
  22. {
  23. ll ans = ;
  24. a %= m;
  25. while(b)
  26. {
  27. if(b & )ans = mul(a, ans, m);
  28. b /= ;
  29. a = mul(a, a, m);
  30. }
  31. ans %= m;
  32. return ans;
  33. }
  34. bool Miller_Rabin(ll n, int repeat)//n是测试的大数,repeat是测试重复次数
  35. {
  36. if(n == || n == )return true;//特判
  37. if(n % == || n == )return false;//偶数和1
  38.  
  39. //将n-1分解成2^s*d
  40. ll d = n - ;
  41. int s = ;
  42. while(!(d & )) ++s, d >>= ;
  43. srand((unsigned)time(NULL));
  44. for(int i = ; i < repeat; i++)//重复repeat次
  45. {
  46. ll a = rand() % (n - ) + ;//取一个随机数,[2,n-1)
  47. ll x = pow(a, d, n);
  48. ll y = ;
  49. for(int j = ; j < s; j++)
  50. {
  51. y = mul(x, x, n);
  52. if(y == && x != && x != (n - ))return false;
  53. x = y;
  54. }
  55. if(y != )return false;//费马小定理
  56. }
  57. return true;
  58. }
  59. int main()
  60. {
  61. int T;
  62. cin >> T;
  63. ll n;
  64. while(T--)
  65. {
  66. cin >> n;
  67. if(Miller_Rabin(n, ))cout<<"Yes"<<endl;
  68. else cout<<"No"<<endl;
  69. }
  70. }

大素数测试的Miller-Rabin算法的更多相关文章

  1. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

  2. Miller Rabin算法详解

    何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...

  3. Miller Rabin算法学习笔记

    定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...

  4. Miller Rabin 算法简介

    0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...

  5. Miller_Rabbin大素数测试

    伪素数: 如果存在和n互素的正整数a满足a^(n-1)≡1(mod n),则n是基于a的伪素数. 是伪素数但不是素数的个数是非常非常少的,所以如果一个数是伪素数,那么他几乎是素数. Miller_Ra ...

  6. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  7. 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)

    关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...

  8. (Miller Rabin算法)判断一个数是否为素数

    1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...

  9. 米勒罗宾素性测试(Miller–Rabin primality test)

    如何判断一个素是素数 效率很高的筛法 打个表 (素数的倍数一定是合数) 就可以解决问题. 筛选法的效率很高,但是遇到大素数就无能为力了. 米勒罗宾素性测试是一个相当著名的判断是否是素数的算法 核心为费 ...

  10. Miller-Rabin大素数测试模板

    根据费马小定理: 对于素数n,a(0<a<n),a^(n-1)=1(mod n) 如果对于一个<n的正整数a,a^(n-1)!=1(mod n),则n必不是素数. 然后就可以随机生成 ...

随机推荐

  1. UOJ #138. 【UER #3】开学前的涂鸦

    Description 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. 一开始,他在纸上画了一棵 n 个节点的树.但是他觉得这样的画太简单了,体现 ...

  2. .netCore2.0 配置文件

    之前的asp.net 的配置文件都是xml格式,而.netCore的配置文件则采用Json键值对的格式来存储,具体获取如下 var config = new ConfigurationBuilder( ...

  3. Expression Blend实例中文教程(12) - 样式和模板快速入门Style,Template

    在上一篇,介绍了Visual State Manager视觉状态管理器,其中涉及到控件的样式(Style)和模板(Template),本篇将详细介绍样式(Style)和模板(Template)在Sil ...

  4. Java 重写(Override)与重载(Overload)区别

    2019-04-1217:31:19 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading). (2)方法重写是在子 ...

  5. Windbg 脚本命令简介 一

    Windbg  脚本命令简介 一 Windbg command r: registers的简写,可以显示或修改寄存器的值.浮点寄存器的值.定义别名变量. 可以显示当前线程下的寄存器值. The r c ...

  6. 来谈谈你对CSS盒模型的认识?

    任何一个网页的搭建都离不开盒模型的堆砌.应该说css模型是web的一个根基,最后呈现出来的效果不同无非就是在高宽.内容与背景删的区别而已. 那么CSS模型有什么认识的呢? 首先,css盒模型有几种呢? ...

  7. csharp:Optical Character Recognition

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. c# json数组动态字段名

    根据给定的列名动态生成json数组 List<string> cols = new List<string>() { "姓名","性别" ...

  9. android 实现类似微信缓存和即时更新好友头像

    引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新 ...

  10. idea 出现 java.noSuchMechodFound

    公司 用了多个项目来相互之间形成依赖.每次修改或者添加新功能,会升级版本.用的是maven,这几天 一直 出现一个问题就是:本地 升级版本完后 使用 git命令 mvn -deploy -e 打包后, ...