费马小定理学习整理
PS:费马小定理碰到了好几次了,决心在此刻把它解决。若有问题请私信或者评论区留言,我都会给予回复。
定理展示
假如 a a a是一个整数, p p p是一个质数,那么 a p − a a^p-a ap−a就是 a a a的倍数。我们可以记为:
a p ≡ a ( m o d p ) a^p \equiv a \pmod{p} ap≡a(modp) ( 1 ) (1) (1)
这个式子其实就是 a p m o d p ≡ a m o d p a^p \mod p \equiv a \mod p apmodp≡amodp,如果 a a a不是 p p p的倍数的话,即 g c d ( a , p ) = 1 gcd(a,p) = 1 gcd(a,p)=1那么我们还可以写为:
a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp) ( 2 ) (2) (2)
其中用的最多的就是 ( 2 ) (2) (2)式,为什么呢?我们两边再同时除以 a a a,即可得到 a p − 2 ≡ a − 1 ( m o d p ) a^{p-2} \equiv a^{-1} \pmod p ap−2≡a−1(modp),这个式子自然可以表示为在取余的情况下, a a a的倒数可以等价于 a p − 2 a^{p-2} ap−2。(这个在组合数学中用的非常多,组合问题求解 C n m C_{n}^{m} Cnm)
是不是感到很疑惑?这个费马小定理为什么可以这样?别急,我们来看证明。
定理证明
预备知识:
- 若 n n n不能整除 ( a − b ) (a-b) (a−b),存在 x > 0 x>0 x>0,且 x x x和 n n n互质( g c d ( x , n ) = 1 gcd(x,n) =1 gcd(x,n)=1),那么 n n n也就不能整除 x ( a − b ) x(a-b) x(a−b)。
- 完全剩余系:从模n的每个剩余类中各取一个数,得到一个由n个数组成的集合,叫做模n的一个完全剩余系。完全剩余系常用于数论中存在性证明。这个完全剩余系其实就是 { 1 , 2 , 3 ⋅ ⋅ ⋅ n − 1 } \{1,2,3···n-1\} {1,2,3⋅⋅⋅n−1},因为这个特性是这个完全剩余系的任意两个数对 n n n取余都不相等。
证明开始:
我们现在已知一个整数 a a a,和一个质数 p p p,其中 g c d ( a , p ) ≡ 1 gcd(a,p) \equiv 1 gcd(a,p)≡1。我们可以设 A A A为 p p p的完全剩余系,让 B = a ∗ A B=a*A B=a∗A,即 A A A中的每个元素都乘以 a a a,我们知道 p p p是质数,那么 A A A中的任意两个元素之差都不可能被 p p p整除,则 B B B也同样如此。集合 B = { 1 ∗ a , 2 ∗ a , 3 ∗ a ⋅ ⋅ ⋅ ( p − 1 ) ∗ a } B=\{1*a,2*a,3*a···(p-1)*a\} B={1∗a,2∗a,3∗a⋅⋅⋅(p−1)∗a}共 ( p − 1 ) (p-1) (p−1)个数,我们对 p p p进行取余。得到的余数为 { r 1 , r 2 , r 3 , . . . . , r p − 1 } \{r_1,r_2,r_3,....,r_{p-1}\} {r1,r2,r3,....,rp−1},这个余数其实就是 { 1 , 2 , 3 ⋅ ⋅ ⋅ p − 1 } \{1,2,3···p-1\} {1,2,3⋅⋅⋅p−1}重排列,因为这是因为对于任两个相异 k ∗ a k*a k∗a而言 ( k = 1 , 2 , 3.... ( p − 1 ) ) (k=1,2,3....(p-1)) (k=1,2,3....(p−1)),其差不是p的倍数(所以不会有相同余数),且任一个 ∗ a *a ∗a亦不为 p p p的倍数(所以余数不为0)。则有如下:
1 ∗ 2 ∗ 3 ∗ ⋅ ⋅ ⋅ ∗ ( p − 1 ) ≡ 1 ∗ a ∗ 2 ∗ a ∗ ⋅ ⋅ ⋅ ∗ ( p − 1 ) ∗ a ( m o d p ) 1*2*3*···*(p-1) \equiv 1*a*2*a*···*(p-1)*a \pmod p 1∗2∗3∗⋅⋅⋅∗(p−1)≡1∗a∗2∗a∗⋅⋅⋅∗(p−1)∗a(modp)
那么我们整理一下即可得到:
a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp)
应用场景
-
组合大数取余
我们知道求解 C n m C_{n}^{m} Cnm为: n ! ( n − m ) ! × ( m ! ) {\frac{n!}{(n-m)!\times(m!)}} (n−m)!×(m!)n!,若有个题目是这样要求的,求 C 1000 2 C^2_{1000} C10002在 m o d = 1 e 9 + 7 mod=1e9+7 mod=1e9+7下的余数。我们该怎么办?我们只知道乘法间接取余不会影响结果(即 a × b m o d p = ( a m o d p ) × ( b m o d p ) a\times b\mod p=(a\mod p)\times(b\mod p) a×bmodp=(amodp)×(bmodp),针对许多数相乘结果依然成立(除法运算不满足还请读者自己去思考))。那么我们就会想到进行费马小定理来转换了,即利用 a p − 1 ≡ a − 1 ( m o d p ) a^{p-1}\equiv a^{-1}\pmod p ap−1≡a−1(modp)(使用条件限制为 p p p为质数),那么我们就可以对其进行转换:
1 ( n − m ) ! × ( m ! ) = ( ( n − m ) ! × ( m ! ) ) p − 2 ( m o d p ) {\frac{1}{(n-m)!\times(m!)}}=((n-m)!\times(m!))^{p-2}\pmod p (n−m)!×(m!)1=((n−m)!×(m!))p−2(modp)
那么这个结果自然可以得解。
-
指数爆炸部分求解
例如有一个这样的题,要你求解: 2 100 2^{100} 2100对13取余的结果。你会怎么做?直接让计算机去跑吗?又或者利用快速幂?这些都行。当然,在这里我们肯定是介绍费马小定理来解决这个问题。
我们知道 p p p是一个质数,那么我们找到一个与 p p p互质的整数 a a a,尝试去构建 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap−1≡1(modp),这个自然好办,这里的底数为 2 2 2,指数为 100 100 100, m o d mod mod为13,我们则需要寻找 2 12 2^{12} 212这样的数。那么我们的步骤即是如下:
: 2 100 ≡ 2 12 × 8 + 4 ( m o d 13 ) 2^{100} \equiv 2^{12 \times 8+4} \pmod{13} 2100≡212×8+4(mod13)
: ≡ ( 2 12 ) 8 ⋅ 2 4 ( m o d 13 ) \equiv (2^{12})^8 \cdot 2^4 \pmod{13} ≡(212)8⋅24(mod13)
: ≡ 1 8 ⋅ 16 ( m o d 13 ) \equiv 1^8 \cdot 16 \pmod{13} ≡18⋅16(mod13)
: ≡ 16 ( m o d 13 ) \equiv 16 \pmod{13} ≡16(mod13)
: ≡ 3 ( m o d 13 ) \equiv 3 \pmod{13} ≡3(mod13)
是不是感觉很神奇,没错,费马小定理就是这么强大,它虽然出现的比较少,但是一旦出现如果你不了解的话,可是很做出来的哦!