首页 > 其他分享 >【知识点】拓展欧几里得与中国剩余定理

【知识点】拓展欧几里得与中国剩余定理

时间:2024-05-22 12:09:06浏览次数:12  
标签:知识点 gcd int 欧几里得 算法 定理 同余

在上一篇文章中,我们已经熟知了有关公约数和欧几里得算法的相关事宜。详情参见:欧几里得算法求最大公约数。本文将作为上篇文章内容的一个延续,简要阐述拓展欧几里得算法和中国剩余定理。

拓展欧几里得算法

拓展欧几里得算法(Extended Euclidian Algorithm),是欧几里得算法的扩展版本,用于在计算两个数的最大公约数 \(\gcd(a, b)\) 的同时,找到这两个整数的 贝祖系数(即这两个整数的线性组合等于其最大公约数的系数)。

举例而言,如果给定两个整数 \(a, b\),我们不仅可以找到这两个整数的最大公约数,还可以找到两个整数 \(x, y\),满足:

\[ax + by = \gcd(a, b) \]

与此同时,我们也将这个方程称之为 贝祖等式(Bézout's identity)。拓展欧几里得算法在数论和计算机应用方面有着极其突出的贡献和广泛的应用。例如求解线性同余方程,本文也将会围绕求解同余方程来展开。

线性同余方程

线性同余方程指的是形如 \(ax \equiv b \pmod m\) 的方程,其中 \(a\) 和 \(b\) 表示两个已知的整数常量,\(x\) 是需要求解的未知整数,符号 \(\equiv\) 表示同余关系,即等式两边同时对 \(m\) 取模结果相同。

具体地说,线性同余方程要求找到一个整数 \(x\),使得 \(ax\) 除以 \(m\) 所得的余数等于 \(b\),或者说 \(ax\) 与 \(b\) 对 \(m\) 取余后余数相等。该类型的问题通常存在唯一的解或者无解。

拓展欧几里得算法过程推导

拓展欧几里得算法与普通的欧几里得算法相同,都可以通过递归的方式来非常简便地计算出结果。

假设有两个非负整数 \(a\) 和 \(b\)(在满足 \(a \le b\) 的情况下),设 \(r = a \mod b\),那么根据欧几里得算法可以得出结论 \(\gcd(a, b) = \gcd(b, r)\)。根据欧几里得算法的推到过程,可以得到:

\[bx_1 + ry_1 = \gcd(b, r) \]

因为 \(r = a - \left\lfloor\frac{a}{b}\right\rfloor b\),所以代入推出:

\[\gcd(a, b) = bx_1 + (a - \left\lfloor\frac{a}{b}\right\rfloor b)y_1 \]

经过化简可以得到:

\[\gcd(a, b) = ay_1 + b(x_1 - \left\lfloor\frac{a}{b}\right\rfloor y_1) \]

由此可以看出,\(x = y_1\) 和 \(y = x_1 - \left\lfloor\frac{a}{b}\right\rfloor y_1\) 是符合原式的贝祖系数。

拓展欧几里得算法代码

int extended_gcd(int a, int b, int &x, int &y) {
    if (a == 0) {
        x = 0, y = 1;
        return b;
    }
    int x1, y1;
    int gcd = extended_gcd(b % a, a, x1, y1);
    x = y1 - (b / a) * x1;
    y = x1;
    return gcd;
}

参考上述代码,extended_gcd 函数接受两个整数 \(a\) 和 \(b,\)并计算它们的最大公约数,并通过引用参数 \(x\) 和 \(y\) 返回贝祖系数。

中国剩余定理背景

谈到了求解同余方程,那就不得不提 中国剩余定理(Chinese Remainder Theorem)。中国剩余定理又称“孙子定理”,最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做 “物不知数” 问题,原文如下(百度百科提供):

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。

中国剩余定理提供了一种在模数互素的情况下解决一组同余方程组的方法,而拓展欧几里得算法可以用来计算模数不互素的情况下的解。

中国剩余定理算法与推导

在中国剩余定理中,假设有一个同余方程组:

\[\begin{cases} x \equiv a_1 \pmod m_1\\ x \equiv a_2\pmod m_2\\ \vdots\\ x \equiv a_n\pmod m_n \end{cases} \]

其中,\(m_1, m_2, \cdots, m_n\) 两两互质。中国剩余定理告诉我们,以上方程存在唯一的一个解 \(x\),模数为 \(m_1, m_2, \cdots, m_n\)。

当模数不互素时,我们可以使用拓展欧几里得算法来辅助求解。具体步骤如下:

  1. 计算 \(M = m_1 \cdot m_2, \cdots, m_n\)。
  2. 对于每一个 \(i\),计算 \(M_i = \frac{M}{m_i}\)。
  3. 对于每个 \(i\),使用拓展欧几里得算法计算 \(M_i\) 在模 \(m_i\) 下的逆元 \(t_i\)。
  4. 最后的解 \(x\) 可以通过如下公式计算:\(x = \sum_{i=1}^{n} a_i M_i t_i \mod M\)。

中国剩余定理代码示例

int chinese_remainder_theorem(const vector<int> &a, const vector<int> &m) {
    int M = 1;
    for (int mi : m) {
        M *= mi;
    }
    
    int result = 0;
    for (size_t i = 0; i < a.size(); ++i) {
        int ai = a[i];
        int mi = m[i];
        int Mi = M / mi;
        int xi, yi;
        extended_gcd(Mi, mi, xi, yi);
        result = (result + ai * Mi * xi) % M;
    }
    
    // 保证结果为正
    if (result < 0) {
        result += M;
    }
    
    return result;
}

其中 a向量 和 b向量 分别表示余数数组和模数数组。

相关引用

  1. GeeksforGeeks. Euclidean Algorithms - Basic and Extended. GeeksforGeeks, https://www.geeksforgeeks.org/euclidean-algorithms-basic-and-extended/, accessed May 22, 2024.
  2. GeeksforGeeks. Introduction to Chinese Remainder Theorem. GeeksforGeeks, https://www.geeksforgeeks.org/introduction-to-chinese-remainder-theorem/, accessed May 22, 2024.
  3. cp-algorithms contributors. "Chinese Remainder Theorem." cp-algorithms, Oct 16, 2023, https://cp-algorithms.com/algebra/chinese-remainder-theorem.html. Accessed May 22, 2024.

标签:知识点,gcd,int,欧几里得,算法,定理,同余
From: https://www.cnblogs.com/Macw07/p/18205954

相关文章

  • 软考知识点整理-程序设计语言
    语义分析阶段:程序编译过程中,执行类型分析和检查语用分析阶段:表示构成语言的各个记号和使用者的关系程序设计语言的基本成分包括数据、运算、控制和传输枚举属于用户定义类型符号表是存储程序源代码中每个标识符和声明的信息动态查找表是查找key的值,若存在则返回位置,不存在就......
  • CF1278F Cards(斯特林数+二项式定理)
    题意简述有\(m\)张牌,其中有一张是王牌。你现在可以洗\(n\)次牌(每种牌堆序列等概率出现),然后查看牌堆顶的第一张牌。设\(x\)为\(n\)次洗牌中第一张牌是王牌的次数,则得分为\(x^k\)。求得分的期望值对\(998244353\)取模的值。\(1\len,m<998244353,k\le5000\)分析将......
  • salesforce零基础学习(一百三十八)零碎知识点小总结(十)
    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_5level_SOQLqueries.htm&release=250&type=5https://developer.salesforce.com/tools/vscode/en/einstein/einstein-overviewhttps://developer.salesforce.com/tools/vscode/en/user-g......
  • 数据库中了解的知识点:视图、触发器、事务、存储过程、函数、流程控制、索引
    【视图】1什么是视图?2视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接用3其实视图也是表45为什么要用视图?6如果要频繁的操作一张虚拟表,就可以制作成视图,下次可以直接操作78如何操作9#固定语法10createview......
  • 《Linux程序设计》各章知识点梳理
    《Linux程序设计》各章知识点梳理第1章软件包的管理方式方面,Ubuntu、CentOS的差异如何添加一个新用户?useradduser1什么是Shell?Shell是系统的用户界面,提供了用户与内核进行监护操作的一种接口。它接受用户输入的命令并把它们送去内核去执行。实际上Shell是一个命令......
  • salesforce零基础学习(一百三十七)零碎知识点小总结(九)
    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_conditional_visibiliy_tab.htm&release=250&type=5https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_automation_lightning_app.htm&release=......
  • 大数定律与中心极限定理
    Markov&ChebyshevInequality示性函数\[\mathbb{I}(A)=\begin{cases}1,&A\text{happen}\\0,&A\text{nothappen}\end{cases}\]对于事件\(A\),如果对于样本点\(\omega\)有示性函数\[I_A(\omega)=\begin{cases}1,&\omega\inA\\0......
  • 欧拉函数、整除分块和扩展欧几里得
    欧拉函数欧拉函数(写作\(\varphi(x)\)),表示\(i\in[1,x]且\gcd(i,x)=1\)的\(i\)的数量。乍一看好像很难求,但我们先考虑最简单的情况,即\(x\in\mathbb{P}\)(\(\mathbb{P}\)表示质数集)的情况。首先很容易看出\(\varphi(x)=x-1\),因为\(x\in\mathbb{P}\),所以\(\foralli......
  • webpack相关知识点
    一、webpack打包过程。首先读取配置文件,确定入口文件及其依赖关系,然后,从入口文件开始,递归解析所有模块,通过相应的加载器(loaders)处理不同类型的文件内容,如Javascript、css等。接着,使用插件(plugins)执行额外的任务,如代码压缩、环境变量注入等。最后,将处理后的模块按照指定的格式......
  • 费马小定理 逆元 期望dp
    p8774include<bits/stdc++.h>usingnamespacestd;defineintlonglongdefinef(i,a,b)for(inti=(a);i<=(b);i++)definecl(i,n)i.clear(),i.resize(n);defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;type......