费马小定理 & 欧拉定理 本文讨论费马小定理、欧拉定理及其扩展。这些定理解决了任意模数下任意大指数的幂的计算问题。
费马小定理 费马小定理 (Fermat's little theorem)是数论中最基础的定理之一。它也是 Fermat 素性测试  的理论基础。
费马小定理  设 𝑝 p 𝑎 a 𝑝   ∤ 𝑎 p ∤ a 𝑎 𝑝 − 1   ≡ 1 ( m o d 𝑝 ) a p − 1 ≡ 1 ( mod p ) 
定理  设 𝑝 p 𝑎 a 𝑎 𝑝   ≡ 𝑎 ( m o d 𝑝 ) a p ≡ a ( mod p ) 
这两个同余关系在 𝑝   ∤ 𝑎 p ∤ a 𝑝   ∣ 𝑎 p ∣ a 𝑎 𝑝   ≡ 0   ≡ 𝑎 ( m o d 𝑝 ) a p ≡ 0 ≡ a ( mod p ) 
证明一  设 𝑝 p 𝑝   ∤ 𝑎 p ∤ a 𝑖   = 1 , 2 , ⋯ , 𝑝   − 1 i = 1 , 2 , ⋯ , p − 1 𝑖 𝑎 m o d 𝑝 i a mod p 1   ≤ 𝑖   < 𝑗   < 𝑝 1 ≤ i < j < p 
 𝑖 𝑎 m o d 𝑝 = 𝑗 𝑎 m o d 𝑝 . ⟺ ( 𝑗 − 𝑖 ) 𝑎 ≡ 0 . ( m o d 𝑝 ) i a mod p = j a mod p . ⟺ ( j − i ) a ≡ 0. ( mod p ) 但是,( 𝑗   − 𝑖 ) ( j − i ) 𝑎 a 𝑝 p 
 换句话说,这些余数是 { 1 , 2 , ⋯ , 𝑝   − 1 } { 1 , 2 , ⋯ , p − 1 } 
 𝑝 − 1 ∏ 𝑖 = 1 𝑖 = 𝑝 − 1 ∏ 𝑖 = 1 ( 𝑖 𝑎 m o d 𝑝 ) ≡ 𝑝 − 1 ∏ 𝑖 = 1 𝑖 𝑎 = 𝑎 𝑝 − 1 𝑝 − 1 ∏ 𝑖 = 1 𝑖 . ( m o d 𝑝 ) ∏ i = 1 p − 1 i = ∏ i = 1 p − 1 ( i a mod p ) ≡ ∏ i = 1 p − 1 i a = a p − 1 ∏ i = 1 p − 1 i . ( mod p ) 这说明
 ( 𝑎 𝑝 − 1 − 1 ) 𝑝 − 1 ∏ 𝑖 = 1 𝑖 ≡ 0 . ( m o d 𝑝 ) ( a p − 1 − 1 ) ∏ i = 1 p − 1 i ≡ 0. ( mod p ) 也就是说,等式左侧是 𝑝 p 𝑖   = 1 , 2 , ⋯ , 𝑝   − 1 i = 1 , 2 , ⋯ , p − 1 𝑝 p 𝑝   ∣ ( 𝑎 𝑝 − 1   − 1 ) p ∣ ( a p − 1 − 1 ) 
证明二  注意到费马小定理的第二种表述对于所有 𝑎   ∈ 𝐍 a ∈ N 
 归纳起点为 0 𝑝   ≡ 0 ( m o d 𝑝 ) 0 p ≡ 0 ( mod p ) 𝑎   ∈ 𝐍 a ∈ N 𝑎   + 1 a + 1 
 ( 𝑎 + 1 ) 𝑝 = 𝑎 𝑝 + ( 𝑝 1 ) 𝑎 𝑝 − 1 + ( 𝑝 2 ) 𝑎 𝑝 − 2 + ⋯ + ( 𝑝 𝑝 − 1 ) 𝑎 + 1 . ( a + 1 ) p = a p + ( p 1 ) a p − 1 + ( p 2 ) a p − 2 + ⋯ + ( p p − 1 ) a + 1. 除了首尾两项,组合数的表达式 ( 𝑝 𝑘 )   = 𝑝 ! 𝑘 ! ( 𝑝 − 𝑘 ) ! ( p k ) = p ! k ! ( p − k ) ! 𝑝 p 𝑘   ≠ 0 , 𝑝 k ≠ 0 , p 𝑝 p 
 ( 𝑎 + 1 ) 𝑝 ≡ 𝑎 𝑝 + 1 ≡ 𝑎 + 1 . ( m o d 𝑝 ) ( a + 1 ) p ≡ a p + 1 ≡ a + 1. ( mod p ) 其中,第二步应用了归纳假设。因此,利用数学归纳法可知,费马小定理成立。
费马小定理的逆命题并不成立。即使对于所有与 𝑛 n 𝑎 a 𝑎 𝑛 − 1   ≡ 1 ( m o d 𝑛 ) a n − 1 ≡ 1 ( mod n ) 𝑛 n Fermat 素性测试  一节。
欧拉定理 欧拉定理 (Euler's theorem)将费马小定理推广到了一般模数的情形,但仍然要求底数与指数互素。
欧拉定理  对于整数 𝑚   > 0 m > 0 𝑎 a g c d ( 𝑎 , 𝑚 )   = 1 gcd ( a , m ) = 1 𝑎 𝜑 ( 𝑚 )   ≡ 1 ( m o d 𝑚 ) a φ ( m ) ≡ 1 ( mod m ) 𝜑 (   ⋅ ) φ ( ⋅ ) 欧拉函数 。
证明  与费马小定理的证明一类似,仍然是取一个与 𝑚 m 
 𝑅 = { 𝑟 ∈ 𝐍 : 0 < 𝑟 < 𝑚 ,   g c d ( 𝑟 , 𝑚 ) = 1 } . R = { r ∈ N : 0 < r < m ,   gcd ( r , m ) = 1 } . 这是模 𝑚 m 既约剩余系 。根据欧拉函数的定义可知,| 𝑅 |   = 𝜑 ( 𝑚 ) | R | = φ ( m ) 𝑎 a 
 𝑅 = { 𝑎 𝑟 m o d 𝑚 : 𝑟 ∈ 𝑅 } . R = { a r mod m : r ∈ R } . 这是因为,容易验证 g c d ( 𝑎 𝑟 , 𝑚 )   = 1 gcd ( a r , m ) = 1 𝑟 1 , 𝑟 2   ∈ 𝑅 r 1 , r 2 ∈ R 𝑎 𝑟 1 m o d 𝑚 a r 1 mod m 𝑎 𝑟 2 m o d 𝑚 a r 2 mod m 
 ∏ 𝑟 ∈ 𝑅 𝑟 ≡ ∏ 𝑟 ∈ 𝑅 𝑎 𝑟 = 𝑎 𝜑 ( 𝑚 ) ∏ 𝑟 ∈ 𝑅 𝑟 . ( m o d 𝑚 ) ∏ r ∈ R r ≡ ∏ r ∈ R a r = a φ ( m ) ∏ r ∈ R r . ( mod m ) 再次重复之前的论证,消去 ∏ 𝑟 ∈ 𝑅 𝑟 ∏ r ∈ R r 𝑎 𝜑 ( 𝑚 )   ≡ 1 ( m o d 𝑚 ) a φ ( m ) ≡ 1 ( mod m ) 
对于素数 𝑝 p 𝜑 ( 𝑝 )   = 𝑝   − 1 φ ( p ) = p − 1 𝜑 ( 𝑚 ) φ ( m ) 𝜆 ( 𝑚 ) λ ( m ) 𝜆 (   ⋅ ) λ ( ⋅ ) Carmichael 函数 。关于相关结论的代数背景,可以参考 整数同余类的乘法群  一节。
扩展欧拉定理 扩展欧拉定理2 𝜑 ( 𝑚 ) 2 φ ( m ) 快速幂  在 𝑂 ( l o g  𝜑 ( 𝑚 ) ) O ( log  φ ( m ) ) 
扩展欧拉定理  对于任意正整数 𝑚 m 𝑎 a 𝑘 k 
 𝑎 𝑘 ≡ ⎧ { { ⎨ { { ⎩ 𝑎 𝑘 m o d 𝜑 ( 𝑚 ) , g c d ( 𝑎 , 𝑚 ) = 1 , 𝑎 𝑘 , g c d ( 𝑎 , 𝑚 ) ≠ 1 , 𝑘 < 𝜑 ( 𝑚 ) , 𝑎 ( 𝑘 m o d 𝜑 ( 𝑚 ) ) + 𝜑 ( 𝑚 ) , g c d ( 𝑎 , 𝑚 ) ≠ 1 , 𝑘 ≥ 𝜑 ( 𝑚 ) . ( m o d 𝑚 ) a k ≡ { a k mod φ ( m ) , gcd ( a , m ) = 1 , a k , gcd ( a , m ) ≠ 1 , k < φ ( m ) , a ( k mod φ ( m ) ) + φ ( m ) , gcd ( a , m ) ≠ 1 , k ≥ φ ( m ) . ( mod m ) 第二种情形是在说,如果 𝑘   < 𝜑 ( 𝑚 ) k < φ ( m ) 𝜑 ( 𝑚 ) φ ( m ) 
直观理解 在严格证明定理之前,可以首先直观理解定理的含义。
考虑余数 𝑎 𝑘 m o d 𝑚 a k mod m 𝑏 b [ 0 , 𝑚 ) [ 0 , m ) 𝑘 k 𝑎 𝑘 m o d 𝑚   ↦ 𝑎 𝑘 + 1 m o d 𝑚 a k mod m ↦ a k + 1 mod m 
扩展欧拉定理说明,这些循环可能是纯循环(第一种情形)或者混循环(第二、三种情形)。纯循环中,没有结点存在两个前驱,而混循环中就会出现这样的情形。因此,对于一般的情况,只需要能够求出循环节的长度和进入循环节之前的长度,就可以利用这个性质进行降幂。
严格证明 本节给出扩展欧拉定理的严格证明。
证明  首先说明,存在 𝑘 0   ∈ 𝐍 k 0 ∈ N 𝑎 a 𝑚 ′   : = 𝑚 g c d ( 𝑎 𝑘 0 , 𝑚 ) m ′ := m gcd ( a k 0 , m ) 𝜈 𝑝 ( 𝑛 ) ν p ( n ) 𝑛 n 𝑝 p 
 𝑘 0 = m a x { ⌈ 𝜈 𝑝 ( 𝑚 ) 𝜈 𝑝 ( 𝑎 ) ⌉ : 𝜈 𝑝 ( 𝑎 ) > 0 } . k 0 = max { ⌈ ν p ( m ) ν p ( a ) ⌉ : ν p ( a ) > 0 } . 因为 𝑚 m 𝑎 a 𝑎 𝑘 0 a k 0 𝑎 a 𝑚 m 𝑚 ′   = 𝑚 g c d ( 𝑎 𝑘 0 , 𝑚 ) m ′ = m gcd ( a k 0 , m ) 
 进而,对 𝑘   ≥ 𝑘 0 k ≥ k 0 
 𝑏 ≡ 𝑎 𝑘 . ( m o d 𝑚 ) b ≡ a k . ( mod m ) 由于 g c d ( 𝑎 𝑘 0 , 𝑚 )   = g c d ( 𝑎 𝑘 , 𝑚 )   ∣ 𝑏 gcd ( a k 0 , m ) = gcd ( a k , m ) ∣ b g c d ( 𝑎 𝑘 0 , 𝑚 ) gcd ( a k 0 , m ) 
 𝑏 g c d ( 𝑎 𝑘 0 , 𝑚 ) = 𝑎 𝑘 0 g c d ( 𝑎 𝑘 0 , 𝑚 ) ⋅ 𝑎 𝑘 − 𝑘 0 . ( m o d 𝑚 ′ ) b gcd ( a k 0 , m ) = a k 0 gcd ( a k 0 , m ) ⋅ a k − k 0 . ( mod m ′ ) 此时,因为 𝑎 a 𝑚 ′ m ′ 
 𝑏 g c d ( 𝑎 𝑘 0 , 𝑚 ) ≡ 𝑎 𝑘 0 g c d ( 𝑎 𝑘 0 , 𝑚 ) ⋅ 𝑎 ( 𝑘 − 𝑘 0 ) m o d 𝜑 ( 𝑚 ′ ) . ( m o d 𝑚 ′ ) b gcd ( a k 0 , m ) ≡ a k 0 gcd ( a k 0 , m ) ⋅ a ( k − k 0 ) mod φ ( m ′ ) . ( mod m ′ ) 因此,再将因子 g c d ( 𝑎 𝑘 0 , 𝑚 ) gcd ( a k 0 , m ) 
 𝑏 ≡ 𝑎 𝑘 0 ⋅ 𝑎 ( 𝑘 − 𝑘 0 ) m o d 𝜑 ( 𝑚 ′ ) = 𝑎 𝑘 0 + ( 𝑘 − 𝑘 0 ) m o d 𝜑 ( 𝑚 ′ ) . ( m o d 𝑚 ) b ≡ a k 0 ⋅ a ( k − k 0 ) mod φ ( m ′ ) = a k 0 + ( k − k 0 ) mod φ ( m ′ ) . ( mod m ) 这就得到了扩展欧拉定理的形式。式子说明,循环节的长度是 𝜑 ( 𝑚 ′ ) φ ( m ′ ) 𝑘 0 k 0 
 此处得到的参数比扩展欧拉定理中的更紧,但是相对来说,这些参数的计算并不容易。可以说明,这些参数可以放宽到扩展欧拉定理中的情形。首先,利用 欧拉函数的表达式  可知,因为 𝑚 ′   ∣ 𝑚 m ′ ∣ m 𝜑 ( 𝑚 ′ )   ∣ 𝜑 ( 𝑚 ) φ ( m ′ ) ∣ φ ( m ) 𝜑 ( 𝑚 ) φ ( m ) 𝑘 0 k 0 𝜑 ( 𝑚 ) φ ( m ) 𝑚   ∈ 𝐍 + m ∈ N + 𝑝   ∣ 𝑚 p ∣ m 
 𝜑 ( 𝑚 ) ≥ 𝜑 ( 𝑝 𝜈 𝑝 ( 𝑚 ) ) = ( 𝑝 − 1 ) 𝑝 𝜈 𝑝 ( 𝑚 ) − 1 ≥ 𝑝 𝜈 𝑝 ( 𝑚 ) − 1 = ( 1 + ( 𝑝 − 1 ) ) 𝜈 𝑝 ( 𝑚 ) − 1 ≥ 1 + ( 𝑝 − 1 ) ( 𝜈 𝑝 ( 𝑚 ) − 1 ) ≥ 1 + ( 𝜈 𝑝 ( 𝑚 ) − 1 ) = 𝜈 𝑝 ( 𝑚 ) . φ ( m ) ≥ φ ( p ν p ( m ) ) = ( p − 1 ) p ν p ( m ) − 1 ≥ p ν p ( m ) − 1 = ( 1 + ( p − 1 ) ) ν p ( m ) − 1 ≥ 1 + ( p − 1 ) ( ν p ( m ) − 1 ) ≥ 1 + ( ν p ( m ) − 1 ) = ν p ( m ) . 其中,第二行的不等式利用了二项式展开,并只保留常数项和一次项。因此,有
 𝑘 0 ≤ m a x { 𝜈 𝑝 ( 𝑚 ) : 𝑝 ∈ 𝐏 } ≤ 𝜑 ( 𝑚 ) . k 0 ≤ max { ν p ( m ) : p ∈ P } ≤ φ ( m ) . 这就完全证明了所述结论。
例题 本节通过一道例题展示扩展欧拉定理的一个经典应用——计算任意模数下的幂塔。幂塔 (power tower)指形如 𝐴   ↑ ( 𝐵   ↑ ( 𝐶   ↑ ( 𝐷   ↑ ⋯ ) ) ) A ↑ ( B ↑ ( C ↑ ( D ↑ ⋯ ) ) ) ↑ ↑ 𝐴 , 𝐵 , 𝐶 , 𝐷 , ⋯ A , B , C , D , ⋯ 
Library Checker - Tetration Mod 𝑇 T 𝐴 , 𝐵 , 𝑀 A , B , M ( 𝐴   ↑ ↑ 𝐵 ) m o d 𝑀 ( A ↑↑ B ) mod M 𝐴   ↑ ↑ 𝐵 A ↑↑ B 𝐵 B 𝐴 A 
 𝐴 ↑ ↑ 𝐵 = { 1 , 𝐵 = 0 , 𝐴 ↑ ( 𝐴 ↑ ↑ ( 𝐵 − 1 ) ) , 𝐵 > 0 . A ↑↑ B = { 1 , B = 0 , A ↑ ( A ↑↑ ( B − 1 ) ) , B > 0. 规定 0 0   = 1 0 0 = 1 
解答  利用 𝐴   ↑ ↑ 𝐵 A ↑↑ B ( 𝐴   ↑ ↑ 𝐵 ) m o d 𝑀 ( A ↑↑ B ) mod M ( 𝐴   ↑ ↑ ( 𝐵   − 1 ) ) m o d 𝜑 ( 𝑀 ) ( A ↑↑ ( B − 1 ) ) mod φ ( M ) 𝜑 ( 𝜑 ( 𝑛 ) )   ≤ 𝑛 / 2 φ ( φ ( n ) ) ≤ n / 2 𝑛   ≥ 2 n ≥ 2 𝑂 ( l o g  𝑀 ) O ( log  M ) 
参考代码   1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 #include   <iostream> 
// Calculate Euler's totient for n. 
int   phi ( int   n )   { 
   int   res   =   n ; 
   for   ( int   i   =   2 ;   i   *   i   <=   n ;   ++ i )   { 
     if   ( n   %   i   ==   0 )   { 
       res   =   res   /   i   *   ( i   -   1 ); 
       while   ( n   %   i   ==   0 )   n   /=   i ; 
     } 
   } 
   if   ( n   >   1 )   res   =   res   /   n   *   ( n   -   1 ); 
   return   res ; 
} 
// Find remainder as in the exponent of extended Euler theorem. 
int   mod ( long   long   v ,   int   m )   {   return   v   >=   m   ?   v   %   m   +   m   :   v ;   } 
// Modular power. 
int   pow ( int   a ,   int   b ,   int   m )   { 
   long   long   res   =   1 ,   po   =   a ; 
   for   (;   b ;   b   >>=   1 )   { 
     if   ( b   &   1 )   res   =   mod ( res   *   po ,   m ); 
     po   =   mod ( po   *   po ,   m ); 
   } 
   return   res ; 
} 
// Modular tetration. 
int   tetra ( int   a ,   int   b ,   int   m )   { 
   if   ( a   ==   0 )   return   ! ( b   &   1 ); 
   if   ( b   ==   0   ||   m   ==   1 )   return   1 ; 
   if   ( b   ==   1 )   return   mod ( a ,   m ); 
   return   pow ( a ,   tetra ( a ,   b   -   1 ,   phi ( m )),   m ); 
} 
int   main ()   { 
   int   t ; 
   std :: cin   >>   t ; 
   for   (;   t ;   -- t )   { 
     int   a ,   b ,   m ; 
     std :: cin   >>   a   >>   b   >>   m ; 
     std :: cout   <<   ( tetra ( a ,   b ,   m )   %   m )   <<   std :: endl ; 
   } 
} 
习题 参考资料与注释 2025/9/29 02:26:32 ,更新历史 在 GitHub 上编辑此页! guodong2005 , Ir1d , mgt , Tiphereth-A , sshwy , Enter-tainer , MegaOwIer , c-forrest , Dev-XYS , Great-designer , PeterlitsZo , stevebraveman , tth37 , Xeonacid , Acfboy , gi-b716 , H-J-Granger , hjsjhn , hly1204 , iamtwz , ImpleLee , Menci , qz-cqy , StudyingFather , WineChord , yuhuoji CC BY-SA 4.0  和 SATA