大家都知道RSA的加密的安全性就是能够找到一个合适的大素数,而现在判断大素数的办法有许多,比如Fermat素性测试或者Miller-Rabin素性测试,而这里我用了Miller-Rabin素性测试的算法,具体的理论我写到下面。

算法的理论基础:

  1. Fermat定理:若n是奇素数,a是任意正整数(1≤ a≤ n−1),则 a^(n-1) ≡ 1 mod n。

2.  如果n是一个奇素数,将n−1表示成2^s*r的形式,r是奇数,a与n是互素的任何随机整数,那么a^r ≡ 1 mod n或者对某个j (0 ≤ j≤ s−1, j∈Z) 等式a^(2jr) ≡ −1 mod n 成立。

实验需要根据这个算法的理论来实现对素数的判定功能,而我将上述理论用C++的 形式写了出来,然后在一些细节的算法上少做润色,成功实现了对素数的生成和判定。

一、实验代码:

#include<iostream>

#include<cmath>

#include<ctime>

#include<cstdlib>

using namespace std;

typedef unsigned long long ll;

long long q_mul( long long a, long long b, long long mod )

{

long long ans = 0;

while(b)

{

if(b & 1)

{

b--;

ans =(ans+ a)%mod;

}

b /= 2;

a = (a + a) % mod;

}

return ans;

}

long long q_pow( long long a, long long b, long long mod )

{

long long ans = 1;

while(b)

{

if(b & 1)

{

ans = q_mul( ans, a, mod );

}

b /= 2;

a = q_mul( a, a, mod );

}

return ans;

}

//long long q_pow(ll a,ll b,ll mod){

// ll base=a;

// ll ans = 1;

// while(b!=0){

// if(b&1) ans = (ans*base)%mod;

// base = (base*base)%mod;

// b>>=1;

// }

// return ans;

//}

int Miller_Rabin(ll n) {

if(n<2) return 0;

if(n==2) return 1;

ll k=0,q=n-1;

while(q%2==0){

q=q/2;

k++;

}

ll a = rand(); //要保证a在(1,n-1)之间,开区间

a=(a%(n-2))+2;

ll result1 = q_pow(a,q,n);

if(result1 == 1||result1 == n-1){

return 1;

}

while(k--){

result1 = q_mul(result1,2,n);

if(result1 == n-1) return 1;

}

return 0;

}

bool True_Miller_Rabin(ll n){

int times = 10;

while(times){

times--;

if(Miller_Rabin(n)==0) return false;

}

return true;

}

int main()

{

srand((unsigned)time(NULL));

ll num;

// while(1){

// cin>>num;

// if(Miller_Rabin(num)==1)

// cout<<"为素数"<<endl;

// else{

// cout<<"是合数"<<endl;

// }

// }

for(ll i=1000000;i<=1005000;i++){

int a =0;

if(True_Miller_Rabin(i)){

cout<< i<<"是素数"<<endl;

}

}

return 0;

}

二、实验结果(自行测试)

这是对1000000000000000000到1000000000000005000里所有素数判定的结果

这是对输入素数的判读

以上结果说明,该程序完全能够胜任在long long类型范围下的素数判定任务。

三、实验总结

本次实验采用了Miller-Rabin算法,而在理解算法的基础上我们要灵活运用。在算法中我最开始用到了C++函数里面的pow函数,然而这个函数导致我素数输出不完整,经过很久的调试,我发现是C++自带库里面的数据类型与long long类型有出入,所以我放弃了使用自带的函数库。之后,我选择了快速幂算法。这个算法比pow函数效果更好,能够对大数进行快速的幂计算。然而在快速幂计算的过程中设计到两个数相乘,当两个Long 类型的数据相乘时会溢出从而导致计算的大素数长度有限。于是我有考虑将幂计算里面的乘法分成若干个加法去进行运算,于是我采用了快速乘与快速幂想结合的方式,也就是我上述代码中绿色的部分(蓝色部分为单纯快速幂),由此我讲幂运算的速度有提升了一个档次,在此基础上也增大了计算素数的范围。

——————Made By Pinging、、、、、hhh  Welcome to CUMT。。。

