欧几里得算法、扩展欧几里得算法和中国剩余定理

欧几里得算法

求两个数a, b的最大公约数 g c d ( a , b ) gcd(a, b) gcd(a,b)

根据 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b) = gcd(b, a\mod{b}) gcd(a,b)=gcd(b,amodb)

  • 复杂度: O ( log ⁡ N ) O(\log N) O(logN),其中N和a,b同阶
  • 参数: a , b a, b a,b 两个整数
  • 返回: g c d ( a , b ) gcd(a,b) gcd(a,b)

递归

int gcd(int a, int b) {if (b == 0)return a;elsereturn gcd(b, a % b);
}

递推

int gcd(int a, int b) {int t;while (b != 0) {t = a % b;a = b;b = t;}return a;
}

扩展欧几里得算法

求解二元一次不定方程: a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)

  • 复杂度: O ( log ⁡ N ) O(\log N) O(logN),其中N和a,b同阶
  • 参数:
    • a , b a, b a,b 两个整数
    • x , y x, y x,y 引用,二元一次不定方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组解
  • 返回: g c d ( a , b ) gcd(a,b) gcd(a,b)

递归

int egcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1;y = 0;return a;} else {int q = egcd(b, a % b, y, x);y -= a / b * x;return q;}
}

递推

int egcd(int a, int b, int &x, int &y) {int x0, y0, x1, y1;x0 = 1; y0 = 0;x1 = 0; y1 = 1;x = 0; y = 1;int r = a % b;int q = (a - r) / b;while (r) {x = x0 - q * x1; y = y0 - q * y1;x0 = x1; y0 = y1;x1 = x; y1 = y;a = b; b = r; r = a % b;q = (a - r) / b;}return b;
}

中国剩余定理

中国剩余定理(Chinese Remainder Theorem,CRT)又称孙子定理,是数论中的一个定理。

古典数学问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

白话文就是:某物的数量除以3余2,除以5余3,除以7余2,某物的数量是多少?

答案:23

求出方程组 x ≡ a i ( m o d m i ) x \equiv a_i (\mod{m_i}) x≡ai​(modmi​) ( 1 ⩽ i ⩽ n ) (1 \leqslant i \leqslant n) (1⩽i⩽n)的解 x x x。其中 m 1 , m 2 , m 3 , . . . , m n m_1, m_2,m_3,...,m_{n} m1​,m2​,m3​,...,mn​两两互质。

令 M i = ∏ j ≠ i m j M_i=\prod_{j\neq i}^{}{m_j} Mi​=∏j​=i​mj​。因为 ( M i , m i ) = 1 (M_i,m_i)=1 (Mi​,mi​)=1,故存在 p i p_i pi​和 q i q_i qi​,使得 M i p i + m i q i = 1 M_i p_i + m_i q_i = 1 Mi​pi​+mi​qi​=1。

