MR素性检测算法

  转载地址: http://m.blog.csdn.net/blog/spirtsong/38273187

  素数是除了自身和1以外,没有其它素数因子的自然数。自从欧几里得证明了有无穷个素数以后,人们就企图寻找一个可以构造所有素数的公式,寻找判定一个自然数是不是素数的方法。因为素数的地位非常重要。

  鉴别一个自然数是素数还是合数,这个问题在中世纪就引起人们注意,当时人们试图寻找质数公式,到了高斯时代,基本上确认了简单的质数公式是不存在的,因此,高斯认为对素性判定是一个相当困难的问题。从此以后,这个问题吸引了大批数学家。 素性判断算法可分为两大类,确定性算法及随机算法。前者可给出确定的结果但通常较慢,后者则反之。

  这里主要讲米勒拉宾算法,最后提供c++实现代码。

  要测试 是否为素数,首先将 分解为 。在每次测试开始时,先随机选一个 介于 的整数 ,之后如果对所有的 ,若,则 N 是合数。否则, 的概率为素数。

  Miller- Rabin算法随机生成底数a,进行多次调用函数进行测试,Miller-Rabin检测也存在伪素数的问题,但是与费马检测不同,MR检测的正确概率不 依赖被检测数p,而仅依赖于检测次数。已经证明,如果一个数p为合数,那么Miller-Rabin检测的证据数量不少于比其小的正整数的3/4,换言 之,k次检测后得到错误结果的概率为(1/4)^k。我们在实际应用中一般可以测试15~20次。

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4
 5 long long qpow(int a,int b,int r)//快速幂
 6 {
 7     long long ans=1,buff=a;
 8     while(b)
 9     {
10         if(b&1)ans=(ans*buff)%r;
11         buff=(buff*buff)%r;
12         b>>=1;
13     }
14     return ans;
15 }
16 bool Miller_Rabbin(int n,int a)//米勒拉宾素数测试
17 {
18     int r=0,s=n-1,j;
19     if(!(n%a))
20         return false;
21     while(!(s&1)){
22         s>>=1;
23         r++;
24     }
25     long long k=qpow(a,s,n);
26     if(k==1)
27         return true;
28     for(j=0;j<r;j++,k=k*k%n)
29         if(k==n-1)
30             return true;
31     return false;
32 }
33 bool IsPrime(int n)//判断是否是素数
34 {
35     int tab[]={2,3,5,7};
36     for(int i=0;i<4;i++)
37     {
38         if(n==tab[i])
39             return true;
40         if(!Miller_Rabbin(n,tab[i]))
41             return false;
42     }
43     return true;
44 }
45 int main()
46 {
47     long long n;
48     while(1)
49     {
50        cin >> n;
51     cout << IsPrime(n)<< endl;
52     }
53
54     return 0;
55 }
时间: 2024-10-27 13:14:08

MR素性检测算法的相关文章

【信息安全数学基础】Fermat素性检测

算法背景与原理: 1.Fermat小定理:给定素数p,a∈Z,则有a^(p-1)%p=1 2.Fermat素性检测算法:奇整数m,若任取一整数2<=a<=m-2,gcd(a,m)=1,使得a^(m-1)%m=1,则m至少有1/2的概率为素数 算法步骤: 1.从文本中读取数字作为待判定的大数m 2.给出安全参数k 3.随机选取整数a,满足a∈[2,m-2] 4.计算g=gcd(a,m),如果g=1进行下一步,否则不是素数跳出 5.计算r=a^(m-1)%m,如果r=1则m可能是素数,否则不是素数

Miller-Rabin素性判定算法

Miller-Rabin素性判定算法是一种基于概率的判定算法,每次判定n是素数的正确性概率至少为75%,出错的概率小于25%. 如果对n进行k次素性检测,如果结果n为素数,那么n为合数的概率为1/(4^k).如果k足够大,那么误判的概率就非常小. 算法原理如下: #include <iostream> #include <random> #include <time.h> using namespace std; typedef unsigned __int64 llo

