注:本文为 “欧拉降幂” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。
详解欧拉降幂
狠人王 原创于 2019-10-23 17:09:56 发布
1 问题引出
在数论计算中,经常需要求解形如
a
b
m
o
d
c
a^{b} \mod c
abmodc 的表达式。针对这一问题,常见的求解思路包括暴力幂运算(pow)与快速幂运算(快速幂),但两者均存在明显局限性:当指数
b
b
b 的数值极大(如
b
b
b 为百位以上的整数)时,即便采用快速幂算法,也难以在有效时间内完成计算。
为解决大指数下 a b m o d c a^{b} \mod c abmodc 的高效求解问题,引入欧拉降幂算法。该算法的核心优势在于:在不改变最终结果的前提下,大幅降低指数 b b b 的数值,从而显著缩短计算时间,适配大指数场景。
2 欧拉降幂公式
欧拉降幂的核心是基于欧拉函数 ϕ ( c ) \phi(c) ϕ(c)( ϕ \phi ϕ 为欧拉函数符号)对指数进行降幂,具体公式如下:
a b m o d c = a b m o d φ ( c ) + φ ( c ) m o d c \large a^b \bmod c = a^{b \bmod \varphi(c) + \varphi(c)} \bmod c abmodc=abmodφ(c)+φ(c)modc
其中, ϕ ( c ) \phi(c) ϕ(c) 表示欧拉函数值,其定义为:小于等于 c c c 且与 c c c 互质的正整数的个数(互质指两个整数的最大公约数为 1)。
3 关键组件实现与代码解析
3.1 欧拉函数计算( ϕ ( x ) \phi(x) ϕ(x))
3.1.1 计算原理
根据欧拉函数的数学性质,对正整数
x
x
x 进行质因数分解:若
x
=
p
1
k
1
×
p
2
k
2
×
⋯
×
p
n
k
n
x = p_1^{k_1} \times p_2^{k_2} \times \dots \times p_n^{k_n}
x=p1k1×p2k2×⋯×pnkn(
p
1
,
p
2
,
…
,
p
n
p_1,p_2,\dots,p_n
p1,p2,…,pn 为
x
x
x 的所有不同质因数,
k
1
,
k
2
,
…
,
k
n
k_1,k_2,\dots,k_n
k1,k2,…,kn 为对应质因数的指数),则欧拉函数值为:
ϕ
(
x
)
=
x
×
∏
i
=
1
n
(
1
−
1
p
i
)
\phi(x) = x \times \prod_{i=1}^{n} \left(1 - \frac{1}{p_i}\right)
ϕ(x)=x×i=1∏n(1−pi1)
3.1.2 代码实现
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAX = 1000100;
// 计算欧拉函数值 phi(x)
ll eulerFunction(ll x) {
ll eulerNumbers = x; // 初始化欧拉函数值为 x
// 遍历所有可能的质因数(直至 sqrt(x))
for (ll i = 2; i * i <= x; i++) {
// 若 i 是 x 的质因数
if (x % i == 0) {
eulerNumbers = eulerNumbers / i * (i - 1); // 应用欧拉函数公式
// 去除 x 中所有质因数 i(避免重复计算)
while (x % i == 0) {
x /= i;
}
}
}
// 若剩余 x > 1,说明 x 本身是一个质因数
if (x > 1) {
eulerNumbers = eulerNumbers / x * (x - 1);
}
return eulerNumbers;
}
3.2 快速幂运算( a b m o d mod a^b \mod \text{mod} abmodmod)
3.2.1 计算原理
快速幂通过二进制分解降低幂运算的时间复杂度:将指数 b b b 表示为二进制形式,仅对二进制中为 1 的位对应的幂进行乘法运算,最终时间复杂度由暴力幂的 O ( b ) O(b) O(b) 降至 O ( log b ) O(\log b) O(logb)。
3.2.2 代码实现
// 快速幂计算:(a^b) mod mod,返回结果
ll fastPow(ll a, ll b, ll mod) {
ll ans = 1;
a %= mod; // 预处理:将 a 对 mod 取余,减小数值
while (b > 0) {
// 若当前二进制位为 1,将结果与当前 a 相乘并取余
if (b & 1) {
ans = (ans * a) % mod;
}
// a 自乘,对应二进制位左移(即指数乘以 2)
a = (a * a) % mod;
b >>= 1; // 指数右移,处理下一个二进制位
}
return ans;
}
3.3 欧拉降幂完整实现( a b m o d c a^b \mod c abmodc, b b b 为大整数)
当 b b b 数值极大(需用字符串存储)时,直接计算 b b b 不现实,需通过欧拉函数对 b b b 降幂:
- 计算 c c c 的欧拉函数值 ϕ ( c ) \phi(c) ϕ(c);
- 将字符串形式的 b b b 转换为数值,并对 ϕ ( c ) \phi(c) ϕ(c) 取余,得到降幂后的指数 b ′ = b m o d ϕ ( c ) b' = b \mod \phi(c) b′=bmodϕ(c);
- 由于欧拉降幂公式的约束,需补充 ϕ ( c ) \phi(c) ϕ(c) 至 b ′ b' b′(即 b ′ + ϕ ( c ) b' + \phi(c) b′+ϕ(c)),确保结果正确性;
- 调用快速幂计算 a b ′ + ϕ ( c ) m o d c a^{b' + \phi(c)} \mod c ab′+ϕ(c)modc。
3.3.1 代码实现
// 欧拉降幂计算:a^b mod c,其中 b 为字符串形式的大整数
ll eulerDropPow(ll a, char b[], ll c) {
ll eulerNumbers = eulerFunction(c); // 步骤1:计算 phi(c)
ll descendingPower = 0;
ll len = strlen(b);
// 步骤2:将字符串 b 转换为数值,并对 phi(c) 取余
for (ll i = 0; i < len; ++i) {
descendingPower = (descendingPower * 10 + b[i] - '0') % eulerNumbers;
}
// 步骤3:补充 phi(c),确保降幂公式适用
descendingPower += eulerNumbers;
// 步骤4:快速幂计算最终结果
return fastPow(a, descendingPower, c);
}
// 主函数:输入 a、b(字符串)、c,输出 a^b mod c
int main() {
ll a, c;
char b[MAX];
// 循环读取输入(直至 EOF)
while (~scanf("%lld%s%lld", &a, b, &c)) {
printf("%lld\n", eulerDropPow(a, b, c));
}
return 0;
}
浅谈欧拉降幂
发表于 2020-05-03 23:22
1 欧拉降幂的理论基础——欧拉定理
在数论中,欧拉定理(也称费马-欧拉定理)是欧拉降幂的核心理论依据,其内容为:
若
n
n
n、
a
a
a 为正整数,且
a
a
a 与
n
n
n 互质,则:
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a^{\phi(n)} \equiv 1 \pmod{n}
aϕ(n)≡1(modn)
其中
ϕ
(
n
)
\phi(n)
ϕ(n) 为
n
n
n 的欧拉函数值。
a b ≡ { a b % ϕ ( p ) g c d ( a , p ) = 1 a b g c d ( a , p ) ≠ 1 , b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) ( m o d p ) a^b \equiv \begin{cases} a^{b \% \phi(p)} & gcd(a,p) = 1 \\ a^b & gcd(a,p) \neq 1, b < \phi(p) \\ a^{b \% \phi(p) + \phi(p)} & gcd(a,p) \neq 1, b \geq \phi(p) \end{cases} \pmod{p} ab≡⎩ ⎨ ⎧ab%ϕ(p)abab%ϕ(p)+ϕ(p)gcd(a,p)=1gcd(a,p)=1,b<ϕ(p)gcd(a,p)=1,b≥ϕ(p)(modp)
- 第一个情况,当 g c d ( a , p ) = 1 gcd(a,p) = 1 gcd(a,p)=1(即 a a a 和 p p p 互质)时,使用的是经典的欧拉定理,此时 a b ≡ a b % ϕ ( p ) ( m o d p ) a^b \equiv a^{b \% \phi(p)} \pmod{p} ab≡ab%ϕ(p)(modp)。
- 第二个和第三个情况属于广义欧拉降幂,不要求
a
a
a 和
p
p
p 互质,而是根据指数
b
b
b 与
ϕ
(
p
)
\phi(p)
ϕ(p) 的大小关系来确定不同的降幂形式:
当 g c d ( a , p ) ≠ 1 gcd(a,p) \neq 1 gcd(a,p)=1 且 b < ϕ ( p ) b < \phi(p) b<ϕ(p) 时,直接为 a b a^b ab;
当 g c d ( a , p ) ≠ 1 gcd(a,p) \neq 1 gcd(a,p)=1 且 b ≥ ϕ ( p ) b \geq \phi(p) b≥ϕ(p) 时,为 a b % ϕ ( p ) + ϕ ( p ) a^{b \% \phi(p) + \phi(p)} ab%ϕ(p)+ϕ(p)。
基于欧拉定理,可推导出基础的降幂公式:
a
b
≡
a
b
m
o
d
ϕ
(
n
)
+
ϕ
(
n
)
(
m
o
d
n
)
a^b \equiv a^{b \mod \phi(n) + \phi(n)} \pmod{n}
ab≡abmodϕ(n)+ϕ(n)(modn)
该公式是欧拉降幂的核心,后续广义形式均基于此扩展。
2 欧拉降幂的三种形式(广义欧拉降幂)
欧拉降幂根据 a a a 与 c c c 的互质关系及指数 b b b 的大小,分为三种形式,覆盖所有场景:
| 场景条件 | 降幂公式 | 说明 |
|---|---|---|
| a a a 与 c c c 互质 | a b ≡ a b m o d ϕ ( c ) ( m o d c ) a^b \equiv a^{b \mod \phi(c)} \pmod{c} ab≡abmodϕ(c)(modc) | 直接基于欧拉定理推导,无指数大小限制 |
| a a a 与 c c c 不互质,且 b ≥ ϕ ( c ) b \geq \phi(c) b≥ϕ(c) | a b ≡ a b m o d ϕ ( c ) + ϕ ( c ) ( m o d c ) a^b \equiv a^{b \mod \phi(c) + \phi(c)} \pmod{c} ab≡abmodϕ(c)+ϕ(c)(modc) | 最常用的广义形式,适配大指数场景 |
| a a a 与 c c c 不互质,且 b < ϕ ( c ) b < \phi(c) b<ϕ(c) | a b ≡ a b ( m o d c ) a^b \equiv a^b \pmod{c} ab≡ab(modc) | 指数较小,无需降幂,直接计算 |
3 典型例题解析:求 2 ( 2 ( 2 ( 2 … ) ) ) m o d p 2^{(2^{(2^{(2^{\dots})})})} \mod p 2(2(2(2…)))modp(无限嵌套指数)
3.1 问题分析
该问题为无限嵌套的指数运算,无法直接计算外层指数,需通过递归+欧拉降幂逐层简化:
- 设 f ( p ) = 2 ( 2 ( 2 … ) ) m o d p f(p) = 2^{(2^{(2^{\dots})})} \mod p f(p)=2(2(2…))modp(嵌套层数无限);
- 对指数部分应用欧拉降幂:内层嵌套 2 ( 2 … ) = f ( ϕ ( p ) ) + ϕ ( p ) 2^{(2^{\dots})} = f(\phi(p)) + \phi(p) 2(2…)=f(ϕ(p))+ϕ(p)(因内层指数必然 ≥ ϕ ( p ) \geq \phi(p) ≥ϕ(p));
- 递归边界:当 p = 1 p = 1 p=1 时,任何数对 1 取余均为 0,故 f ( 1 ) = 0 f(1) = 0 f(1)=0。
解答
要计算 2 2 2 ⋅ ⋅ ⋅ m o d p 2^{2^{2^{\cdot^{\cdot^{\cdot}}}}} \bmod p 222⋅⋅⋅modp,可按以下步骤进行:
步骤1:分解 p p p
令 p = 2 k ⋅ q p = 2^k \cdot q p=2k⋅q,其中 q q q 为奇数。这样分解能将 p p p 的 2 2 2 的幂次部分和奇数部分分开处理。
步骤2:转换模运算表达式
从原始表达式
2
2
2
⋅
⋅
⋅
m
o
d
p
2^{2^{2^{\cdot^{\cdot^{\cdot}}}}} \bmod p
222⋅⋅⋅modp 开始,结合
p
=
2
k
⋅
q
p = 2^k \cdot q
p=2k⋅q,可将其改写为:
2
k
(
2
2
2
⋅
⋅
⋅
−
k
m
o
d
q
)
2^k \left(2^{2^{2^{\cdot^{\cdot^{\cdot}}}-k}} \bmod q\right)
2k(222⋅⋅⋅−kmodq)
这里
2
2
2
⋅
⋅
⋅
−
k
m
o
d
q
2^{2^{2^{\cdot^{\cdot^{\cdot}}}-k}} \bmod q
222⋅⋅⋅−kmodq 聚焦于指数部分对奇数
q
q
q 取模的情况。
步骤3:应用欧拉定理
因为
q
q
q 是奇数,所以
gcd
(
2
,
q
)
=
1
\gcd(2, q) = 1
gcd(2,q)=1。根据欧拉定理,若
gcd
(
a
,
n
)
=
1
\gcd(a, n) = 1
gcd(a,n)=1,则
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a^{\phi(n)} \equiv 1 \pmod{n}
aϕ(n)≡1(modn)(其中
ϕ
\phi
ϕ 是欧拉函数)。于是,我们可以将指数对
ϕ
(
q
)
\phi(q)
ϕ(q) 取模来简化:
2
k
(
2
(
2
2
⋅
⋅
⋅
−
k
)
m
o
d
ϕ
(
q
)
m
o
d
q
)
2^k \left(2^{\left(2^{2^{\cdot^{\cdot^{\cdot}}}-k}\right) \bmod \phi(q)} \bmod q\right)
2k
2(22⋅⋅⋅−k)modϕ(q)modq
这形成了递归结构,此时指数部分的形式与原始问题相同(只是模数不同)。
步骤4:递归过程
除第一次迭代外,每一步递归中的模数都是偶数。这意味着模数在每次迭代中至少会减半,因此递归最多会在 Θ ( log 2 p ) \Theta(\log_2 p) Θ(log2p) 步后终止,此时模数变为 1 1 1。
当模数为 1 1 1 时,任何整数对 1 1 1 取模的结果都是 0 0 0。此时,我们可以通过回溯递归调用来计算最终结果。
步骤5:时间复杂度分析
- 使用线性筛计算欧拉函数:时间复杂度为 Θ ( p + T log 2 p ) \Theta(p + T\log_2 p) Θ(p+Tlog2p),其中 T T T 是递归步骤数。
- 每次用 Θ ( p ) \Theta(\sqrt{p}) Θ(p) 计算欧拉函数:时间复杂度为 Θ ( T log 2 p p ) \Theta(T\log_2 p\sqrt{p}) Θ(Tlog2pp)。实践中,这种方法比线性筛法快得多。
- 迭代计算(模 1 1 1 到模 1 0 7 10^7 107):时间复杂度为 Θ ( p ) \Theta(p) Θ(p),但由于常数因子过大,实际运行中常出现超时(TLE)。
这种方法借助数论知识和递归,利用模运算与欧拉定理的性质,高效地解决了问题。
3.2 代码实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 计算欧拉函数值 phi(x)
ll ph(ll x) {
ll res = x, a = x;
for (ll i = 2; i * i <= x; i++) {
if (a % i == 0) {
res = res / i * (i - 1);
while (a % i == 0) a /= i;
}
}
if (a > 1) res = res / a * (a - 1);
return res;
}
// 快速幂计算:(a^b) mod mod
ll quick_pow(ll a, ll b, ll mod) {
ll ans = 1;
while (b) {
if (b & 1) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
// 递归计算 f(p) = 2^(2^(2^...)) mod p
ll f(ll p) {
if (p == 1) return 0; // 递归边界:任何数 mod 1 = 0
ll k = ph(p); // 计算 phi(p)
// 递归:内层指数 = f(k) + k,再应用快速幂
return quick_pow(2, f(k) + k, p);
}
// 主函数:多组测试用例
int main() {
int T;
scanf("%d", &T);
while (T--) {
ll p;
scanf("%lld", &p);
printf("%lld\n", f(p));
}
return 0;
}
4 通用问题:求 A B m o d C A^B \mod C ABmodC( B B B 为大整数)
4.1 问题特点
B B B 为大整数(需用字符串存储),需通过欧拉降幂将 B B B 转换为可计算的小指数,再用快速幂求解。
4.2 代码实现
#include <bits/stdc++.h>
#define ll __int64
using namespace std;
char a[1000006]; // 存储大指数 B(字符串形式)
ll x, z; // x = A,z = C
// 快速幂计算:(x^y) mod z
ll quickpow(ll x, ll y, ll z) {
ll ans = 1;
while (y) {
if (y & 1) ans = ans * x % z;
x = x * x % z;
y >>= 1;
}
return ans;
}
// 计算欧拉函数值 phi(n)
ll phi(ll n) {
ll i, rea = n;
for (i = 2; i * i <= n; i++) {
if (n % i == 0) {
rea = rea - rea / i; // 等价于 rea = rea / i * (i-1)
while (n % i == 0) n /= i;
}
}
if (n > 1) rea = rea - rea / n;
return rea;
}
// 主函数:输入 A、B(字符串)、C,输出 A^B mod C
int main() {
while (scanf("%lld %s %lld", &x, a, &z) != EOF) {
ll len = strlen(a);
ll p = phi(z); // 步骤1:计算 phi(C)
ll ans = 0;
// 步骤2:将字符串 B 转换为数值,并对 phi(C) 取余
for (ll i = 0; i < len; i++) {
ans = (ans * 10 + a[i] - '0') % p;
}
// 步骤3:补充 phi(C),确保降幂公式适用
ans += p;
// 步骤4:快速幂计算最终结果
printf("%lld\n", quickpow(x, ans, z));
}
return 0;
}
EOF
posted @ 2020-05-03 23:22 ジャスミン
欧拉降幂公式
一、引言
在数论与算法领域,大指数幂运算的取模问题(即计算 a b m o d c a^b \mod c abmodc,其中 b b b 为极大整数)是核心难点之一。
直接计算 a b a^b ab 会因数值溢出或复杂度爆炸而无法实现,欧拉降幂公式基于欧拉函数 φ ( c ) \varphi(c) φ(c),通过“降低指数规模”的核心思想,将此类问题转化为可解形式,是解决大指数模运算的关键工具。
1.1 变量定义
在学习欧拉降幂公式前,需明确以下3个基础变量的定义,避免后续混淆:
- a , b , c a, b, c a,b,c:均为正整数,且 c ≥ 2 c \geq 2 c≥2(若 c = 1 c=1 c=1,则任何数对1取模结果恒为0,无需降幂);
- gcd ( a , c ) \gcd(a, c) gcd(a,c):表示 a a a 与 c c c 的最大公约数,用于判断两者是否互质(互质即 gcd ( a , c ) = 1 \gcd(a,c)=1 gcd(a,c)=1);
- φ ( c ) \varphi(c) φ(c):欧拉函数,定义为“小于等于 c c c 且与 c c c 互质的正整数的个数”,是降幂公式的核心工具。
1.2 欧拉函数的计算
欧拉函数的计算依赖于模数 c c c 的质因数分解,具体步骤如下:
- 对 c c c 进行质因数分解:若 c = p 1 k 1 p 2 k 2 … p n k n c = p_1^{k_1} p_2^{k_2} \dots p_n^{k_n} c=p1k1p2k2…pnkn(其中 p 1 , p 2 , … , p n p_1,p_2,\dots,p_n p1,p2,…,pn 为互不相同的质数, k 1 , k 2 , … , k n k_1,k_2,\dots,k_n k1,k2,…,kn 为正整数);
- 代入欧拉函数公式:
φ ( c ) = c ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ ⋯ ⋅ ( 1 − 1 p n ) \varphi(c) = c \cdot \left(1 - \frac{1}{p_1}\right) \cdot \left(1 - \frac{1}{p_2}\right) \cdot \dots \cdot \left(1 - \frac{1}{p_n}\right) φ(c)=c⋅(1−p11)⋅(1−p21)⋅⋯⋅(1−pn1)
示例:
- 计算 φ ( 6 ) \varphi(6) φ(6):6的质因数分解为 2 1 × 3 1 2^1 \times 3^1 21×31,则 φ ( 6 ) = 6 × ( 1 − 1 2 ) × ( 1 − 1 3 ) = 6 × 1 2 × 2 3 = 2 \varphi(6) = 6 \times (1-\frac{1}{2}) \times (1-\frac{1}{3}) = 6 \times \frac{1}{2} \times \frac{2}{3} = 2 φ(6)=6×(1−21)×(1−31)=6×21×32=2(与6互质的数为1、5,共2个,结果一致);
- 计算 φ ( 7 ) \varphi(7) φ(7):7是质数,质因数分解为 7 1 7^1 71,则 φ ( 7 ) = 7 × ( 1 − 1 7 ) = 6 \varphi(7) = 7 \times (1-\frac{1}{7}) = 6 φ(7)=7×(1−71)=6(与7互质的数为1~6,共6个,结果一致)。
二、欧拉降幂公式的完整形式
欧拉降幂公式并非单一表达式,需根据底数 a a a 与模数 c c c 的互质关系和指数 b b b 的大小分为3种核心场景,覆盖所有可能情况且互不重叠。其核心目标是:在不改变 a b m o d c a^b \mod c abmodc 结果的前提下,将指数 b b b 降低至可计算范围。
2.1 场景1: a a a 与 c c c 互质( gcd ( a , c ) = 1 \gcd(a,c)=1 gcd(a,c)=1)
公式
a b m o d c = a b m o d φ ( c ) m o d c a^b \mod c = a^{b \mod \varphi(c)} \mod c abmodc=abmodφ(c)modc
适用条件
无需限制指数 b b b 的大小(无论 b b b 为大或小,公式均成立)。
原理
由欧拉定理推导:若 gcd ( a , c ) = 1 \gcd(a,c)=1 gcd(a,c)=1,则 a φ ( c ) ≡ 1 ( m o d c ) a^{\varphi(c)} \equiv 1 \pmod{c} aφ(c)≡1(modc)。这意味着 a a a 的幂次以 φ ( c ) \varphi(c) φ(c) 为周期循环,因此指数 b b b 可对 φ ( c ) \varphi(c) φ(c) 取模后简化,即 b = k ⋅ φ ( c ) + r b = k \cdot \varphi(c) + r b=k⋅φ(c)+r( 0 ≤ r < φ ( c ) 0 \leq r < \varphi(c) 0≤r<φ(c)),则 a b = ( a φ ( c ) ) k ⋅ a r ≡ 1 k ⋅ a r = a r ( m o d c ) a^b = (a^{\varphi(c)})^k \cdot a^r \equiv 1^k \cdot a^r = a^r \pmod{c} ab=(aφ(c))k⋅ar≡1k⋅ar=ar(modc)。
示例
计算 3 100 m o d 7 3^{100} \mod 7 3100mod7:
- 判断互质关系: gcd ( 3 , 7 ) = 1 \gcd(3,7)=1 gcd(3,7)=1,满足场景1条件;
- 计算欧拉函数: φ ( 7 ) = 6 \varphi(7)=6 φ(7)=6(7为质数);
- 降幂指数: 100 m o d 6 = 4 100 \mod 6 = 4 100mod6=4;
- 计算结果: 3 4 m o d 7 = 81 m o d 7 = 4 3^4 \mod 7 = 81 \mod 7 = 4 34mod7=81mod7=4。
2.2 场景2: a a a 与 c c c 不互质( gcd ( a , c ) ≠ 1 \gcd(a,c) \neq 1 gcd(a,c)=1)且 b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c)
公式(广义欧拉降幂)
a b m o d c = a b m o d φ ( c ) + φ ( c ) m o d c a^b \mod c = a^{b \mod \varphi(c) + \varphi(c)} \mod c abmodc=abmodφ(c)+φ(c)modc
关键注意事项
必须在“ b m o d φ ( c ) b \mod \varphi(c) bmodφ(c)”后补充 φ ( c ) \varphi(c) φ(c)!若仅用 b m o d φ ( c ) b \mod \varphi(c) bmodφ(c) 会导致结果错误(见下方反例)。
原理
当
a
a
a 与
c
c
c 不互质时,欧拉定理直接失效,但可通过“质幂模分解 + 中国剩余定理”推导:
将
c
c
c 分解为质幂乘积
c
=
p
1
k
1
p
2
k
2
…
p
n
k
n
c = p_1^{k_1} p_2^{k_2} \dots p_n^{k_n}
c=p1k1p2k2…pnkn,对每个质幂
p
i
k
i
p_i^{k_i}
piki,可证明
a
b
≡
a
b
m
o
d
φ
(
p
i
k
i
)
+
φ
(
p
i
k
i
)
(
m
o
d
p
i
k
i
)
a^b \equiv a^{b \mod \varphi(p_i^{k_i}) + \varphi(p_i^{k_i})} \pmod{p_i^{k_i}}
ab≡abmodφ(piki)+φ(piki)(modpiki)(因
b
≥
φ
(
c
)
≥
φ
(
p
i
k
i
)
b \geq \varphi(c) \geq \varphi(p_i^{k_i})
b≥φ(c)≥φ(piki),指数足够大以覆盖质因子的影响);再通过中国剩余定理将各质幂模的结果组合,最终得到广义降幂公式。
示例
计算 4 10 m o d 6 4^{10} \mod 6 410mod6:
- 判断互质关系与指数大小: gcd ( 4 , 6 ) = 2 ≠ 1 \gcd(4,6)=2 \neq 1 gcd(4,6)=2=1, φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2,且 10 ≥ 2 10 \geq 2 10≥2,满足场景2条件;
- 降幂指数: 10 m o d 2 = 0 10 \mod 2 = 0 10mod2=0,补充 φ ( 6 ) \varphi(6) φ(6) 后指数为 0 + 2 = 2 0 + 2 = 2 0+2=2;
- 计算结果: 4 2 m o d 6 = 16 m o d 6 = 4 4^2 \mod 6 = 16 \mod 6 = 4 42mod6=16mod6=4;
- 反例验证:若不补充 φ ( 6 ) \varphi(6) φ(6),则指数为0, 4 0 = 1 4^0 = 1 40=1, 1 m o d 6 = 1 1 \mod 6 = 1 1mod6=1,与正确结果4矛盾。
2.3 场景3: a a a 与 c c c 不互质( gcd ( a , c ) ≠ 1 \gcd(a,c) \neq 1 gcd(a,c)=1)且 b < φ ( c ) b < \varphi(c) b<φ(c)
结论
无法降幂,直接计算 a b m o d c a^b \mod c abmodc 即可。
原因
广义降幂公式(场景2)的前提是“指数足够大( b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c))”,若 b < φ ( c ) b < \varphi(c) b<φ(c):
- 补充 φ ( c ) \varphi(c) φ(c) 会导致指数变大(反而增加计算复杂度);
- 此时指数本身已足够小,直接计算(结合快速幂)效率更高,且结果与降幂结果可能不一致(见下方反例)。
示例
计算 6 1 m o d 4 6^1 \mod 4 61mod4:
- 判断互质关系与指数大小: gcd ( 6 , 4 ) = 2 ≠ 1 \gcd(6,4)=2 \neq 1 gcd(6,4)=2=1, φ ( 4 ) = 2 \varphi(4)=2 φ(4)=2,且 1 < 2 1 < 2 1<2,满足场景3条件;
- 直接计算结果: 6 1 m o d 4 = 2 6^1 \mod 4 = 2 61mod4=2;
- 反例验证:若强行用场景2公式,指数为 1 + 2 = 3 1 + 2 = 3 1+2=3, 6 3 = 216 6^3 = 216 63=216, 216 m o d 4 = 0 216 \mod 4 = 0 216mod4=0,与正确结果2矛盾。
2.4 三种场景的对比总结
为清晰区分适用范围,下表整理了三种场景的核心要素:
| 场景 | 互质关系( gcd ( a , c ) \gcd(a,c) gcd(a,c)) | 指数条件( b b b 与 φ ( c ) \varphi(c) φ(c)) | 核心公式 | 关键提醒 |
|---|---|---|---|---|
| 1 | = 1 =1 =1(互质) | 无要求( b b b 任意) | a b m o d φ ( c ) m o d c a^{b \mod \varphi(c)} \mod c abmodφ(c)modc | 无需补充 φ ( c ) \varphi(c) φ(c) |
| 2 | ≠ 1 \neq1 =1(不互质) | b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c)(指数大) | a b m o d φ ( c ) + φ ( c ) m o d c a^{b \mod \varphi(c) + \varphi(c)} \mod c abmodφ(c)+φ(c)modc | 必须补充 φ ( c ) \varphi(c) φ(c) |
| 3 | ≠ 1 \neq1 =1(不互质) | b < φ ( c ) b < \varphi(c) b<φ(c)(指数小) | ( a b ) m o d c (a^b) \mod c (ab)modc(直接计算) | 无法降幂,直接计算 |
三、欧拉降幂公式的严格证明
3.1 场景1( a a a 与 c c c 互质)的证明
- 构造既约剩余系:设 S = { r 1 , r 2 , … , r φ ( c ) } S = \{r_1, r_2, \dots, r_{\varphi(c)}\} S={r1,r2,…,rφ(c)} 是模 c c c 的既约剩余系(即所有与 c c c 互质的剩余类代表,满足 gcd ( r i , c ) = 1 \gcd(r_i, c)=1 gcd(ri,c)=1 且两两模 c c c 不同余);
- 剩余系的封闭性:因 gcd ( a , c ) = 1 \gcd(a,c)=1 gcd(a,c)=1,则 T = { a r 1 , a r 2 , … , a r φ ( c ) } T = \{a r_1, a r_2, \dots, a r_{\varphi(c)}\} T={ar1,ar2,…,arφ(c)} 也是模 c c c 的既约剩余系(证明:若 a r i ≡ a r j ( m o d c ) a r_i \equiv a r_j \pmod{c} ari≡arj(modc),则 r i ≡ r j ( m o d c ) r_i \equiv r_j \pmod{c} ri≡rj(modc),与 S S S 元素互异矛盾;且 gcd ( a r i , c ) = 1 \gcd(a r_i, c)=1 gcd(ari,c)=1);
- 乘积同余:由于
T
T
T 是
S
S
S 的置换,两组元素的乘积模
c
c
c 相等:
( a r 1 ) ( a r 2 ) … ( a r φ ( c ) ) ≡ r 1 r 2 … r φ ( c ) ( m o d c ) (a r_1)(a r_2) \dots (a r_{\varphi(c)}) \equiv r_1 r_2 \dots r_{\varphi(c)} \pmod{c} (ar1)(ar2)…(arφ(c))≡r1r2…rφ(c)(modc)
化简得 a φ ( c ) ⋅ ( r 1 r 2 … r φ ( c ) ) ≡ r 1 r 2 … r φ ( c ) ( m o d c ) a^{\varphi(c)} \cdot (r_1 r_2 \dots r_{\varphi(c)}) \equiv r_1 r_2 \dots r_{\varphi(c)} \pmod{c} aφ(c)⋅(r1r2…rφ(c))≡r1r2…rφ(c)(modc); - 消去乘积项:因 gcd ( r 1 r 2 … r φ ( c ) , c ) = 1 \gcd(r_1 r_2 \dots r_{\varphi(c)}, c)=1 gcd(r1r2…rφ(c),c)=1,两边可约去乘积项,得 a φ ( c ) ≡ 1 ( m o d c ) a^{\varphi(c)} \equiv 1 \pmod{c} aφ(c)≡1(modc)(欧拉定理);
- 指数拆分:设 b = k ⋅ φ ( c ) + r b = k \cdot \varphi(c) + r b=k⋅φ(c)+r( 0 ≤ r < φ ( c ) 0 \leq r < \varphi(c) 0≤r<φ(c)),则 a b = ( a φ ( c ) ) k ⋅ a r ≡ 1 k ⋅ a r = a r = a b m o d φ ( c ) ( m o d c ) a^b = (a^{\varphi(c)})^k \cdot a^r \equiv 1^k \cdot a^r = a^r = a^{b \mod \varphi(c)} \pmod{c} ab=(aφ(c))k⋅ar≡1k⋅ar=ar=abmodφ(c)(modc),证毕。
3.2 场景2( a a a 与 c c c 不互质且 b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c))的证明
- 质幂模分解:将 c c c 分解为质幂乘积 c = p 1 k 1 p 2 k 2 … p n k n c = p_1^{k_1} p_2^{k_2} \dots p_n^{k_n} c=p1k1p2k2…pnkn,需证明对每个质幂 p i k i p_i^{k_i} piki,公式成立(中国剩余定理:若对所有质幂模成立,则对 c c c 成立);
- 单个质幂模的分析:取任意质幂
p
k
p^k
pk,设
a
=
p
t
⋅
s
a = p^t \cdot s
a=pt⋅s(
t
≥
1
t \geq 1
t≥1,
gcd
(
s
,
p
)
=
1
\gcd(s, p)=1
gcd(s,p)=1),需证
a
b
≡
a
b
m
o
d
φ
(
p
k
)
+
φ
(
p
k
)
(
m
o
d
p
k
)
a^b \equiv a^{b \mod \varphi(p^k) + \varphi(p^k)} \pmod{p^k}
ab≡abmodφ(pk)+φ(pk)(modpk):
- 欧拉函数计算: φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) \varphi(p^k) = p^k - p^{k-1} = p^{k-1}(p-1) φ(pk)=pk−pk−1=pk−1(p−1);
- 指数条件:因 b ≥ φ ( c ) ≥ φ ( p k ) = p k − 1 ( p − 1 ) ≥ k b \geq \varphi(c) \geq \varphi(p^k) = p^{k-1}(p-1) \geq k b≥φ(c)≥φ(pk)=pk−1(p−1)≥k(对 p ≥ 2 , k ≥ 1 p \geq 2, k \geq 1 p≥2,k≥1 成立),故 a b = p t b ⋅ s b a^b = p^{t b} \cdot s^b ab=ptb⋅sb 中 t b ≥ t k ≥ k t b \geq t k \geq k tb≥tk≥k( t ≥ 1 t \geq 1 t≥1),因此 a b ≡ 0 ( m o d p k ) a^b \equiv 0 \pmod{p^k} ab≡0(modpk);
- 右侧指数分析: b m o d φ ( p k ) + φ ( p k ) ≥ φ ( p k ) ≥ k b \mod \varphi(p^k) + \varphi(p^k) \geq \varphi(p^k) \geq k bmodφ(pk)+φ(pk)≥φ(pk)≥k,故 a b m o d φ ( p k ) + φ ( p k ) = p t ( b m o d φ ( p k ) + φ ( p k ) ) ⋅ s . . . a^{b \mod \varphi(p^k) + \varphi(p^k)} = p^{t (b \mod \varphi(p^k) + \varphi(p^k))} \cdot s^{...} abmodφ(pk)+φ(pk)=pt(bmodφ(pk)+φ(pk))⋅s... 中 t ( . . . ) ≥ k t (...) \geq k t(...)≥k,因此 a . . . ≡ 0 ( m o d p k ) a^{...} \equiv 0 \pmod{p^k} a...≡0(modpk);
- 综上: a b ≡ a b m o d φ ( p k ) + φ ( p k ) ( m o d p k ) a^b \equiv a^{b \mod \varphi(p^k) + \varphi(p^k)} \pmod{p^k} ab≡abmodφ(pk)+φ(pk)(modpk);
- 组合结果:由中国剩余定理,对所有 p i k i p_i^{k_i} piki 成立,故对 c c c 成立,证毕。
3.3 场景3( a a a 与 c c c 不互质且 b < φ ( c ) b < \varphi(c) b<φ(c))的证明
反证法:
假设存在降幂公式 a b ≡ a r ( m o d c ) a^b \equiv a^{r} \pmod{c} ab≡ar(modc)( r < b r < b r<b),则存在 a r ( a b − r − 1 ) ≡ 0 ( m o d c ) a^r (a^{b - r} - 1) \equiv 0 \pmod{c} ar(ab−r−1)≡0(modc)。
因 b < φ ( c ) b < \varphi(c) b<φ(c), b − r < φ ( c ) b - r < \varphi(c) b−r<φ(c),而 a a a 与 c c c 不互质, a b − r − 1 a^{b - r} - 1 ab−r−1 与 c c c 的公因子可能不足以覆盖 c c c 的所有质因子,导致等式不成立(如示例 6 1 m o d 4 6^1 \mod 4 61mod4,若降幂为 6 0 = 1 6^0=1 60=1,则 1 ≢ 2 ( m o d 4 ) 1 \not\equiv 2 \pmod{4} 1≡2(mod4))。
因此,场景3无法降幂,只能直接计算,证毕。
四、欧拉降幂公式的实战应用
4.1 实际计算步骤
遇到 a b m o d c a^b \mod c abmodc( b b b 极大)时,按以下步骤选择公式,确保无遗漏:
- 第一步:计算基础量
- 计算 gcd ( a , c ) \gcd(a, c) gcd(a,c),判断 a a a 与 c c c 是否互质;
- 计算 φ ( c ) \varphi(c) φ(c)(需先对 c c c 质因数分解);
- 第二步:根据场景选择公式
- 若 gcd ( a , c ) = 1 \gcd(a,c)=1 gcd(a,c)=1 → 场景1公式;
- 若
gcd
(
a
,
c
)
≠
1
\gcd(a,c) \neq 1
gcd(a,c)=1:
- 若 b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c) → 场景2公式;
- 若 b < φ ( c ) b < \varphi(c) b<φ(c) → 场景3(直接计算);
- 第三步:结合快速幂计算
降幂后的指数仍可能较大,需用快速幂算法(见4.2节)高效计算 a r m o d c a^r \mod c armodc( r r r 为降幂后的指数)。
4.2 快速幂算法(辅助工具)
快速幂算法通过“指数二分”思想,将 a r m o d c a^r \mod c armodc 的时间复杂度从 O ( r ) O(r) O(r) 降至 O ( log r ) O(\log r) O(logr),是欧拉降幂的必备辅助工具。
算法原理
- 若 r r r 为偶数: a r = ( a 2 ) r / 2 a^r = (a^2)^{r/2} ar=(a2)r/2;
- 若 r r r 为奇数: a r = a ⋅ ( a 2 ) ( r − 1 ) / 2 a^r = a \cdot (a^2)^{(r-1)/2} ar=a⋅(a2)(r−1)/2;
- 过程中及时对底数和结果取模,避免溢出。
代码实现(C++)
long long fast_pow_mod(long long base, long long exponent, long long mod) {
long long result = 1;
base %= mod; // long long result = 1;
base %= mod; // 底数先取模,避免初始值过大
while (exponent > 0) {
// 指数为奇数时,将当前底数乘入结果
if (exponent % 2 == 1) {
result = (result * base) % mod; // 结果取模,防止溢出
}
// 底数平方,指数减半(二分思想)
base = (base * base) % mod; // 底数平方后取模
exponent /= 2;
}
return result;
}
4.3 典型应用场景
场景1:密码学(RSA加密算法)
RSA算法的核心步骤依赖大指数幂取模:
- 加密过程: c = m e m o d n c = m^e \mod n c=memodn( m m m 为明文, e e e 为公钥指数, n n n 为模数);
- 解密过程: m = c d m o d n m = c^d \mod n m=cdmodn( d d d 为私钥指数);
- 关键问题:
e
e
e 和
d
d
d 通常是数百位的大整数,直接计算
m
e
m^e
me 或
c
d
c^d
cd 不可行。
通过欧拉降幂(结合 n = p q n = pq n=pq 的特性, φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) = (p-1)(q-1) φ(n)=(p−1)(q−1)),可将指数降为 e m o d φ ( n ) e \mod \varphi(n) emodφ(n) 或 d m o d φ ( n ) d \mod \varphi(n) dmodφ(n),大幅降低计算量,确保加密/解密高效执行。
场景2:算法竞赛(大指数取模问题)
在ACM-ICPC、CCF CSP等竞赛中,常出现“计算 a b m o d c a^b \mod c abmodc 且 b b b 为 1 0 100 10^{100} 10100 级别大整数”的题目,需结合欧拉降幂与快速幂求解:
- 示例:计算
2
1000000000000
m
o
d
15
2^{1000000000000} \mod 15
21000000000000mod15
- 计算 gcd ( 2 , 15 ) = 1 \gcd(2,15)=1 gcd(2,15)=1, φ ( 15 ) = 8 \varphi(15)=8 φ(15)=8(15=3×5, φ ( 15 ) = 15 × ( 1 − 1 / 3 ) × ( 1 − 1 / 5 ) = 8 \varphi(15)=15×(1-1/3)×(1-1/5)=8 φ(15)=15×(1−1/3)×(1−1/5)=8);
- 降幂指数: 1000000000000 m o d 8 = 0 1000000000000 \mod 8 = 0 1000000000000mod8=0(场景1公式);
- 快速幂计算: 2 0 m o d 15 = 1 2^0 \mod 15 = 1 20mod15=1,最终结果为1。
场景3:无限嵌套指数(指数塔)
欧拉降幂的经典进阶应用是解决“无限嵌套指数取模”,例如计算 2 2 2 … ( m o d p ) 2^{2^{2^{\dots}}} \pmod{p} 222…(modp)(嵌套层数无限,称为“指数塔”)。
问题分析
- 直接计算外层指数不可行(指数塔无限大);
- 需通过递归+欧拉降幂逐层简化:设 f ( p ) = 2 2 2 … ( m o d p ) f(p) = 2^{2^{2^{\dots}}} \pmod{p} f(p)=222…(modp),则内层指数仍为 f ( φ ( p ) ) f(\varphi(p)) f(φ(p))(内层也是无限指数塔);
- 递归边界:当 p = 1 p=1 p=1 时,任何数 mod 1 均为0,故 f ( 1 ) = 0 f(1)=0 f(1)=0。
核心算法(C++)
#include <map>
using namespace std;
// 缓存欧拉函数结果,避免重复计算
map<long long, long long> phi_cache;
// 计算欧拉函数
long long get_phi(long long n) {
if (phi_cache.count(n)) return phi_cache[n];
long long res = n;
// 质因数分解
for (long long 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); // 剩余质因子
phi_cache[n] = res;
return res;
}
// 快速幂(支持扩展欧拉降幂)
long long power_mod(long long base, long long exp, long long mod, long long phi_mod) {
if (mod == 1) return 0;
// 确保指数满足 b >= phi(mod),补充 phi_mod
long long effective_exp = exp < phi_mod ? exp + phi_mod : exp;
long long res = 1;
base %= mod;
while (effective_exp > 0) {
if (effective_exp % 2 == 1) res = (res * base) % mod;
base = (base * base) % mod;
effective_exp /= 2;
}
return res;
}
// 递归计算指数塔 mod p
long long calculate_tower_mod(long long p) {
if (p == 1) return 0; // 递归边界
long long phi_p = get_phi(p);
long long inner_exp = calculate_tower_mod(phi_p); // 内层指数塔 mod phi(p)
return power_mod(2, inner_exp, p, phi_p); // 应用场景2公式
}
测试示例
计算 2 2 2 … ( m o d 7 ) 2^{2^{2^{\dots}}} \pmod{7} 222…(mod7):
- 递归步骤: f ( 7 ) → φ ( 7 ) = 6 → f ( 6 ) → φ ( 6 ) = 2 → f ( 2 ) → φ ( 2 ) = 1 → f ( 1 ) = 0 f(7) \to \varphi(7)=6 \to f(6) \to \varphi(6)=2 \to f(2) \to \varphi(2)=1 \to f(1)=0 f(7)→φ(7)=6→f(6)→φ(6)=2→f(2)→φ(2)=1→f(1)=0;
- 回溯计算:
- f ( 2 ) = p o w e r m o d ( 2 , 0 , 2 , 1 ) = 0 f(2) = power_mod(2, 0, 2, 1) = 0 f(2)=powermod(2,0,2,1)=0;
- f ( 6 ) = p o w e r m o d ( 2 , 0 , 6 , 2 ) = 4 f(6) = power_mod(2, 0, 6, 2) = 4 f(6)=powermod(2,0,6,2)=4;
- f ( 7 ) = p o w e r m o d ( 2 , 4 , 7 , 6 ) = 2 4 m o d 7 = 16 m o d 7 = 2 f(7) = power_mod(2, 4, 7, 6) = 2^4 \mod 7 = 16 \mod 7 = 2 f(7)=powermod(2,4,7,6)=24mod7=16mod7=2;
- 最终结果:2。
第五章 与其他数论定理的关联与对比
5.1 与费马小定理的关系(特殊与一般)
费马小定理是欧拉降幂公式在“模数为质数”时的特殊情况,二者关系如下:
| 对比维度 | 费马小定理(Fermat’s Little Theorem) | 欧拉降幂公式 |
|---|---|---|
| 适用条件 | 1. 模数
p
p
p 为质数; 2. gcd ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 | 1. 模数
c
c
c 为任意正整数(
c
≥
2
c \geq 2
c≥2); 2. 无互质强制要求(分场景处理) |
| 核心公式 | a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp)(降幂形式: a b ≡ a b m o d ( p − 1 ) ( m o d p ) a^b \equiv a^{b \mod (p-1)} \pmod{p} ab≡abmod(p−1)(modp)) | 分3场景(见第二章),当 c = p c=p c=p(质数)且 gcd ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 时,退化为费马小定理 |
| 本质 | 质数模下的指数周期性结论(周期为 p − 1 p-1 p−1) | 任意模下的通用降幂工具(周期为 φ ( c ) \varphi(c) φ(c)) |
示例:计算 3 100 m o d 7 3^{100} \mod 7 3100mod7(7为质数)
- 费马小定理: gcd ( 3 , 7 ) = 1 \gcd(3,7)=1 gcd(3,7)=1, 3 6 ≡ 1 ( m o d 7 ) 3^{6} \equiv 1 \pmod{7} 36≡1(mod7), 100 m o d 6 = 4 100 \mod 6=4 100mod6=4, 3 4 m o d 7 = 4 3^4 \mod7=4 34mod7=4;
- 欧拉降幂: φ ( 7 ) = 6 \varphi(7)=6 φ(7)=6, 3 100 m o d 6 m o d 7 = 3 4 m o d 7 = 4 3^{100 \mod6} \mod7=3^4 \mod7=4 3100mod6mod7=34mod7=4,结果一致。
5.2 与原根、阶的关联(更精细的降幂)
对于与 c c c 互质的 a a a,若存在最小正整数 d d d 使得 a d ≡ 1 ( m o d c ) a^d \equiv 1 \pmod{c} ad≡1(modc),则 d d d 称为 a a a 模 c c c 的阶(记为 ord c ( a ) \text{ord}_c(a) ordc(a))。阶与欧拉函数的关系是 ord c ( a ) ∣ φ ( c ) \text{ord}_c(a) \mid \varphi(c) ordc(a)∣φ(c)(阶是欧拉函数的约数)。
基于阶的降幂公式为:
a
b
≡
a
b
m
o
d
d
(
m
o
d
c
)
a^b \equiv a^{b \mod d} \pmod{c}
ab≡abmodd(modc)
由于
d
≤
φ
(
c
)
d \leq \varphi(c)
d≤φ(c),该公式可将指数降得更小,计算效率更高。
示例:计算 2 100 m o d 7 2^{100} \mod 7 2100mod7
- 欧拉降幂: φ ( 7 ) = 6 \varphi(7)=6 φ(7)=6, 100 m o d 6 = 4 100 \mod6=4 100mod6=4, 2 4 = 16 m o d 7 = 2 2^4=16 \mod7=2 24=16mod7=2;
- 基于阶的降幂: ord 7 ( 2 ) = 3 \text{ord}_7(2)=3 ord7(2)=3( 2 3 = 8 ≡ 1 m o d 7 2^3=8 \equiv1 \mod7 23=8≡1mod7,且无更小正整数满足), 100 m o d 3 = 1 100 \mod3=1 100mod3=1, 2 1 = 2 m o d 7 = 2 2^1=2 \mod7=2 21=2mod7=2,指数更小(1 < 4)。
六、常见误区与注意事项
6.1 混淆“互质”与“不互质”的公式适用场景
- 错误案例:计算 4 2 m o d 6 4^2 \mod 6 42mod6 时,误用场景1公式( gcd ( 4 , 6 ) = 2 ≠ 1 \gcd(4,6)=2 \neq1 gcd(4,6)=2=1,不满足互质条件), φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2, 2 m o d 2 = 0 2 \mod2=0 2mod2=0, 4 0 = 1 m o d 6 = 1 4^0=1 \mod6=1 40=1mod6=1,但正确结果为 4 2 = 16 m o d 6 = 4 4^2=16 \mod6=4 42=16mod6=4;
- 正确做法:先计算 gcd ( a , c ) \gcd(a,c) gcd(a,c),再根据指数大小选择公式,不互质且 b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c) 时必须补充 φ ( c ) \varphi(c) φ(c)(场景2)。
6.2 忽略“指数补充 φ ( c ) \varphi(c) φ(c)”的前提条件
- 错误案例:计算 6 1 m o d 4 6^1 \mod4 61mod4 时,强行用场景2公式( b = 1 < φ ( 4 ) = 2 b=1 < \varphi(4)=2 b=1<φ(4)=2,不满足指数条件),指数变为 1 + 2 = 3 1+2=3 1+2=3, 6 3 = 216 m o d 4 = 0 6^3=216 \mod4=0 63=216mod4=0,但正确结果为 6 1 m o d 4 = 2 6^1 \mod4=2 61mod4=2;
- 正确做法:仅当 a a a 与 c c c 不互质 且 b ≥ φ ( c ) b \geq \varphi(c) b≥φ(c) 时,才补充 φ ( c ) \varphi(c) φ(c),二者缺一不可。
6.3 欧拉函数计算错误
欧拉函数的计算依赖质因数分解,若分解错误,后续降幂全错:
- 错误案例:计算 φ ( 12 ) \varphi(12) φ(12) 时,错误分解为 12 = 2 × 6 12=2×6 12=2×6(6非质数), φ ( 12 ) = 12 × ( 1 − 1 / 2 ) × ( 1 − 1 / 6 ) = 5 \varphi(12)=12×(1-1/2)×(1-1/6)=5 φ(12)=12×(1−1/2)×(1−1/6)=5,但正确分解为 12 = 2 2 × 3 12=2^2×3 12=22×3, φ ( 12 ) = 12 × ( 1 − 1 / 2 ) × ( 1 − 1 / 3 ) = 4 \varphi(12)=12×(1-1/2)×(1-1/3)=4 φ(12)=12×(1−1/2)×(1−1/3)=4;
- 正确做法:质因数分解时,需将模数分解为互不相同的质数的幂次乘积,遍历到 n \sqrt{n} n 后需检查剩余部分是否为质数(如 n = 15 n=15 n=15,遍历到 i = 3 i=3 i=3 后剩余 5 > 1 5>1 5>1,需补充乘以 ( 1 − 1 / 5 ) (1-1/5) (1−1/5))。
6.4 忽略“模数 c = 1 c=1 c=1”的特殊情况
当 c = 1 c=1 c=1 时,任何整数对1取模结果恒为0,无需计算欧拉函数或降幂:
- 示例:计算 10 0 1000 m o d 1 100^{1000} \mod1 1001000mod1,直接得0,无需额外操作。
七、应用领域
一、密码学领域(除 RSA 外)
欧拉降幂公式是密码学核心工具,可简化非对称加密、签名算法中 “密钥生成”“签名验证”“解密” 的高次幂计算,解决指数过大导致的效率问题。
1. 椭圆曲线密码学(ECC)
ECC(如比特币 secp256k1 曲线)核心是椭圆曲线上的点群运算,“点的高次倍乘” 是 ECDH 密钥交换、ECDSA 签名的关键步骤。
- 原理:椭圆曲线点群满足 “有限阶”(存在最小正整数 n n n,使 n P = O nP = O nP=O, O O O 为无穷远点, P P P 为基点),与欧拉函数 “模 m m m 下的阶” 本质一致。计算 “ k P kP kP”( k k k 为私钥)时,可用曲线阶 n n n 替代 ϕ ( m ) \phi (m) ϕ(m),将 k k k 简化为 k m o d n k \mod n kmodn,再算 ( k m o d n ) P (k \mod n) P (kmodn)P,减少运算量。
- 例:secp256k1 曲线 P P P 的阶 n = 2 256 − 2 32 − 3 ⋅ 2 96 + 2 32 − 1 n=2^{256}-2^{32}-3\cdot2^{96}+2^{32}-1 n=2256−232−3⋅296+232−1, k k k 超 n n n 时,先算 k ′ = k m o d n k'=k \mod n k′=kmodn 再算 k ′ P k'P k′P,结果一致且效率更高。
2. 数字签名算法(DSA)
DSA(衍生出 ECDSA)签名需算 “ r = ( g k m o d p ) m o d q r = (g^k \mod p) \mod q r=(gkmodp)modq”,验证需算 “ v = ( g u 1 ⋅ y u 2 m o d p ) m o d q v = (g^{u1} \cdot y^{u2} \mod p) \mod q v=(gu1⋅yu2modp)modq”( g g g 为模 p p p 原根, q q q 为 p − 1 p-1 p−1 大素因子, k 、 u 1 、 u 2 k、u1、u2 k、u1、u2 为大整数)。
- 原理:由 g q ≡ 1 ( m o d p ) g^q \equiv 1 \pmod {p} gq≡1(modp)(原根性质,对应欧拉定理 g ϕ ( p ) = g p − 1 ≡ 1 ( m o d p ) g^{\phi (p)}=g^{p-1} \equiv 1 \pmod {p} gϕ(p)=gp−1≡1(modp),且 q q q 是 ϕ ( p ) \phi (p) ϕ(p) 因子),计算 g k m o d p g^k \mod p gkmodp 时可先降幂 k ′ = k m o d q k' = k \mod q k′=kmodq,再算 g k ′ m o d p g^{k'} \mod p gk′modp,结果不变。
- 作用: k k k 为 1000 位时,降幂后 k ′ k' k′ 仅 160 位,运算效率提升数倍,确保签名 / 验证毫秒级完成。
3. Diffie-Hellman 密钥交换(DH)
DH 是首个非对称密钥交换协议,核心步骤为 “双方算 A = g a m o d p A = g^a \mod p A=gamodp 和 B = g b m o d p B = g^b \mod p B=gbmodp,再各自算 B a m o d p B^a \mod p Bamodp 和 A b m o d p A^b \mod p Abmodp(即共享密钥)”( g g g 为模 p p p 原根, a 、 b a、b a、b 为私钥)。
- 原理:由欧拉定理 g p − 1 ≡ 1 ( m o d p ) g^{p-1} \equiv 1 \pmod {p} gp−1≡1(modp)( ϕ ( p ) = p − 1 \phi (p)=p-1 ϕ(p)=p−1), a b ab ab 为极大指数(如 a 、 b a、b a、b 均为 2048 位, a b ab ab 为 4096 位)时,可降幂 a b m o d ( p − 1 ) ab \mod (p-1) abmod(p−1),即 g a b ≡ g a b m o d ( p − 1 ) ( m o d p ) g^{ab} \equiv g^{ab \mod (p-1)} \pmod {p} gab≡gabmod(p−1)(modp),简化计算。
- 例: p p p 为 2048 位素数时,降幂后指数从 4096 位降至 2048 位,乘法次数减半,避免计算超时。
二、数论与数学计算领域
欧拉降幂是数论 “高次幂模运算” 核心工具,用于竞赛题、大整数余数计算、素性测试等场景。
1. 大整数高次幂的余数计算
计算 “ a b m o d m a^b \mod m abmodm”( b b b 为极大整数,如 b = 1 0 1000 b=10^{1000} b=101000)时,直接算 a b a^b ab 会溢出,欧拉降幂可通过 “降指数” 高效计算。
- 分情况应用(完整公式):
- a a a 与 m m m 互质: a b ≡ a b m o d ϕ ( m ) ( m o d m ) a^b \equiv a^{b \mod \phi (m)} \pmod {m} ab≡abmodϕ(m)(modm);
- a a a 与 m m m 不互质且 b ≥ ϕ ( m ) b \geq \phi (m) b≥ϕ(m): a b ≡ a b m o d ϕ ( m ) + ϕ ( m ) ( m o d m ) a^b \equiv a^{b \mod \phi (m) + \phi (m)} \pmod {m} ab≡abmodϕ(m)+ϕ(m)(modm);
- a a a 与 m m m 不互质且 b < ϕ ( m ) b < \phi (m) b<ϕ(m):直接算 a b m o d m a^b \mod m abmodm。
- 实例:计算
2
1000
m
o
d
15
2^{1000} \mod 15
21000mod15。
第一步: ϕ ( 15 ) = ϕ ( 3 × 5 ) = 15 × ( 1 − 1 / 3 ) × ( 1 − 1 / 5 ) = 8 \phi (15)=\phi (3×5)=15×(1-1/3)×(1-1/5)=8 ϕ(15)=ϕ(3×5)=15×(1−1/3)×(1−1/5)=8;
第二步:2 与 15 互质且 1000 ≥ 8 1000 \geq 8 1000≥8,降幂得 1000 m o d 8 = 0 1000 \mod 8 = 0 1000mod8=0;
第三步: 2 0 = 1 2^0=1 20=1,故 2 1000 ≡ 1 ( m o d 15 ) 2^{1000} \equiv 1 \pmod {15} 21000≡1(mod15)。
2. 素性测试(如 Miller-Rabin 测试)
Miller-Rabin 测试是常用 “概率性素性测试”,核心依赖费马小定理(欧拉定理特殊情况, m m m 为素数时 ϕ ( m ) = m − 1 \phi (m)=m-1 ϕ(m)=m−1,即 a m − 1 ≡ 1 ( m o d m ) a^{m-1} \equiv 1 \pmod {m} am−1≡1(modm)),欧拉降幂可简化高次幂计算。
- 测试步骤(简化版):
- 奇数 n n n(待测试数)写成 n − 1 = d × 2 s n-1 = d × 2^s n−1=d×2s;
- 选 a a a( 1 < a < n 1 < a < n 1<a<n),算 x = a d m o d n x = a^d \mod n x=admodn;
- x = 1 x=1 x=1 或 x = n − 1 x=n-1 x=n−1 则 n n n 可能为素数;否则重复算 x = x 2 m o d n x = x^2 \mod n x=x2modn(共 s − 1 s-1 s−1 次),始终不为 n − 1 n-1 n−1 则 n n n 是合数。
- 作用: d d d 为大整数(如 n n n 为 2048 位, d d d 为 2047 位)时,需用欧拉降幂简化指数,否则计算无法完成。
- 意义:是 RSA 密钥生成 “生成大素数” 的核心算法,优化后可几秒内完成 2048 位素数测试。
3. 数论竞赛与难题求解
是奥林匹克数学竞赛(如 IMO、国内数竞)中解决 “高次幂同余” 问题的核心工具,例如:
- 问题:求最小正整数
k
k
k,使
3
k
≡
1
(
m
o
d
7
)
3^k \equiv 1 \pmod {7}
3k≡1(mod7)。
解: ϕ ( 7 ) = 6 \phi (7)=6 ϕ(7)=6,3 与 7 互质,故 3 6 ≡ 1 ( m o d 7 ) 3^6 \equiv1 \pmod {7} 36≡1(mod7),最小 k k k 是 6 的约数(1,2,3,6)。验证得 3 3 = 27 ≡ 6 ( m o d 7 ) 3^3=27 \equiv6 \pmod {7} 33=27≡6(mod7), 3 6 = ( 3 3 ) 2 ≡ 6 2 = 36 ≡ 1 ( m o d 7 ) 3^6=(3^3)^2 \equiv6^2=36 \equiv1 \pmod {7} 36=(33)2≡62=36≡1(mod7),故 k = 6 k=6 k=6。 - 问题:计算
5
2023
m
o
d
12
5^{2023} \mod 12
52023mod12。
解: ϕ ( 12 ) = ϕ ( 4 × 3 ) = 12 × ( 1 − 1 / 2 ) × ( 1 − 1 / 3 ) = 4 \phi (12)=\phi (4×3)=12×(1-1/2)×(1-1/3)=4 ϕ(12)=ϕ(4×3)=12×(1−1/2)×(1−1/3)=4,5 与 12 互质, 2023 m o d 4 = 3 2023 \mod 4=3 2023mod4=3,故 5 3 = 125 ≡ 5 ( m o d 12 ) 5^3=125 \equiv5 \pmod {12} 53=125≡5(mod12),结果为 5。
三、计算机科学与算法设计
欧拉降幂用于 “优化涉及大指数的算法”,涵盖哈希函数、伪随机数生成、分布式计算等场景。
1. 密码学哈希函数(如 SHA-256 的辅助计算)
部分场景(如 “基于哈希的签名”)需计算 “输入的高次幂模素数”,例如轻量级哈希方案 H ( x ) = ( x k m o d p ) H (x) = (x^{k} \mod p) H(x)=(xkmodp)( k k k 为大整数, p p p 为素数),需用欧拉降幂简化 x k m o d p x^k \mod p xkmodp(因 ϕ ( p ) = p − 1 \phi (p)=p-1 ϕ(p)=p−1,可降为 x k m o d ( p − 1 ) m o d p x^{k \mod (p-1)} \mod p xkmod(p−1)modp),避免计算耗时过长。
2. 伪随机数生成(PRNG)
部分 PRNG(如 “线性同余生成器” 变种)公式为 X n + 1 = ( a × X n b + c ) m o d m X_{n+1} = (a × X_n^b + c) \mod m Xn+1=(a×Xnb+c)modm( a 、 b 、 c a、b、c a、b、c 为参数, m m m 为模)。 b b b 为大整数(如 b = 1 0 5 b=10^5 b=105)时,直接算 X n b X_n^b Xnb 会溢出,可利用欧拉降幂将 b b b 降为 b m o d ϕ ( m ) b \mod \phi (m) bmodϕ(m)(若 X n X_n Xn 与 m m m 互质),再算 X n b m o d ϕ ( m ) m o d m X_n^{b \mod \phi (m)} \mod m Xnbmodϕ(m)modm,确保高效运行且符合随机性要求。
3. 分布式计算中的任务分配
需分配 “大指数计算任务”(如分布式破解密码的高次幂验证)时,可先将 b b b 拆分为 b = q × ϕ ( m ) + r b = q × \phi (m) + r b=q×ϕ(m)+r( 0 ≤ r < ϕ ( m ) 0 \leq r < \phi (m) 0≤r<ϕ(m)),则 a b ≡ a r m o d m a^b \equiv a^r \mod m ab≡armodm(若 a a a 与 m m m 互质),每个节点仅算 a r a^r ar 的部分乘积,再汇总结果,减少单个节点压力。
欧拉降幂公式的本质是 “将‘无限大的指数’转化为‘有限范围的指数’”,所有应用均围绕此核心 —— 存在 “大整数高次幂的模运算” 且需优化效率、避免溢出时,欧拉降幂是关键工具,是连接理论数论与实际工程的重要桥梁。
总结
欧拉降幂公式是解决 “大指数幂取模” 的核心工具,核心逻辑为 “先判互质,再看指数,按需降幂”:
1.判互质:通过
gcd
(
a
,
c
)
\gcd (a,c)
gcd(a,c) 区分 “互质” 与 “不互质” 场景;
2.看指数:不互质时,判断
b
b
b 与
φ
(
c
)
\varphi (c)
φ(c) 的大小,决定是否补充
φ
(
c
)
\varphi (c)
φ(c);
3.按需降幂:结合快速幂算法,高效计算降幂后的指数幂取模结果。
欧拉降幂应用贯穿数论与计算机科学多领域,掌握其原理可深化对 “模运算”“欧拉函数” 的理解,为原根、离散对数等复杂数论问题打基础。其本质是 “简化模运算下的高次幂计算”,除 RSA 加密外,还覆盖数论计算、密码学其他领域、算法设计等方向(核心是** a ϕ ( m ) ≡ 1 ( m o d m ) a^{\phi (m)} \equiv 1 \pmod {m} aϕ(m)≡1(modm),其中 a a a 与 m m m 互质, ϕ \phi ϕ 是欧拉函数**)。
via:
- 欧拉降幂算法详解-优快云博客
https://blog.youkuaiyun.com/weixin_43238423/article/details/102705549 - 浅谈欧拉降幂 - ジャスミン - 博客园
https://www.cnblogs.com/jaszzz/p/12824619.html - ……
4063

被折叠的 条评论
为什么被折叠?



