欧拉降幂 | 公式 / 例题分析 / 代码实现

注:本文为 “欧拉降幂” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。


详解欧拉降幂

狠人王 原创于 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=1n(1pi1)

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 降幂:

  1. 计算 c c c 的欧拉函数值 ϕ ( c ) \phi(c) ϕ(c)
  2. 将字符串形式的 b b b 转换为数值,并对 ϕ ( c ) \phi(c) ϕ(c) 取余,得到降幂后的指数 b ′ = b m o d    ϕ ( c ) b' = b \mod \phi(c) b=bmodϕ(c)
  3. 由于欧拉降幂公式的约束,需补充 ϕ ( c ) \phi(c) ϕ(c) b ′ b' b(即 b ′ + ϕ ( c ) b' + \phi(c) b+ϕ(c)),确保结果正确性;
  4. 调用快速幂计算 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} abab%ϕ(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} ababmodϕ(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} ababmodϕ(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} ababmodϕ(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} abab(modc)指数较小,无需降幂,直接计算

3 典型例题解析:求 2 ( 2 ( 2 ( 2 … ) ) ) m o d    p 2^{(2^{(2^{(2^{\dots})})})} \mod p 2(2(2(2)))modp(无限嵌套指数)

3.1 问题分析

该问题为无限嵌套的指数运算,无法直接计算外层指数,需通过递归+欧拉降幂逐层简化:

  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 ( 2 … ) = f ( ϕ ( p ) ) + ϕ ( p ) 2^{(2^{\dots})} = f(\phi(p)) + \phi(p) 2(2)=f(ϕ(p))+ϕ(p)(因内层指数必然 ≥ ϕ ( p ) \geq \phi(p) ϕ(p));
  3. 递归边界:当 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 222modp,可按以下步骤进行:

步骤1:分解 p p p

p = 2 k ⋅ q p = 2^k \cdot q p=2kq,其中 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 222modp 开始,结合 p = 2 k ⋅ q p = 2^k \cdot q p=2kq,可将其改写为:
2 k ( 2 2 2 ⋅ ⋅ ⋅ − k   m o d   q ) 2^k \left(2^{2^{2^{\cdot^{\cdot^{\cdot}}}-k}} \bmod q\right) 2k(222kmodq)
这里 2 2 2 ⋅ ⋅ ⋅ − k   m o d   q 2^{2^{2^{\cdot^{\cdot^{\cdot}}}-k}} \bmod q 222kmodq 聚焦于指数部分对奇数 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(22k)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 c2(若 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 的质因数分解,具体步骤如下:

  1. 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=p1k1p2k2pnkn(其中 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 为正整数);
  2. 代入欧拉函数公式:
    φ ( 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(1p11)(1p21)(1pn1)

示例

  • 计算 φ ( 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×(121)×(131)=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×(171)=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) 0r<φ(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))kar1kar=ar(modc)

示例

计算 3 100 m o d    7 3^{100} \mod 7 3100mod7

  1. 判断互质关系: gcd ⁡ ( 3 , 7 ) = 1 \gcd(3,7)=1 gcd(3,7)=1,满足场景1条件;
  2. 计算欧拉函数: φ ( 7 ) = 6 \varphi(7)=6 φ(7)=6(7为质数);
  3. 降幂指数: 100 m o d    6 = 4 100 \mod 6 = 4 100mod6=4
  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=p1k1p2k2pnkn,对每个质幂 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}} ababmodφ(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

  1. 判断互质关系与指数大小: 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 102,满足场景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
  3. 计算结果: 4 2 m o d    6 = 16 m o d    6 = 4 4^2 \mod 6 = 16 \mod 6 = 4 42mod6=16mod6=4
  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

  1. 判断互质关系与指数大小: 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条件;
  2. 直接计算结果: 6 1 m o d    4 = 2 6^1 \mod 4 = 2 61mod4=2
  3. 反例验证:若强行用场景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 互质)的证明

  1. 构造既约剩余系:设 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 不同余);
  2. 剩余系的封闭性:因 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} ariarj(modc),则 r i ≡ r j ( m o d c ) r_i \equiv r_j \pmod{c} rirj(modc),与 S S S 元素互异矛盾;且 gcd ⁡ ( a r i , c ) = 1 \gcd(a r_i, c)=1 gcd(ari,c)=1);
  3. 乘积同余:由于 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))r1r2rφ(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)(r1r2rφ(c))r1r2rφ(c)(modc)
  4. 消去乘积项:因 gcd ⁡ ( r 1 r 2 … r φ ( c ) , c ) = 1 \gcd(r_1 r_2 \dots r_{\varphi(c)}, c)=1 gcd(r1r2rφ(c),c)=1,两边可约去乘积项,得 a φ ( c ) ≡ 1 ( m o d c ) a^{\varphi(c)} \equiv 1 \pmod{c} aφ(c)1(modc)(欧拉定理);
  5. 指数拆分:设 b = k ⋅ φ ( c ) + r b = k \cdot \varphi(c) + r b=kφ(c)+r 0 ≤ r < φ ( c ) 0 \leq r < \varphi(c) 0r<φ(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))kar1kar=ar=abmodφ(c)(modc),证毕。

