在有限的时间内,计算出一个尽可能大的素数

一.问题点

  • 有限时间:在一个可接受的时间范围内,并非依靠暴力求解
  • 尽可能大:可计算素数的上限
  • 素数:因数只有1和它本身的自然数

二.素数的生成

n 位的十进制位的大素数生成步骤如下:

  1. 产生一个 n 位的随机数p
  2. 若最低位为偶数, 则将它加1, 以确保该素数为奇数, 从而保证了平均节省一半的运算时间
  3. 检查以确保 p 不能被任何小素数整除, 如 3, 5, 7, 11 等等,目的是排除 p 是合数的绝大部分可能性, 减少了下面步骤对 p 进行素数测试的总次数, 从而大大节省了运算时间。我采用了除2 以外(因已经检验过 p 的奇偶性)的所有小于 20 的素数, 来测试 p 对于它们的整除性
  4. 产生一个随机数 a, 对 a 进行 Rabin- Miller测试,如果 p 通过测试, 则另外产生一个随 机数 a, 再重新进行测试选取较小的 a 值,以保证较快的运算速度,作 3次Rabin-Miller 测试(1次看起来已足够, 但为保证较高的精确性, 可以多做几次)
  5. 如果 p 通过测试, 则 p 是素数,否则将原被测试数加 2, 得到一个新的数, 再对新数进行测试, 直到找到一个素数为止

三.Miller-Rabin 算法

Miller-Rabin 算法是一种基于概率的素性测试算法,因此该算法与一般的基于事实的真素性测试方法的区别是:存在一定的误判率。但是在对于某个较大的待测数字进行多次测试的情况下,误判率可以控制在可忽略范围内。Miller-Rabin算法基于 Fermat 算法,属于后者的变形、改进。

首先引入 Fermat定理:n是一个奇素数,a是任何整数(1 ≤ a ≤ n-1) ,则a^(n-1)≡1(mod n)根据此定理可以知道,对于给定的待测数字 n,可以通过设定素性测试算法,计算 w = a^(n-1)%n的结果来判定。

  • W!=1,n一定不是素数;

  • W==1,n可能是素数;

再引入二次探测定理,如果 n 是一个整数,且 0<x<n,则:x2%p=1 有: x= 1 / x = p-1。若n是素数,则( n-1 )一定是偶数,因此可令(n-1)=m*(2^q),其中m是正奇数( 若n是偶数,则上面的m*(2^q)一定可以分解成一个正奇数乘以2的k次方的形式 ),q是非负整数。

借助 Fermat 定理,进行如下测试:a^(m)%n、a^(2m)%n、a^(4m)%n、a^(m*(2^q))%n。进行这些测试的过程为:Miller-Rabin 测试。

误判率:若 n 是素数,a 是小于 n 的正整数,则 n 对以 a 为基的Miller 测试,结果为真。Miller 测试进行 k次,将合数当成素数处理的错误概率最多不会超过 4^(-k)。

四.Java程序实现