φ累积失败检测算法(转)

在分布式系统中经常使用心跳(Heartbeat)来检测Server的健康状况,但从理论上来说,心跳无法真正检测对方是否crash,主要困难在于无法真正区别对方是宕机还是“慢”.传统的检测方法是设定一个超时时间T,只要在T之内没有接收到对方的心跳包便认为对方宕机,方法简单粗暴,但使用广泛. 1. 传统错误检测存在的缺陷 如上所述,在传统方式下,目标主机会每间隔t秒发起心跳,而接收方采用超时时间T(t<T)来判断目标是否宕机,接收方首先要非常清楚目标的心跳规律(周期为t的间隔)才能正确设定一个超时时

车道线检测文献解读系列(一) 基于机器视觉的高速车道标志线检测算法的研究_李晗

作者背景 基于机器视觉的高速车道标志线检测算法的研究_李晗 东北大学车辆工程硕士学位论文 2006年 [GB/T 7714]李晗. 基于机器视觉的高速车道标志线检测算法的研究[D]. 东北大学, 2006. DOI:10.7666/d.y852642.` 论文结构一览 预处理 灰度化 [亮点]模式判别 选择日间模式还是夜间模式: 在每个检测周期开始时,首先判断采用日间模式还是夜间模式工作.摄像机视野中的上半部分为天空背景,天空亮度可以显著区分日间和夜间环境.由于天空的颜色为蓝离,日间天空的蓝色分

序贯相似性检测算法(SSDA)

传统的模板匹配算法的基本搜索策略是遍历性的,为了找到最优匹配点,传统方法均必须在搜索区域内的每一个像素点上进行区域相关匹配计算,图像相关匹配的数据量和计算量很大,匹配速度较慢,序贯相似性检测算法(SSDA)是针对传统模板匹配算法提出的一种高效的图像匹配算法.具体算法是先初步搜索,再精搜索,搜索的范围一步一步减小. SSDA通过人为设定一个固定阈值,及早地终止在不匹配位置上的计算,以此减小计算量,达到提高运算速度的目的.其步骤如下: (1)选取一个误差准则,作为终止不匹配点计算的标准,通常可选取绝

深度学习 目标检测算法 SSD 论文简介

深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 二.代码训练测试: https://github.com/weiliu89/caffe/tree/ssd  一.论文算法大致流程: 1.类似"anchor"机制: 如上所示:在 featur

3D空间中射线与轴向包围盒AABB的交叉检测算法

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

相似数据检测算法

相似数据检测算法对给定的一对数据序列计算两者之间的相似度([0,1], 1表示完全相同)或距离([0, ), 0表示完全相同),从而度量数据之间的相似程度.相似数据检测在信息科学领域具有非常重要的应用价值,比如搜索引擎检索结果的聚类与排序.数据聚类与分类.Spam检测.论文剽窃检测.重复数据删除.Delta数据编码等应用.正是由于它的重要性,近年来成为了研究的重点,不断有新检测方法涌现并得到评估.其中,Broder提出的shingling算法和Charikar的simhash算法被认为是目前为止

如何开发一个异常检测系统:如何评价一个异常检测算法

利用数值来评价一个异常检测算法的重要性 使用实数评价法很重要,当你用某个算法来开发一个具体的机器学习应用时,你常常需要做出很多决定,如选择什么样的特征等等,如果你能找到如何来评价算法,直接返回一个实数来告诉你算法的好坏,那样你做决定就会更容易一些.如现在有一个特征,要不要将这个特征考虑进来?如果你带上这个特征运行你的算法,再去掉这个特征运行你的算法,得到返回的实数,这个实数直接告诉你加上这个特征算法是变好了还是变坏了,这样你就有一种更简单的算法来确定是否要加上这个特征. 为了更快地开发出一个异常