3.2 场景2( a a a c c c 不互质且 b ≥ φ ( c ) b \geq \varphi(c) bφ(c))的证明

  1. 质幂模分解:将 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=p1k1p2k2pnkn,需证明对每个质幂 p i k i p_i^{k_i} piki,公式成立(中国剩余定理:若对所有质幂模成立,则对 c c c 成立);
  2. 单个质幂模的分析:取任意质幂 p k p^k pk,设 a = p t ⋅ s a = p^t \cdot s a=pts t ≥ 1 t \geq 1 t1 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} ababmodφ(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)=pkpk1=pk1(p1)
    • 指数条件:因 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)=pk1(p1)k(对 p ≥ 2 , k ≥ 1 p \geq 2, k \geq 1 p2,k1 成立),故 a b = p t b ⋅ s b a^b = p^{t b} \cdot s^b ab=ptbsb t b ≥ t k ≥ k t b \geq t k \geq k tbtkk t ≥ 1 t \geq 1 t1),因此 a b ≡ 0 ( m o d p k ) a^b \equiv 0 \pmod{p^k} ab0(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} ababmodφ(pk)+φ(pk)(modpk)
  3. 组合结果:由中国剩余定理,对所有 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} abar(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(abr1)0(modc)

b < φ ( c ) b < \varphi(c) b<φ(c) b − r < φ ( c ) b - r < \varphi(c) br<φ(c),而 a a a c c c 不互质, a b − r − 1 a^{b - r} - 1 abr1 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} 12(mod4))。

因此,场景3无法降幂,只能直接计算,证毕。

四、欧拉降幂公式的实战应用

4.1 实际计算步骤

遇到 a b m o d    c a^b \mod c abmodc b b b 极大)时,按以下步骤选择公式,确保无遗漏:

  1. 第一步:计算基础量
    • 计算 gcd ⁡ ( a , c ) \gcd(a, c) gcd(a,c),判断 a a a c c c 是否互质;
    • 计算 φ ( c ) \varphi(c) φ(c)(需先对 c c c 质因数分解);
  2. 第二步:根据场景选择公式
    • 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(直接计算);
  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)(r1)/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)=(p1)(q1)),可将指数降为 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
    1. 计算 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×(11/3)×(11/5)=8);
    2. 降幂指数: 1000000000000 m o d    8 = 0 1000000000000 \mod 8 = 0 1000000000000mod8=0(场景1公式);
    3. 快速幂计算: 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)

  1. 递归步骤: 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)=6f(6)φ(6)=2f(2)φ(2)=1f(1)=0
  2. 回溯计算:
    • 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
  3. 最终结果: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 c2);
