欧拉定理 & 扩展欧拉定理

观前提醒:「文章仅供学习和参考,如有问题请在评论区提出」


前置#


剩余类(同余类)#


给定一个正整数 n ,把所有的整数根据n 的余数 r[0,n1] 分为 n 类,每一类就可以被表示为 Cr=nx+r 。那么这类数所构成的集合就称为n 的剩余类


完全剩余系(完系)#


给定一个正整数 n ,有 n 个不同的模 n 的剩余类(因为余数 r[0,n1] )。

从这 n 个不同的剩余类中各取出一个元素,总共 n 个数,将这些数构成一个新的集合,则称这个集合为n 的完全剩余系

例如:n=5 时,{0,1,2,3,4}{5,1,3,8,9} 都是一个模 5 的完全剩余系。

因为他们都有 5 个不同的模 5 的剩余类 r[0,4]


简化剩余系(缩系)#


给定一个正整数 n ,有 φ(n) 个不同的模 n 的余数 rn 互质的剩余类。

从这 φ(n) 个剩余类中各取出一个元素,总共 φ(n) 个数,将这些数构成一个新的集合,则称这个集合为模 n 的简化剩余系。

φ(n) 为欧拉函数,1n 中与 n 互质的数的个数。

例如:n=5 时,{1,2,3,4} 是一个模 5 的简化剩余系。n=10 时,1,3,7,9 是一个模 10 的简化剩余系。

显然,n 的简化剩余系中所有的数都与 n 互质


欧拉函数#


1nn 互质的数的个数称为欧拉函数,记作 φ(n)

(1)n=p1a1p2a2p3a3...pkak(2)φ(n)=n×i=1kpi1pi


欧拉定理#


定义:若 gcd(a,n)=1 ,则 aφ(n)1(modn)

证明

{r1,r2,...rφ(n)} 是一个模 n 的简化剩余系。

那么 ri 就是和 n 互质,又因为 gcd(a,n)=1 ,所以 an 也是互质的。

那么 {ar1,ar2,...arφ(n)} 也是一个模 n 的简化剩余系。所以

(3)i=1φ(n)rii=1φ(n)ari(modn)(4)i=1φ(n)riaφ(n)i=1φ(n)ri(modn)(5)aφ(n)1(modn)


扩展欧拉定理#


ab={ab,b<φ(m),mod(m)abmodφ(m)+φ(m),bφ(m),mod(m)


P5091 【模板】扩展欧拉定理 - 洛谷

给定三个正整数 a,b,m ,求 abmodm

1a109,1m109,1b1020000000

可以根据扩展欧拉定理,当 b<φ(m) 时,用快速幂求解,当 bφ(m) 时,通过定理进行降幂,然后再用快速幂求解。

实现代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

// 快速幂, a ^ k % p
int qmi(int a, int k, int p) {
    int res = 1;
    while (k) {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}

// 求 n 的欧拉函数
int get_phi(int n) {
    int res = n;
    for (int i = 2; i <= n / i; i++) {
        if (n % i == 0) {
            while (n % i == 0) n /= i;
            res = res / i * (i - 1);
        }
    }
    if (n > 1) res = res / n * (n - 1);
    return res;
}

// 对 b 进行降幂
int de_pow(string s, int phi) {
    int res = 0;
    bool flag = false;
    for (int i = 0; s[i]; i++) {
        res = res * 10 + s[i] - '0';
        if (res >= phi) flag = true, res %= phi;
    }
    if (flag) res += phi;
    return res;
}

int main() {
    int a, m;
    string b;
    cin >> a >> m >> b;

    int phi = get_phi(m);
    int B = de_pow(b, phi);
    cout << qmi(a, B, m) << "\n";

    return 0;
}

参考资料#


522 剩余系 欧拉定理 扩展欧拉定理_董晓算法

作者:Oneway

出处:https://www.cnblogs.com/oneway10101/p/17627733.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Oneway`  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示