提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、伪大素数生成原理
    • 方法一
    • 方法二
    • 数学基础
  • 二、费马小定理判别法
    • 1.算法
    • 2.代码实现
    • 3.运行结果
  • 二、米勒拉宾素数判定法
    • 1.算法
    • 2.代码实现
    • 3.运行结果
  • 三、不同算法特点及优劣比较

一、伪大素数生成原理

如何生成一个随机的大素数?

方法一

① 随机选取一个大奇数n
②将从2开始的m个素数(2000以内)排列成数组,作为工具a[i]
③令i=0,计算x=n%a[i]
④ 判断,若x=0,说明n显然是合数,回到步骤1。若不等于0,说明暂且可以 认为n是素性的,进行步骤5。
⑤检测n%其他的a[i]. 当i=m-1,则将n视为一个伪素数,然后作为素数生成部分的结果。

方法二

对一个大奇数进行素性检测,如果不是素数,重新生成一个大奇数并再次检验,直至找到一个极大概率为素数的大奇数,即为伪大素数。本文采取此种方法生成伪大素数,素性判定算法分别选用费马小定理判别法和米勒拉宾素数判定法。

数学基础

Fermat 定理: n是一个奇素数,a是任何整数(1≤ a≤n-1) ,则 a^(n-1)≡1(mod n)。
Miller-Rabin算法是Fermat算法的一个变形改进,它的理论基础是由Fermat定理引申而来。
Miller-Rabin 算法的理论基础:

如果n是一个奇素数, 将n-1表示成2^s*r的形式(r是奇数),a是和n互素的任何整数,那么a^r ≡1(mod n) 或者对某个j(0≤j ≤s -1, j∈Z) 等式 a^(2^j*r) ≡-1(mod n)成立。
这个理论是通过一个事实经由Fermat定理推导而来: n是一个奇素数,则方程x^2 ≡ 1 mod n只有±1两个解。

即:

二、费马小定理判别法

1.算法

if 1≤a≤n-1都有 an ≡a (mod n) ,也就是 an-1 mod n = 1, 因此 n 是一个素数

2.代码实现

#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
#include<cmath>using namespace std;/*使用三个rand()生成伪随机数组合生成一个奇数随机数,作为伪素数
**系统时间为种子
**并返回生成的这个大奇数
*/
unsigned int ProduceRandomOdd(){//UINT无符号整形,各伪随机数放在RandomArray数组中 time_t t;//c++时间类型 unsigned int RandomNumber;//记录随机数 do{srand((unsigned)time(&t));//srand(seed)用于给rand()函数设定种子,此处用系统时间//生成 RandomNumber=(rand()<<17)|(rand()<<3)|(rand()); //cout<<RandomNumber<<endl;}while(RandomNumber%2==0||RandomNumber<100000000); //返回   return RandomNumber;
}long long qmod(int a, int b, int p) {long long res = 1;long long term = a%p;while(b) {if(b&1){res = (res*term)%p;}term = (term*term)%p;b >>= 1;}return res;
}bool Fermat_prime(long long n) {   int i;for(i = 0; i < 100; ++i) {if(qmod(1+rand()%(n-1),n-1, n) != 1)break;}if(i < 100)return false;else return true;
}int main(){unsigned int RandomOdd; bool flag;//直至找到过关的伪素数 do{RandomOdd=ProduceRandomOdd();//cout<<RandomOdd<<endl;flag=Fermat_prime(RandomOdd);}while(flag==false);//cout<<"=========================="<<endl;cout<<"生成的一个伪素数为:" <<RandomOdd;
}

3.运行结果

二、米勒拉宾素数判定法

1.算法

Miller-Rabin(n,t)
  输入:一个大于3的奇整数n和一个大于等于1的安全参 数t(用于确定测试轮数)。
  输出:返回n是否是素数(概率意义上的,一般误判概率小于(1/2)80即可) 。
 1、将n-1表示成2sr,(其 中 r是奇数)
 2、 对i从1到 t 循环作下面的操作:
  2.1选择一个随机整数a(2≤a ≤n-2)
  2.2计算y ←ar mod n
  2.3如果y≠1并且y ≠n-1作下面的操作,否则转3:
   2.3.1 j←1;
   2.3.2 当j≤s-1 并且y≠n-1循环作下面操作,否则跳到 2.3.3:
   {计算y ←y2 mod n;
   如果 y=1返回 合数 ;
   否则 j←j+1; }
   2.3.3如果y ≠n-1 则返回 合数 ;
 3、返回素数。