2. 无互质强制要求(分场景处理)
核心公式 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap11(modp)(降幂形式: a b ≡ a b m o d    ( p − 1 ) ( m o d p ) a^b \equiv a^{b \mod (p-1)} \pmod{p} ababmod(p1)(modp)分3场景(见第二章),当 c = p c=p c=p(质数)且 gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 时,退化为费马小定理
本质质数模下的指数周期性结论(周期为 p − 1 p-1 p1任意模下的通用降幂工具(周期为 φ ( 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} 361(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} ad1(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} ababmodd(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=81mod7,且无更小正整数满足), 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×(11/2)×(11/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×(11/2)×(11/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) (11/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=22562323296+2321 k k k n n n 时,先算 k ′ = k m o d    n k'=k \mod n k=kmodn 再算 k ′ P k'P kP,结果一致且效率更高。
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=(gu1yu2modp)modq”( g g g 为模 p p p 原根, q q q p − 1 p-1 p1 大素因子, k 、 u 1 、 u 2 k、u1、u2 ku1u2 为大整数)。

  • 原理:由 g q ≡ 1 ( m o d p ) g^q \equiv 1 \pmod {p} gq1(modp)(原根性质,对应欧拉定理 g ϕ ( p ) = g p − 1 ≡ 1 ( m o d p ) g^{\phi (p)}=g^{p-1} \equiv 1 \pmod {p} gϕ(p)=gp11(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 gkmodp,结果不变。
  • 作用: 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 ab 为私钥)。

  • 原理:由欧拉定理 g p − 1 ≡ 1 ( m o d p ) g^{p-1} \equiv 1 \pmod {p} gp11(modp) ϕ ( p ) = p − 1 \phi (p)=p-1 ϕ(p)=p1), a b ab ab 为极大指数(如 a 、 b a、b ab 均为 2048 位, a b ab ab 为 4096 位)时,可降幂 a b m o d    ( p − 1 ) ab \mod (p-1) abmod(p1),即 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} gabgabmod(p1)(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 会溢出,欧拉降幂可通过 “降指数” 高效计算。

  • 分情况应用(完整公式):
    1. 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} ababmodϕ(m)(modm)
    2. 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} ababmodϕ(m)+ϕ(m)(modm)
    3. 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×(11/3)×(11/5)=8
    第二步:2 与 15 互质且 1000 ≥ 8 1000 \geq 8 10008,降幂得 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} 210001(mod15)
2. 素性测试(如 Miller-Rabin 测试)

Miller-Rabin 测试是常用 “概率性素性测试”,核心依赖费马小定理(欧拉定理特殊情况, m m m 为素数时 ϕ ( m ) = m − 1 \phi (m)=m-1 ϕ(m)=m1,即 a m − 1 ≡ 1 ( m o d m ) a^{m-1} \equiv 1 \pmod {m} am11(modm)),欧拉降幂可简化高次幂计算。

  • 测试步骤(简化版):
    1. 奇数 n n n(待测试数)写成 n − 1 = d × 2 s n-1 = d × 2^s n1=d×2s
    2. 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
    3. x = 1 x=1 x=1 x = n − 1 x=n-1 x=n1 n n n 可能为素数;否则重复算 x = x 2 m o d    n x = x^2 \mod n x=x2modn(共 s − 1 s-1 s1 次),始终不为 n − 1 n-1 n1 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} 3k1(mod7)
    解: ϕ ( 7 ) = 6 \phi (7)=6 ϕ(7)=6,3 与 7 互质,故 3 6 ≡ 1 ( m o d 7 ) 3^6 \equiv1 \pmod {7} 361(mod7),最小 k k k 是 6 的约数(1,2,3,6)。验证得 3 3 = 27 ≡ 6 ( m o d 7 ) 3^3=27 \equiv6 \pmod {7} 33=276(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)262=361(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×(11/2)×(11/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=1255(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)=p1,可降为 x k m o d    ( p − 1 ) m o d    p x^{k \mod (p-1)} \mod p xkmod(p1)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 abc 为参数, 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) 0r<ϕ(m)),则 a b ≡ a r m o d    m a^b \equiv a^r \mod m abarmodm(若 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:

【事件触发一致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发一致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的一致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备一定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成一致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开,重点研究其动力学建模与控制系统设计。通过Matlab代码与Simulink仿真实现,详细阐述了该类无人机的运动学与动力学模型构建过程,分析了螺旋桨倾斜机构如何提升无人机的全向机动能力与姿态控制性能,并设计相应的控制策略以实现稳定飞行与精确轨迹跟踪。文中涵盖了从系统建模、控制器设计到仿真验证的完整流程,突出了全驱动结构相较于传统四旋翼在欠驱动问题上的优势。; 适合人群:具备一定控制理论基础和Matlab/Simulink使用经验的自动化、航空航天及相关专业的研究生、科研人员或无人机开发工程师。; 使用场景及目标:①学习全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真技术;③深入理解螺旋桨倾斜机构对飞行性能的影响及其控制实现;④为相关课题研究或工程开发提供可复现的技术参考与代码支持。; 阅读建议:建议读者结合提供的Matlab代码与Simulink模型,逐步跟进文档中的建模与控制设计步骤,动手实践仿真过程,以加深对全驱动无人机控制原理的理解,并可根据实际需求对模型与控制器进行修改与优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值