当前位置:首页 » 操作系统 » 米勒拉宾算法

米勒拉宾算法

发布时间: 2022-05-24 01:35:56

① 急急急 求大神帮忙 用vc++ 生成1024位大素数 用到米勒拉宾素性测试

首先如果搞密码学的编程推荐你看本书《程序员密码学》里面讲的是现在密码学的实现再次,解决生成大素数的这个问题思路是这样的:随机生成一个很大的数,用的算法判断这个数是不是素数如果不是继续生成另一个大素数再判断直到找到一个大素数也就是说核心是素性检验算法这种算法不少有fermat素性检验Miller-Rabin素性检验还有好几种但是没数学基础的话是搞不懂的如果深入了解的话参照一本书《信息安全数学基础》其中有一章都是讲素性检验的问题的推荐楼主采用fermat素性检验最简单但是个不确定算法因为有fermat欺骗但是概率极低极低可以用/view/831881.htm

② 关于素数检验的米勒拉宾算法的C++实现

Miller-Rabin算法是基于费马定理的:
如果n为质数,(a,n)=1 那么 a^(n-1)=1 (mod n)

Miller-Rabin算法就是费马定理反向的使用:
如果有足够多的a,(a,n)=1 使a^(n-1)=1 (mod n)都成立
那么n为质数

但是并不是一个完美的算法,
如果以2,3,5,7为底,在2.5*10^13以内只有3215031751这一个数是判断错误的
因为A^B可以在logB的时间复杂度内运算完
所以Miller-Rabin算法的复杂度O(logn)比起朴素O(sqrt(n))快上了非常多

程序:(你可以让p数组随机,不一定要用2,3,5,7为底)
const
p:array[1..4] of integer=(2,3,5,7);
var
n,i:longint;
f:boolean;

function exp(a,b:longint):longint; //计算a^b除以n的余数
var
t:qword;
begin
if b=0 then exit(1);
if b=1 then exit(a mod n);
t:=sqr(exp(a,b div 2)) mod n;
if b mod 2=1 then t:=t*a mod n;
end;

begin
readln(n);
f:=true;
for i:=1 to 4 do
if exp(p[i],n-1)<>1 then
begin
f:=false;
break;
end;
if f then writeln('YES') else writeln('NO');
end.

其中,需要自行判断n为1,2,3,5,7的情况(一开始加个if就行)

这个程序能处理出longint内所有>7的素数

③ 素数是什么

素数又叫质数(prime number),有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

质数具有许多独特的性质:

(1)质数p的约数只有两个:1和p。

(2)初等数学基本定理:任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,且这种分解是唯一的。

(3)质数的个数是无限的。

(4)质数的个数公式

(3)米勒拉宾算法扩展阅读:

逆素数:

顺着读与逆着读都是素数的数。如1949与9491,3011与1103,1453与3541等。无重逆素数是数字都不重复的逆素数。如13与31,17与71,37与73,79与97,107与701等。

循环下降素数与循环上升素数:

按1——9这9个数码反序或正序相连而成的素数(9和1相接)。如:43,1987,76543,23,23456789,1234567891。现在找到的最大一个是28位的数:1234567891234567891234567891。

由一些特殊数码组成的数:

如31,331,3331,33331,333331,3333331,以及33333331都是素数,但下一个333333331却是一个合数。特别着名的是全由1组成的素数。把由连续n个1组成的数记为Rn,则R2=11是一个素数,后来发现R19、R23、R317都是素数。

素数研究是数论中最古老、也是最基本的部分,其中集中了看上去极为简单、却几十年甚至几百年都难以解决的大量问题。除了"哥德巴赫猜想"等几个着名问题外,还有许多问题至今未解决。

网络-质数

④ 输出指定下限和数量的质数

输出指定下限和数量的质数:如果j>i/2就说明i没有除1和他本身之外的因数,因为大于i/2的数不可能是i的因数,那么i就是质数,输出i。