转载于:https://www.cnblogs.com/Pinging/p/7468539.html

记一次使用快速幂与Miller-Rabin的大素数生成算法相关推荐

  1. 人工智能快速发展的核心要素,大数据、算法和超级计算的介绍

    人工智能涉及的学科非常多.比如说计算机科学.脑科学.哲学.心理学.语言学等.学术界目前还没有统一的人工智能定义,不同研究方向的专家对人工智能的理解不一样,定义也有所侧重.目前比较通俗的定义是:人工智能 ...

  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 快速幂参考笔者的这篇博文: 算法刷题-数论-组合数.快速幂.逆元.递推求组合数.逆元求组合数 约数之和参考笔者的这篇博文: 算法刷题 ...

  3. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 299  Solved: 207 Description 加里敦星球的 ...

  4. 分治算法——快速幂(平方求幂)

    分治算法--快速幂(平方求幂) 什么是快速幂呢,我们先来看维基百科对快速幂的解释: 在数学和程序设计中,平方求幂(英语:exponentiating by squaring)或快速幂是快速计算一个数( ...

  5. 快速幂算法(理解快速幂只需两道题)

    重点看代码注释 题目 2088: [蓝桥杯]快速幂 时间限制: 1Sec 内存限制: 128MB 题目描述 给定A, B, P,求(A^B) mod P. 输入 输入共一行. 第一行有三个数,N, M ...

  6. 快速幂 快速乘原理讲解(模板)

    目录 1 问题描述 2 原因分析 3 解决方法 4 快速幂讲解 5 快速乘讲解 6 完整代码 7 References 1 问题描述 我们发现,在 int 型下使用 pow 函数求 ,结果为 124 ...

  7. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  8. 快速幂 (转载,详细)

    本文转载的,觉得比较详细 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所 ...

  9. 算法刷题-数论-组合数、快速幂、逆元、递推求组合数、逆元求组合数

    文章目录 acwing885. 求组合数 I(递推:数据范围:2000) acwing875. 快速幂(a的k次方 模 b) acwing876. 快速幂求逆元 acwing886. 求组合数 II( ...

最新文章

  1. jQuery——封装form表单的数据为json对象
  2. 如何给 SAP Spartacus Storefront 创建新的页面
  3. PAT_B_1035_Java(25分)
  4. 稳定匹配问题——稳定婚姻算法设计
  5. Oracle树查询及相关函数
  6. 12v小型电机型号大全_电动机型号参数大全,再也不怕看不懂电机型号了
  7. 图嵌入表示TADW:当DeepWalk加上外部文本信息
  8. 一行命令直接拷贝ssh公钥到远程服务器
  9. 关于Java字符串的几个重点
  10. atitit.流程标准化--- mysql启动不起来的排查流程attilax总结
  11. 多用户网络日记本php,[日记人]超漂亮的多用户网络日记 v3.8
  12. STM32F429I-DISCO ucLinux 开发环境搭建
  13. ​KAKA NFT | 潮物来袭!烤仔英雄系列NFT盲盒即将发售~
  14. 关于Adams仿真过程中问题的解决记录
  15. 写代码时发现……还是Python牛逼
  16. ArcGIS Pro试用许可申请
  17. bcd转ascii码 流程图_BCD码与ASC码互转 | 学步园
  18. 用python写出各种三角形
  19. 2022P气瓶充装考试试题及在线模拟考试
  20. 选购笔记本电脑型号的查询

热门文章

  1. 人社部:截至三季度9757亿元养老保险基金到账运营
  2. 再谈fedora下的音乐和视频播放器的安装
  3. 中国大学生源质量排行榜150强
  4. 对称密码获取(OJ)
  5. mysql sys_connect_by_path_mysql中实现相仿oracle的SYS_CONNECT_BY_PATH功能
  6. mysql 烂泥_烂泥:学习mysql的binlog配置
  7. html 文本框 无法输入,无法在HTML文本框中输入任何东西
  8. python list超出范围_使用lxmldjango/python-list索引超出范围
  9. 菜鸟学java ——(一)面向对象程序设计(几个重要的概念)
  10. oracle用户权限的基本查询