数论定理

参考博客
以下内容部分摘自参考博客

一、费马小定理

p是一个质数,a是一个整数,且gcd(p,a)=1,那么:
a^p ≡ a(mod p) 或 a^(p-1) ≡ 1 (mod p)

补充:若n是一个合数,a是一个整数,且gcd(n,a)=1,且a^n ≡ a(mod n),那么称n为卡迈克尔数 (Carmichael Number)

应用
1、费马小定理求逆元
要求A关于质数m的逆元X ( 条件:gcd(A,m)=1 ),即==AX ≡ 1 (mod m)== ,由费马小定理知:A ^ (m - 1) ≡ 1 (mod m),即A * A ^ (m - 2) ≡ 1 (mod m),
得:X=A ^ (m - 2)

2、大数素性判断

Miller-Rabin算法
我们可以用费马小定理来判断一个很大的数是否是素数,我们知道若一个数p是素数,则必定有 a^(p-1) ≡ 1(mod p)。因此,我们要判断一个数a是不是素数,可随机枚举出大概10个左右的数,判断这个数的 p-1 次方对p取模是否为1,但是这样不严谨,因为Carmichael数的存在,虽然Carmichael数的数量很少,但是这也会对算法造成影响。所以在介绍这个算法之前我们再来了解一个定理:二次探测定理,这个定理可以对算法进行改进以免将Carmichael数当做素数。

二次探测定理:如果p是素数,x是小于p的正整数,且x2 ≡ 1(mod p), 则x=1或x=p-1

有了二次探测定理我们就可以在使用费马小定理计算 a(p-1) ≡ 1(mod p)时,增加对p的二次探测,一旦发现违背二次探测条件,就可以得出p不是素数的结论。我们通过一个例子来利用这个结论,341是一个合数(341=11 * 31),但是341可以通过a为2时的费马小定理2340 ≡ 1(mod 341),我们现在可以假设341为素数:因为(2170)2 ≡ 1(mod 341),所以2170 mod 341只能为1或者是340,我们发现确实有2170 ≡ 1(mod 341),我们继续往下算285 ≡ 32(mod 341),这样一来就可以看出341不是素数了。
  
这就是Miller_rabin素性测试方法,不断地提取 p-1 中的因子2,这样我们为了方便可以把 p-1表示为d * 2r(d为奇数),这样一来我们就需要不断计算a ^(d*2 r)对p取余的结果,这样我们可以强化费马小定理为下面的形式:
  
尽可能的提取p-1中的因子2,把p-1表示为d * 2r,若p为素数,则ad mod p = 1,或者存在一个i使得a ^ (d * 2 i) % mod p = p-1 (0 <= i < r)。
 
需要说明的是,Miller_rabin素性测试也是不确定算法。我们把可以通过以a为底的Miller-Rabin测试的合数称作以a为底的强伪素数。
  
对于大数的素性判断,目前Miller-Rabin算法应用最广泛。一般底数仍然是随机选取,但当待测数不太大时,选择测试底数就有一些技巧了。比如,如果被测数小于4 759 123 141,那么只需要测试三个底数2, 7和61就足够了。当然,你测试的越多,正确的范围肯定也越大。如果你每次都用前7个素数(2, 3, 5, 7, 11, 13和17)进行测试,所有不超过341 550 071 728 320的数都是正确的。如果选用2, 3, 7, 61和24251作为底数,那么10 ^ 16内唯一的强伪素数为46 856 248 255 981。这样的一些结论使得Miller-Rabin算法在比赛中非常实用。通常认为,Miller-Rabin素性测试的正确率可以令人接受,随机选取k个底数进行测试算法的失误率大概为4 ^ (-k)。

二、欧拉定理

欧拉函数:

欧拉函数 φ( n )是小于等于 n 的正整数中与 n 互质的数的个数。
eg. φ(1)=1 , φ(8)=4 (1,3,5,7)

欧拉定理

对于互质的a和n有:
在这里插入图片描述
这实际上就是费马小定理的一个推广,我们知道当m为素数时,φ(m) = m-1,这是欧拉函数的结论。将φ(m)带入就可以得到费马小定理的结论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值