参考代码如下:package test;public class Test {public static void main(String[] args) {int j;for (int i = 2; i <= 100; i++) // 1不是素数,所以直接从2开始循环{j = 2;while (i % j != 0)j++; // 测试2至i的数字是否能被i整除,如不能就自加if (j == i) // 当有被整除的数字时,判断它是不是自身。

随机素性测试的基本结构:

1、随机选取一个数字a。

2、检测某个包含a和输入n的等式(与所使用的测试方法有关)。如果等式不成立,则n是合数,a作为n是合数的证据,测试完成。

3、从1步骤重复整个过程直到达到所设定的精确程度。

在几次或多次测试之后,如果n没有被判断为合数,那么我们可以说n可能是素数。

常见的检测算法:费马素性检验(Fermat primality test),米勒拉宾测试(Miller–Rabin primality test) ,Solovay–Strassen测试,卢卡斯-莱默检验法(Lucas–Lehmer primality test)。




⑤ 如何知道一个很大的数是不是素数

高速判断用 miller-rabin算法或者 aks 算法

1.约定

x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数。
x^y表示x的y次方。乘方运算的优先级高于乘除和取模,加减的优先级最低。
见到x^y/z这样,就先算乘方,再算除法。
A/B,称为A除以B,也称为B除A。
若A%B=0,即称为A可以被B整除,也称B可以整除A。
A*B表示A乘以B或称A乘B,B乘A,B乘以A……都一样。

2.费马小定理:

有N为任意正整数,P为素数,且N不能被P整除(显然N和P互质),则有:N^P%P=N(即:N的P次方除以P的余数是N)。

但是我查了很多资料见到的公式都是这个样子:

(N^(P-1))%P=1后来分析了一下,两个式子其实是一样的,可以互相变形得到。

原式可化为:(N^P-N)%P=0(即:N的P次方减N可以被P整除,因为由费马小定理知道N的P次方除以P的余数是N)把N提出来一个,N^P就成了你N*(N^(P-1)),那么(N^P-N)%P=0可化为:

(N*(N^(P-1)-1))%P=0
请注意上式,含义是:N*(N^(P-1)-1)可以被P整除

又因为N*(N^(P-1)-1)必能整除N(这不费话么!)
所以,N*(N^(P-1)-1)是N和P的公倍数,小学知识了^_^

又因为前提是N与P互质,而互质数的最小公倍数为它们的乘积,所以一定存在

正整数M使得等式成立:N*(N^(P-1)-1)=M*N*P
两边约去N,化简之:N^(P-1)-1=M*P
因为M是整数,显然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

2.费马小定理:

有N为任意正整数,P为素数,且N不能被P整除(显然N和P互质),则有:N^P%P=N(即:N的P次方除以P的余数是N)。

但是我查了很多资料见到的公式都是这个样子:

(N^(P-1))%P=1后来分析了一下,两个式子其实是一样的,可以互相变形得到。

原式可化为:(N^P-N)%P=0(即:N的P次方减N可以被P整除,因为由费马小定理知道N的P次方除以P的余数是N)把N提出来一个,N^P就成了你N*(N^(P-1)),那么(N^P-N)%P=0可化为:

(N*(N^(P-1)-1))%P=0
请注意上式,含义是:N*(N^(P-1)-1)可以被P整除

又因为N*(N^(P-1)-1)必能整除N(这不费话么!)
所以,N*(N^(P-1)-1)是N和P的公倍数,小学知识了^_^

又因为前提是N与P互质,而互质数的最小公倍数为它们的乘积,所以一定存在

正整数M使得等式成立:N*(N^(P-1)-1)=M*N*P
两边约去N,化简之:N^(P-1)-1=M*P
因为M是整数,显然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

2.费马小定理:

有N为任意正整数,P为素数,且N不能被P整除(显然N和P互质),则有:N^P%P=N(即:N的P次方除以P的余数是N)。

但是我查了很多资料见到的公式都是这个样子:

(N^(P-1))%P=1后来分析了一下,两个式子其实是一样的,可以互相变形得到。

原式可化为:(N^P-N)%P=0(即:N的P次方减N可以被P整除,因为由费马小定理知道N的P次方除以P的余数是N)把N提出来一个,N^P就成了你N*(N^(P-1)),那么(N^P-N)%P=0可化为:

(N*(N^(P-1)-1))%P=0
请注意上式,含义是:N*(N^(P-1)-1)可以被P整除

又因为N*(N^(P-1)-1)必能整除N(这不费话么!)
所以,N*(N^(P-1)-1)是N和P的公倍数,小学知识了^_^

又因为前提是N与P互质,而互质数的最小公倍数为它们的乘积,所以一定存在

正整数M使得等式成立:N*(N^(P-1)-1)=M*N*P
两边约去N,化简之:N^(P-1)-1=M*P
因为M是整数,显然:N^(P-1)-1)%P=0即:N^(P-1)%P=1

3.积模分解公式

先有一个引理,如果有:X%Z=0,即X能被Z整除,则有:(X+Y)%Z=Y%Z
设有X、Y和Z三个正整数,则必有:(X*Y)%Z=((X%Z)*(Y%Z))%Z

想了很长时间才证出来,要分情况讨论才行:

1.当X和Y都比Z大时,必有整数A和B使下面的等式成立:
X=Z*I+A(1)
Y=Z*J+B(2)
不用多说了吧,这是除模运算的性质!
将(1)和(2)代入(X*Y)modZ得:((Z*I+A)(Z*J+B))%Z乘开,再把前三项的Z提一个出来,变形为:(Z*(Z*I*J+I*A+I*B)+A*B)%Z(3)

因为Z*(Z*I*J+I*A+I*B)是Z的整数倍……晕,又来了。
概据引理,(3)式可化简为:(A*B)%Z又因为:A=X%Z,B=Y%Z,代入上面的式子,就成了原式了。

2.当X比Z大而Y比Z小时,一样的转化:
X=Z*I+A
代入(X*Y)%Z得:
(Z*I*Y+A*Y)%Z
根据引理,转化得:(A*Y)%Z
因为A=X%Z,又因为Y=Y%Z,代入上式,即得到原式。
同理,当X比Z小而Y比Z大时,原式也成立。

3.当X比Z小,且Y也比Z小时,X=X%Z,Y=Y%Z,所以原式成立。
=====================================================

4.快速计算乘方的算法

如计算2^13,则传统做法需要进行12次乘法。

[cpp] view plainprint?
  1. /*计算n^p*/
  2. unsigned power(unsigned n,unsigned p)
  3. {
  4. for(int i=0;i<p;i++) n*=n;
  5. return n;
  6. }
/*计算n^p*/
unsignedpower(unsignedn,unsignedp)
{
for(inti=0;i<p;i++)n*=n;
returnn;
}

该死的乘法,是时候优化一下了!把2*2的结果保存起来看看,是不是成了:

4*4*4*4*4*4*2
再把4*4的结果保存起来:16*16*16*2
一共5次运算,分别是2*2、4*4和16*16*16*2

这样分析,我们算法因该是只需要计算一半都不到的乘法了。
为了讲清这个算法,再举一个例子2^7:2*2*2*2*2*2*2
两两分开:(2*2)*(2*2)*(2*2)*2
如果用2*2来计算,那么指数就可以除以2了,不过剩了一个,稍后再单独乘上它。

再次两两分开,指数除以2: ((2*2)*(2*2))*(2*2)*2
实际上最后一个括号里的2 * 2是这回又剩下的,那么,稍后再单独乘上它 现在指数已经为1了,可以计算最终结果了:16*4*2=128

⑥ 计算器中mr是什么意思

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次。

在一次检验中,该算法出错的可能顶多是四分之一。如果我们独立地和随机地选择a进行重复检验,一旦此算法报告n是合数,我们就可以确信n肯定不是素数。但如果此算法重复检验 25 次报告都报告说n可能是素数,则我们可以说n“几乎肯定是素数”。因为这样一个 25 次的检验过程给出关于它的输入的错误信息的概率小于 (1/4)25。这种机会小于 1015分之一。即使我们以这样一个过程验证了十亿个不同的素数,预料出错的概率仍将小于百万分之一。因此如果真出了错,与其说此算法重复地猜测错,倒不如说由于 硬件的失灵或宇宙射线的原因,我们的计算机在它的计算中丢了一位。这样的概率性算法使我们对传统的可靠性标准提出一个问号:我们是否真正需要有素性的严格 证明。(以上文字引用自 Donald E.Knuth 所着的《计算机程序设计艺术 第2卷 半数值算法(第3版)》第 359 页“4.5.4 分解素因子”中的“算法P(概率素性检验)”后面的说明)

热点内容
微信猜拳算法 发布:2024-10-26 19:23:35 浏览:389
android编译第三方库 发布:2024-10-26 19:14:20 浏览:614
苹果手机怎么用蓝牙传照片给安卓 发布:2024-10-26 18:57:40 浏览:614
ios8程序加密 发布:2024-10-26 18:30:27 浏览:532
密码门锁没电了用什么数据线 发布:2024-10-26 18:21:11 浏览:854
linuxloop 发布:2024-10-26 18:20:46 浏览:931
linuxvg查看 发布:2024-10-26 18:09:51 浏览:585
图标是钥匙的加密软件 发布:2024-10-26 18:07:31 浏览:625
vip七九宝琉璃怎么配置魂环 发布:2024-10-26 17:51:17 浏览:571
opencv编译linux 发布:2024-10-26 17:49:50 浏览:983