/*** 题目8:计算一个尽可能大的素数* 题目描述:在有限的时间内,计算出一个尽可能大的素数。*/
package edu.sust;import java.util.Random;
import java.util.Scanner;public class PrimeNumber {public static void main(String[] args) {long startTime = System.currentTimeMillis();    //开始时间Scanner scanner = new Scanner(System.in);long executeTime;//程序执行时间System.out.println("请输入程序运行的时间(毫秒为单位):");executeTime = scanner.nextLong();long endTime = System.currentTimeMillis();  //结束时间int maxPrime = 2;   //最大素数while (endTime - startTime < executeTime) {int num = getRandom();if (num > maxPrime) {if (MillerRabin(num, 3))maxPrime = num;}endTime = System.currentTimeMillis();}System.out.println(maxPrime);scanner.close();}public static int getRandom() {Random random = new Random();int num = random.nextInt(Integer.MAX_VALUE);if ((num & 1) != 1) {num++;//若最低位为偶数, 则将它加1, 以确保该素数为奇数}//检查以确保 p 不能被任何小素数整除int[] primes = {3, 5, 7, 11, 13, 17, 19};for (int i = 0; i < primes.length; i++) {if (num % primes[i] == 0)return -1;}return num;}/*** 利用费马小定理求大数幂取模** @param a 底数* @param b 指数* @param n 模数* @return 返回(a ^ b) mod n的值*/public static int FermatPower(int a, int b, int n) {int result = 1;while (b > 0) {if ((b & 1) == 1)result = (result * a) % n;if ((a * a) % n == 1 && a != 1 && a != n - 1)return -1;// 二次探测b >>= 1;a = (a * a) % n;}return result;}/*** Miller-Rabin素性测试** @param n    待测随机数* @param time 检测次数* @return 若通过测试,返回true,否则返回false*/public static boolean MillerRabin(int n, int time) {Random random = new Random();for (int i = 0; i < time; i++) {if (FermatPower(random.nextInt(n - 1) + 2, n - 1, n) != 1)return false;}return true;}
}

参考文献

  1. 刘少涛, 凌捷. 数据加密算法与大素数的生成及运算[J]. 广东工业大学学报, 2001(04):27-31.
  2. 张宏, 刘晓霞, 张若岩. RSA公钥密码体制中安全大素数的生成[J]. 计算机技术与发展, 2008(09):137-139+143.
  3. 韩了了, 傅兴华, 刘新华, et al. 一种基于RSA公钥密码体制大素数的生成方法[J]. 贵州大学学报(自然科学版), 2005(04):101-104.

计算一个尽可能大的素数相关推荐

  1. 下一个人才大缺口:量子计算研究人员

    https://blog.csdn.net/cf2SudS8x8F0v/article/details/83552249 来源:36Kr 初创公司Zapata Computing的创始人兼首席执行官克 ...

  2. Java黑皮书课后题第5章:*5.23(演示抵消错误)当处理一个很大的数字或很小的数字时候,会产生一个抵消错误。……编写程序对上面的数列从左到右和从右向左计算的结果进行比较,n=50000

    5.23(演示抵消错误)1 + 1/2 + 1/3 + -- + 1/n,编写程序对上面的数列从左到右和从右向左计算的结果进行比较,n=50000 题目 题目概述 破题 代码 运行示例 题目 题目概述 ...

  3. 验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。请输入一个偶数,将其表示成两个素数之和。

    验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和.请输入一个偶数,将其表示成两个素数之和. #include<iostream> #include<cmath> ...

  4. LeetCode 496. 下一个更大元素 I

    599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...

  5. 云计算与边缘计算协同 九大应用场景

    前言 2019 年边缘计算备受产业关注,一度引起了资本市场的投资热潮,很多人把2019 年称作边缘计算的元年.理性来看,造成如此火爆局势难免有一些炒作因素在推波助澜,毕竟边缘计算的概念存世也已多年.当 ...

  6. python任意输入一个正整数、判断该数是否为素数_Python编程判断一个正整数是否为素数的方法,python素数...

    Python编程判断一个正整数是否为素数的方法,python素数 本文实例讲述了Python编程判断一个正整数是否为素数的方法.分享给大家供大家参考,具体如下: import string impor ...

  7. 人类的下一代计算平台——科技大发展前景下的新思考

    来源:亿欧 概要:所谓的最大的下一代计算平台,在可见的未来,不会是一个如同手机般的单一平台,而是一种生态化的泛计算平台. 在可见的范围(5-10年)内,计算平台发展方向应该是"交互设备+云计 ...

  8. 跨越行业绊脚石,阿里云函数计算发布 7 大技术突破

    作者|望宸 等 Serverless 的本质是通过屏蔽底层的计算资源,来实现业务层开发的专注度和自由度.但越是往上抽象,云厂商在底层的实现就越是复杂.函数计算将服务进一步拆分到函数的颗粒度,这势必会给 ...

  9. 六十五、下一个更大的数系列,单调栈解决方法

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校的2020新生. ...

最新文章

  1. Java交换两个Integer-一道无聊的题的思考
  2. python数据科学实践指南_《Python数据科学实践指南》——导读-阿里云开发者社区...
  3. spring mvc学习(49):返回json数据
  4. java 类型转换_java中的基本数据类型的转换
  5. 从Java程序员进阶为架构师,全套16张图概括最全技能!建议收藏!
  6. html特效代码是怎么实现的,html特效代码大全
  7. 完整的元器件选型指南
  8. 修复oracle注册表,老司机修复oracle卸载干净【调解方案】
  9. 微信小程序实现自动登录
  10. 深圳内推 | 深圳计算科学研究院招聘机器学习助理工程师(校招)
  11. 十二、项目收尾(华为项目管理法-孙科炎读书摘要)
  12. 第十节、grep、find、sed和awk
  13. 礼物:《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)
  14. 动手开发一个滴滴出行,是的,你没有看错!
  15. php trum,口碑曝光TrumoAurora评测如何?怎么样呢?使用报告曝光评测
  16. mcake蛋糕预订图片
  17. 自定义控件其实很简单 三
  18. 工业dcs系统有服务器吗,DCS是什么 你了解多少
  19. Vulkan spec 中文版 翻译基础版本切换
  20. 学习 Go 语言(Golang)读书笔记

热门文章

  1. CentOS 7 换yum源
  2. [POJ2976] Dropping tests
  3. vmware-images
  4. chrome调试找不到 XXXX.min.map 原因及解决办法
  5. 超棒的javascript移动触摸设备开发类库-QUOjs
  6. 【CSON原创】HTML5游戏框架cnGameJS开发实录
  7. 【转】Scott_ASP.NET MVC框架(第三部分) 把ViewData从控制器传到视图
  8. ajax配置要求,AJAX浅谈
  9. codematic2连接mysql失败_怎么连接oracle数据库
  10. 抖音怎么上传无损画质_抖音怎么上传高清视频?干货,从此告别模糊