设p为质数
(“a≡b(mod c)”为同余
费马小定理曾被欧拉证明,证明过程也不复杂,不过我们先不用管它,来看看这个“小定理”有什么“大用处”。
公元前3世纪,欧几里得证明了:每个大于1的整数都可以唯一地分解成有限个素数的乘积(不计因子的次序)。对于任意一个整数n,如果本身就是素数,则分解完毕,否则要找到n的一个素因子p,然后再分解n/p。所以首先要考虑的第一件事是:是否有好的算法来判定n是不是素数?这就是素数判定
我们以前学过的从2到sqrt(n)的试除法是指数级的(这里的复杂度要按照n的二进制形式位数N来算,由于n=2^N,所以sqrt(n)可认为(sqrt(2))^N)。2002年,三维印度数学家找到了素数判定的多项式算法,复杂度为O((logn)^6),说明素数判定是一个比较容易的问题。
下面说一种应用费马小定理的算法,可以“几乎”正确的判定素数。
1) 根据费马小定理的逆否命题,如果a^(p-1)mod p<>1
2) 费马小定理的逆命题是这样的:“如果p是一个正整数,存在一个与p互质的整数a,使得a^(p-1)≡1(mod p),p就是个质数。”那么它成立吗?它不成立,但是几乎成立!如果取a=2,那么在小于10,000的p中,只有22个p会产生错误!(这个合数p装得像素数似的,所以我们把这样的p叫做伪素数
如果我们选取许多a来试验p,那么正确率又会大增。在小于100,000,000的整数中,只有512个p对于所有的a来说都是伪素数。
如此我们就有思路了:随机取一些a,计算a^(p-1) mod p。如果有一个计算结果不是1,就可以确定p是合数,返回False;否则就几乎肯定p是素数,返回True。
至于计算过程,有很多方法,一种比较高效的算法是这样的:
p-1二进制可表示为一个奇数m
大致计算过程如下:
在2..n-1中随机选取一些a执行上述过程即可,选取的a的个数可视情况而定,尽量多一点以提高准确率。
信息的加解密我们平常都接触过,每种密码都有加密
RSA公钥体制是一种公开加密密钥
这是利用了上文提到的整数分解!
大数分解难题:对于一个很大的整数n,要分解出所有的质因数,人们至今没找到多项式算法。具体点,分解一个100位数大概需要几分钟,而分解一个200位数通常需要几万年
下面就来看看RSA公钥是咋弄的。
大家可以找两个小一点的素数试试!
加密解密相当于x^(ed) mod n,下面来证明一下x^(ed)≡x (mod n)。(证明过程用到一点同余算术,不过都很好理解)
证明:
因为ed≡1(mod (p-1)(q-1)),所以可将ed表示为(p-1)(q-1)N+1
根据费马小定理x^p-1≡1(mod p),因此x^(ed)=x^((p-1)(q-1)N+1)=x·(x^((p-1))^((q-1)N)≡x·1≡x(mod p)
同理可证x^(ed)≡x(mod q)
我们可以得到x^(ed)-x同时被素数p和q整除,所以x^(ed)-x被n=pq整除
即x^(ed) ≡x (mod n),证毕。
由于D(E(x))= x^(ed)≡x (mod n),E(D(x))= x^(de)≡x (mod n),所以E和D是互逆运算
分解一个200位整数n来求p和q是很难的,所以RSA公钥体制很安全。那么,一共有多少对{ei, di}可供用户使用呢?结论表明,{ei, di}总共有φ(m)对
RSA公钥方案目前已在通信中广泛使用。像这样,许多数学知识可以应用到信息学中,应用到生活中,对我们有很重要的意义。
转自http://blog.163.com/wangenze_black@126/blog/static/11071051520095211117540/