令 e i = M i p i e_i = M_i p_i ei​=Mi​pi​,有:
e i ≡ { 0 ( m o d m j ) j ≠ i 1 ( m o d m j ) j = i e_i \equiv \begin{cases} 0(\mod{m_j}) & j \neq i \\ 1(\mod{m_j}) & j = i \end{cases} ei​≡{0(modmj​)1(modmj​)​j​=ij=i​
故 e 1 a 1 + e 2 a 2 + ⋯ + e n a n e_1 a_1 + e_2 a_2 + \cdots + e_{n}a_{n} e1​a1​+e2​a2​+⋯+en​an​是方程的一个解

在 [ 0 , ∏ i = 1 n m i ) [0,\prod_{i=1}^{n}{m_i}) [0,∏i=1n​mi​)中只有唯一解,将求出的解对 ∏ i = 1 n m i \prod_{i=1}^{n}{m_i} ∏i=1n​mi​取模即可。

  • 复杂度: O ( n log ⁡ m ) O(n \log m) O(nlogm) 其中 m m m和每个 m i m_i mi​同阶
  • 参数:
    • a , m a,m a,m 第 i i i个方程表示为 x ≡ a i ( m o d m i ) x \equiv a_i (\mod{m_i}) x≡ai​(modmi​)
    • n n n 方程个数
  • 返回:一个解
int CRT(int a[], int m[], int n) {int M = 1;for (int i = 0; i < n; i++)M *= m[i];int X = 0;for (int i = 0; i < n; i++) {int Mi = M / m[i];int x, y;egcd(Mi, m[i], x, y);X += a[i] * Mi * x;}return X %= M;
}

欧几里得、扩展欧几里得和中国剩余定理相关推荐

  1. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  2. 欧几里得 扩展欧几里得

    欧几里得  &  扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1.    时间复杂度不高,和普通欧几里得一样: 2.    代 ...

  3. 中国剩余定理与扩展中国剩余定理

    中国剩余定理又名孙子定理 用来求解同余线性方程组 其中m1,m2,m3-两两互质,求x的最小整数解: 设M为m1,m2,m3-的公倍数. 根据上面的推导,为什么x的通解形式是累加呢? 根据上面推导,推 ...

  4. 博客处女作:中国剩余定理与扩展中国剩余定理

    各位好啊,这里是蒟蒻gigo_64的第一篇博客,,这里我们开始啦. 本文需要读者知晓扩展欧几里得,如果不会请点击这个大佬的链接;https://blog.csdn.net/sslz_fsy/artic ...

  5. 与数论的厮守04:扩展中国剩余定理

    根据数论的尿性,一般的定理解决不了的问题怎么办?那就拓展一下呗. 我们先看中国剩余定理,它解决的是一堆同余方程:nΞa1(mod b1),nΞa2(mod b2)...nΞak(mod bk),其中b ...

  6. 扩展欧几里得算法与中国剩余定理

    在<孙子算经>中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 这个问题说的是,有一件物品,我们不知道它的数量.但是,如果三个三个数,最后会剩下两个:如 ...

  7. 扩展欧几里得算法、乘法逆元与中国剩余定理

    文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...

  8. 中国剩余定理及扩展中国剩余定理

    目录 中国剩余定理CRT 扩展中国剩余定理ExCRT TJOI2009 猜数字 HDU 1573 X问题 中国剩余定理CRT 中国剩余定理是用来求线性同于方程组的. \[ \begin{aligned ...

  9. 【欧几里得扩展欧几里得】

    欧几里得 LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);} 扩展欧几里得 int ex_gcd(int a,int b,int &x,int ...

  10. 欧几里得+扩展欧几里得+RSA

    欧几里得算法: 就是辗转相除法,gcd(a,b)=gcd(b,a%b), 实现简单,用途广泛,模板如下: int gcd(int a,int b)//或者都取 long long {return b! ...

最新文章

  1. 如何使用Lombok来优雅的编码
  2. sqlplus中调用shell_(转)shell 调用sqlplus各种情况示例
  3. apache配置-html碎片shtml格式
  4. java名称服务_java – UnknownHostException:名称或服务未知
  5. java线程池读文件_多线程读取Java文件
  6. C#中的ref关键字
  7. 程序员因太过耿直,致苹果官网出现bug......
  8. 目录:软件评测师教程
  9. dubbo源码解析-cluster
  10. kali PHP网站渗透,小白日记35:kali渗透测试之Web渗透
  11. web中html+CSS修改背景图片的不透明度
  12. 跨考计算机专业怎么学,跨考计算机考研经验分享
  13. 百度砸120W年薪,只要这个专业,应届生也行!
  14. C++入门编程之成语接龙
  15. 在Windows下使用Python编程
  16. 计算机与现代化在线投稿,计算机与现代化审稿周期
  17. Unity导入资源解决报错
  18. Bluekeep(0708)漏洞利用发布:潘多拉盒子已经打开
  19. mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. CSDN排名第一和第二的人

热门文章

  1. 【电设】常见线性稳压电源设计 - 基本并联稳压电源-稳压二极管
  2. Linux 使用 sed 整行(列)刪除
  3. 简单的java实现分解质因数。
  4. javaee实训报告总结_JavaEE实训报告.doc
  5. 基于FRP反向代理工具实现内网穿透攻击
  6. 公司章程如何设计规避股权纠纷
  7. vue3全局变量定义使用
  8. 单片机P0口的AD0-7是什么意思
  9. 强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
  10. 杰理之 MIC录音 vbat电压低于3.2v会有很强的底噪?【篇】