2.代码实现

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//#include <cstddef.h>
using namespace std; /*使用三个rand()生成伪随机数组合生成一个奇数随机数,作为伪素数
**系统时间为种子
**并返回生成的这个大奇数
*/
unsigned int ProduceRandomOdd(){//UINT无符号整形,各伪随机数放在RandomArray数组中 time_t t;//c++时间类型 unsigned int RandomNumber;//记录随机数 do{srand((unsigned)time(&t));//srand(seed)用于给rand()函数设定种子,此处用系统时间//生成 RandomNumber=(rand()<<17)|(rand()<<3)|(rand()); //cout<<RandomNumber<<endl;}while(RandomNumber%2==0||RandomNumber<100000000); //返回   return RandomNumber;
}//模重复平方算法求(b^n)%m
size_t repeatMod(size_t base, size_t n, size_t mod){size_t a = 1;while(n){if(n&1){a=(a*base)%mod;}base=(base*base)%mod;n=n>>1;}return a;
}//Miller-Rabin素数检测
bool rabinmiller(size_t n, size_t k){int s=0;int temp=n-1;    //将n-1表示为(2^s)*t  while ((temp&0x1)==0&&temp){temp=temp>>1;s++;}   size_t t = temp;//判断k轮误判概率不大于(1/4)^kwhile(k--){srand((unsigned)time(0));size_t b = rand()%(n-2)+2; //生成一个b(2≤a ≤n-2)size_t y = repeatMod(b,t,n); if (y == 1 || y == (n-1))return true;for(int j = 1; j<=(s-1) && y != (n-1); ++j){y = repeatMod(y,2,n);if (y == 1)return false;}if (y != (n-1))return false;}return true;
}int main(){size_t k=80;//进行80轮测试 unsigned int RandomOdd; bool flag;//直至找到过关的伪素数 do{RandomOdd=ProduceRandomOdd();//cout<<RandomOdd<<endl;flag=rabinmiller(RandomOdd,k);}while(flag==false);//cout<<"=========================="<<endl;cout<<"生成的一个伪素数为:" <<RandomOdd;}

3.运行结果

三、不同算法特点及优劣比较

①Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重要的地位。
②通过比较各种素数测试算法和对Miller-Rabin算法进行的仔细研究,证明在计算机中构建密码安全体系时, Miller-Rabin算法是完成素数测试的最佳选择。
③通过对Miller-Rabin 算法底层运算的优化,可以取得较以往实现更好的性能,这也是费马素性测试再无用武之地的原因。

C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)相关推荐

  1. c语言生成两位随机素数算法,[算法]费马小定理求质数的算法之Miller-Rabin算法,C语言实现 | 李大仁博客...

    今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法, ...

  2. SICP:费马小定理与素数检测

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/2329 费马小定理 关于费马小定理,读到注解的时候,还是有点震撼的. 皮埃尔•得•费马(1601 ...

  3. 费尔马小定理素数java_费马小定理,我的理解

    原标题:费马小定理,我的理解 触碰标题下面一行的"邵勇老师"查看所有文章:触碰"数学教学研究", 关注本微信公众号(sx100sy). 本公众号内容均由邵勇本人 ...

  4. 【ACM】杭电OJ 4704 Sum (隔板原理+组合数求和公式+费马小定理+快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4704 1.隔板原理 1~N有N个元素,每个元素代表一个1.分成K个数,即在(N-1)个空挡里放置(K-1)块隔板 ...

  5. 费马小定理看了等于没看证明

    一开始我都不知道费马是个人,以为和胡不归问题起名方法一样,是个浪费马的小定理所以叫费马小定理 内容 若 p p p是质数,则对于任意整数 a a a,有 a p ≡ a^p \equiv ap≡ a ...

  6. 关于素数常用结论--威尔逊定理、欧拉定理、费马小定理、米勒罗宾算法

    再需要判定的数比较大时,用枚举法肯定不行的,但目前数学界也没有任何一种又快又准确的判定素数的方法,并且也证明了素数不存在任何一种通项表达式.但作为初等数论中最大的一部分内容,数学家们对素数性质进行了大 ...

  7. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

  8. 费马小定理 素数判定 蒙哥马利算法

    转自:http://www.cnblogs.com/Knuth/archive/2009/09/04/1559949.html 约定: x%y为x取模y,即x除以y所得的余数,当x<y时,x%y ...

  9. 费马小定理 素性判断 蒙哥马利算法

    转载于http://blog.csdn.net/arvonzhang/article/details/8564836 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所 ...

最新文章

  1. php cookie删除不了,php cookie删除不了怎么办
  2. 小米与格力的10亿豪赌!
  3. 工具使用——印象(汇总)
  4. 华为云推出新冠肺炎AI辅助诊断服务,CT量化结果秒级输出
  5. 苹果神秘新iPhone首曝光,外形终于无槽点了!
  6. 例解List<Map<String, Object>>存放的对象问题
  7. [Ogre][地形][原创]基于OgreTerrain的地形实现
  8. 乌班图服务器应用,Ubuntu下安装Apache
  9. mui下载 mui.js下载 mui.css下载
  10. java各知识点详细总结毕向东_毕向东java基础总结(完整版)汇编
  11. win10清理注册表的方法
  12. java8--Lambda表达式
  13. 配置本地DNS服务器地址
  14. Scala语言的特点
  15. Pycharm里面的一些超级好用的功能——(TODO注释)用法防遗忘大法
  16. # 技术栈知识点巩固——Js
  17. macOS忘记密码后如何修改密码
  18. vue 中使用$refs,报this.$refs.xxx.xxx() is not a function
  19. 计蒜客 T1609 掷骰子
  20. Redis高级应(2)-事务以及LUA脚本

热门文章

  1. python爬取豆瓣电视剧页面
  2. 时光不负有心人 --又是折腾的一年
  3. English Learning - Day22 作业打卡 2022.12.28 周三
  4. c语言日期加减天数,日期计算器
  5. 常识 | drm kms 详解
  6. Linux chmod +755和chmod +777 各是什么意思呢?
  7. 多传感器数据融合学习笔记
  8. 北大青鸟消防控制器组网_北大青鸟JBF-11SF-AC801显示控制盘
  9. 钟汉良日记:凡夫俗子一定要眼见为实,菩萨才能见因知果!
  10. 【面经】2022年软件测试面试题大全(持续更新)附答案