Miller-Rabin测试:

  费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余)。反过来,满足ap ≡ a(mod p),p也几乎一定是素数。

  伪素数:如果n是一个正整数,如果存在和n互素的正整数a满足 an-1 ≡ 1(mod n),我们说n是基于a的伪素数。如果一个数是伪素数,那么它几乎肯定是素数。

  Miller-Rabin测试:不断选取不超过n-1的基b(s次),计算是否每次都有bn-1 ≡ 1(mod n),若每次都成立则n是素数,否则为合数。 

结合算法导论中说明的理解,参考代码如下:

package cn.ansj;import java.util.Random;public class MillerRabin {private static final int ORDER = 10000;// 随机数的数量级 private static final int MIN = 1000; // 选择的随机数的最小值public static void main(String[] args){int x = getPrime();boolean flag = true;for (int i = 0; i < 10; i++){if (!isPrime(x)){flag = false;break;}}if (flag) System.out.println(x + ":是素数,通过测试");else System.out.println(x + ":不是素数");  }/*** 整数转为二进制* * @param m整数m* @return 字节数组*/public static byte[] getByte(int m){String sb = "";while (m > 0){sb = (m % 2) + sb;m = m / 2;}return sb.getBytes();}/*** 平方-乘法计算指数模运算 a^m % n* * @param a底数* @param m指数* @param n被mod数* @return*/public static int Square_and_Mutiply(int a, int m, int n){int d = 1;      byte[] bm = getByte(m);// 把m转化为二进制数for (int i = 0; i < bm.length; i++){d = (d * d) % n;      if (bm[i] == 49)// 二进制1等于asciI码的49d = (d * a) % n;  }return d;}/*** 随机选择一个奇数*/public static int getRandom(){int x = 3;Random rd = new Random();do{x = rd.nextInt(ORDER);} while (x < MIN || x % 2 == 0);return x;}/*** 验证一个数是否为素数,将n-1改写为2^k * m的形式,其中m是奇数,在{2,...,n-1}中随机选取一个整数a;* * @param n* @return 如果是素数返回true,否则返回false*/public static boolean isPrime(int n){  int[] arr = intTOIndex(n - 1);// n-1 用2的幂表示int k = arr[0];int m = arr[1];  Random r = new Random();// 在{2,...,n-1}随机选择一个整数aint a = 0;do {a = r.nextInt(n - 1);} while (a < 2);int b = Square_and_Mutiply(a, m, n);if (b == 1)   return true;for (int i = 0; i < k; i++)  {if (b == (n - 1)) return true;else b = (b * b) % n;   }return false;}/*** 将一个数改为2^k * m的形式,其中m是奇数* * @param n* @return arr[0]=k,arr[1]=m*/public static int[] intTOIndex(int n){int[] arr = new int[2];int k = 0;int x;// 当n为奇数是停止循环do {k++;n >>= 1;x = n & 1;} while (x == 0);arr[0] = k;arr[1] = n;return arr;}/*** 获取一个随机数为并且检查其为素数* * @return*/public  static int getPrime(){int x = 0;while (x % 2 == 0 || !isPrime(x)){x = getRandom();}return x;}
}

执行结果:

7207:是素数,通过测试

Java实现算法导论中Miller-Rabin随机性素数测试相关推荐

  1. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  2. Java实现算法导论中Rabin-Karp字符串匹配算法

    Rabin-Karp算法的思想: 假设子串的长度为M,目标字符串的长度为N 计算子串的hash值 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次) 比较hash值 如果hash ...

  3. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

  4. Java实现算法导论中反复平方法模取幂

    在众多的加密算法中都需要进行幂的取模运算,比如在RSA算法中需要计算d=ne mod N,我们称之为幂模算法,其中: N=p*q(p,q为大素数) n为加密数据,n<N e为公钥,d为私钥,满足 ...

  5. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  6. Java实现算法导论中快速傅里叶变换FFT递归算法

    要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...

  7. Java实现算法导论中有限自动机字符串匹配算法

    这里实现了基于有限自动机(Finite Automaton,FA)的模式匹配算法,算法的重点在于利用字符串的前后缀构造模式P的自动机,具体结合导论中的说明来理解,可参考http://www.geeks ...

  8. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

  9. Java实现算法导论中快速傅里叶变换FFT迭代算法

    要结合算法导论理解,参考:http://blog.csdn.NET/fjssharpsword/article/details/53281889 FFT的迭代实现,可以实现并行电路,和比较网络中的比较 ...

最新文章

  1. 计算机显示网络地址,u盘装系统win7打开电脑显示正在获取网络地址怎么处理
  2. Servlet—07—Cookie; Seesion;
  3. uva-11111-栈
  4. 如何保护 SpringBoot 配置文件中的敏感信息
  5. VTK:量化多数据点用法实战
  6. UITabBarController 和 UINavigationController 的详解
  7. leetcode LCP 19. 秋叶收藏集(dp)
  8. java学习(45):无参无返回
  9. java 标注 json_java – 注释资源以生成JSON,但在响应头中返回“text/plain”
  10. C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
  11. 笔记_pytorch
  12. (精品)java宠物医院管理系统+论文+答辩ppt+部署视频+效果图效果视频
  13. 【C#大作业】你画我猜——设计文档
  14. ABB机器人画圆编程_ABB机器人编程基础(功能程序)
  15. HTML5七夕情人节表白网页制作【一起跨年表白代码】HTML+CSS+JavaScript
  16. DAU是啥,数据指标是啥?必知必会的数据分析常识
  17. 沃达丰高管:澳大利亚将于2020年迎来5G
  18. 申请计算机语言学留学要求,布兰迪斯大学计算机语言学文学硕士研究生申请要求及申请材料要求清单...
  19. 图片数据增强,包括模糊,亮度,裁剪,旋转,平移,镜像 ,python ,LabelImg,LabelMe工具
  20. COMP252, Winter 2022. Jan 13, 2022. Due Jan 20, 2022, 4pm.

热门文章

  1. wps怎么投递简历发到boss直聘_BOSS直聘情色招聘:洗脑传销广告漫天飞,还陷虚假招聘...
  2. 在IIS上启用Gzip压缩 (HTTP压缩)方法
  3. nodeJs实现文件上传,下载,删除
  4. 记一次使用快速幂与Miller-Rabin的大素数生成算法
  5. SHUoj 字符串进制转换
  6. 我的HTML学习记录(七)
  7. leetcode - Populating Next Right Pointers in Each Node II
  8. Linux Tomcat 简介
  9. 安装phpredis扩展以及phpRedisAdmin工具
  10. 摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释