欧拉定理那些事

欧拉定理:
在讨论欧拉定理之前,有两样东西一定得先定义好。

欧拉函数:phi( n ) = 小于n的正整数中与n互质的数的个数;
集合 B = { x | x < n && x > 0 && gcd ( x, n ) == 1 }(显然,集合 B 的元素个数就是 phi ( n ) 的值)。
a ^ phi ( n ) = 1 ( mod n ) (a ∈ B)。
证明:
设 t = bi * bj % n,若 cd = gcd ( t, n ) > 1,则:
=> t = k1 * cd
=> n = k2 * cd
=> bi * bj + k3 * n = k1 * cd
=> bi * bj = k4 * cd
显然与之前定义不符,所以 gcd ( t, n ) == 1,即 t ∈ B。
=> bj != bk ( mod n )(j != k)
=> bi * bj != bi * bk ( mod n )(j != k)
也就是说,任意 bi 对于其他各个元素的乘积各不相同。
所以到这里,我们得到了集合 B 一个很好玩的性质:
记 m = phi ( n ),任意一个 bi 与集合中其他元素相乘模 n 的结果依旧与 n 互质,而且互不相同,也就是说:bi * b1、bi * b2、……、bi * bm 是原数列的一个排列,完美的与原集合重合,不多不少。
这也为我们接下来的步骤提供了依据:
=> ( bi * b1 ) * ( bi * b2 ) * …… * ( bi * bm ) = b1 * b2 * …… * bm ( mod n )
=> bi ^ m = 1 ( mod n )
Ok,这也就是我们上面提到的欧拉定理。

另:对于集合 B 我们可以做一些总结:
1、若 a ∈ B,b ∈ B,则 a * b mod n ∈ B;
2、若 a ∈ B,c 为 a 在模 n 下的逆,则 c ∈ B;
3、若 a ∈ B, a * 1 = a。
实际上,这个集合被称为 "关于n的乘法群"

费马小定理:
将欧拉定理中的 n 指定为素数: a ^ ( n - 1 ) = 1 ( mod n )
其实就是欧拉定理的特例。

费马测试:
以是否满足费马小定理来判断是否为素数。
但很不幸的是:费马小定理只是指出 n 为素数的时候满足它,却并没有说 n 是合数的时候是否满足。
因此,我们只能得到一个随机算法,它运行很快,结果则以很大的几率正确(并不总是)。
算法极其简单,我们只需随机选择出 k 个小于 n 的正整数 a1->ak,然后测试是否对每一个 ai 都满足 ai ^ ( n - 1 ) = 1 ( mod n )。
只要有一个不满足,那我们就可以肯定 n 是合数。
如果都满足,那我们就说 n 可能是一个素数。
我们并不需要判断 ai 是否与 n 互质,因为如果不互质,那么这个判断会立马告诉我们 n 是一个合数。
而欧拉定理又告诉我们(上文所说的很好玩的性质):设有 t 个与 n 互质的数,这 t 个数中有 p 个通过费马测试,q 个无法通过,则对于无法通过测试的任意一个数,可以得到 p 个无法通过测试的数,而且互不相同。也就是说,只要 p > 0,再次的人品也能得到至少 t / 2 个无法通过的数。
这样的概率我们很满足,因为如果不考虑那些每个 ai 都能通过的数(实际上这些讨厌的家伙叫做 carmichael 数),选取 k 个 a,则出错的概率 <= ( 1 / 2 ) ^ k。

米勒-拉宾测试:
人总是不满足于现状的,费马测试对于 carmichael 数的无力谁也不喜欢。
米勒-拉宾测试甚至可以看做是加强版的费马测试,至少我这样觉得。因为他们的大体框架都是相同的,只是米勒-拉宾测试在确定 ai ^ ( n - 1 ) = 1 ( mod n ) 的过程中,用很巧妙的方法(如果对模 n 存在 1 的非平凡平方根,则 n 是合数)加强了判断,使得其出错的概率再次减小,并对 carmichael 数同样有效。
下面是维基百科上的算法:
(注:这份伪码似乎有点问题,当然我更觉得是我的问题……如果有人能帮忙指正,烦请留言告知,我在这先谢过了。)
Input: n > 3, an odd integer to be tested for primality;
Input: k, a parameter that determines the accuracy of the test
Output: composite if n is composite, otherwise probably prime
write n - 1 as 2 ^ s * d with d odd by factoring powers of 2 from n - 1
LOOP: repeat k times:
pick a random integer a in the range [2, n - 2]
x ← a ^ d mod n
if x = 1 or x = n - 1 then do next LOOP
for r = 1 .. s
x ← x2 mod n
if x = 1 then return composite
if x = n - 1 then do next LOOP(当 r = s 时,若 x = n - 1,则该伪码会重新挑选 a,但实际上应该直接返回该数为合数)
return composite
return probably prime
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值