欧几里得、扩展欧几里得和中国剩余定理
欧几里得算法、扩展欧几里得算法和中国剩余定理
欧几里得算法
求两个数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=imj。因为 ( 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 Mipi+miqi=1。
令 e i = M i p i e_i = M_i p_i ei=Mipi,有:
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} e1a1+e2a2+⋯+enan是方程的一个解
在 [ 0 , ∏ i = 1 n m i ) [0,\prod_{i=1}^{n}{m_i}) [0,∏i=1nmi)中只有唯一解,将求出的解对 ∏ i = 1 n m i \prod_{i=1}^{n}{m_i} ∏i=1nmi取模即可。
- 复杂度: 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;
}
欧几里得、扩展欧几里得和中国剩余定理相关推荐
- 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法
打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...
- 欧几里得 扩展欧几里得
欧几里得 & 扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1. 时间复杂度不高,和普通欧几里得一样: 2. 代 ...
- 中国剩余定理与扩展中国剩余定理
中国剩余定理又名孙子定理 用来求解同余线性方程组 其中m1,m2,m3-两两互质,求x的最小整数解: 设M为m1,m2,m3-的公倍数. 根据上面的推导,为什么x的通解形式是累加呢? 根据上面推导,推 ...
- 博客处女作:中国剩余定理与扩展中国剩余定理
各位好啊,这里是蒟蒻gigo_64的第一篇博客,,这里我们开始啦. 本文需要读者知晓扩展欧几里得,如果不会请点击这个大佬的链接;https://blog.csdn.net/sslz_fsy/artic ...
- 与数论的厮守04:扩展中国剩余定理
根据数论的尿性,一般的定理解决不了的问题怎么办?那就拓展一下呗. 我们先看中国剩余定理,它解决的是一堆同余方程:nΞa1(mod b1),nΞa2(mod b2)...nΞak(mod bk),其中b ...
- 扩展欧几里得算法与中国剩余定理
在<孙子算经>中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 这个问题说的是,有一件物品,我们不知道它的数量.但是,如果三个三个数,最后会剩下两个:如 ...
- 扩展欧几里得算法、乘法逆元与中国剩余定理
文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...
- 中国剩余定理及扩展中国剩余定理
目录 中国剩余定理CRT 扩展中国剩余定理ExCRT TJOI2009 猜数字 HDU 1573 X问题 中国剩余定理CRT 中国剩余定理是用来求线性同于方程组的. \[ \begin{aligned ...
- 【欧几里得扩展欧几里得】
欧几里得 LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);} 扩展欧几里得 int ex_gcd(int a,int b,int &x,int ...
- 欧几里得+扩展欧几里得+RSA
欧几里得算法: 就是辗转相除法,gcd(a,b)=gcd(b,a%b), 实现简单,用途广泛,模板如下: int gcd(int a,int b)//或者都取 long long {return b! ...
最新文章
- 如何使用Lombok来优雅的编码
- sqlplus中调用shell_(转)shell 调用sqlplus各种情况示例
- apache配置-html碎片shtml格式
- java名称服务_java – UnknownHostException:名称或服务未知
- java线程池读文件_多线程读取Java文件
- C#中的ref关键字
- 程序员因太过耿直,致苹果官网出现bug......
- 目录:软件评测师教程
- dubbo源码解析-cluster
- kali PHP网站渗透,小白日记35:kali渗透测试之Web渗透
- web中html+CSS修改背景图片的不透明度
- 跨考计算机专业怎么学,跨考计算机考研经验分享
- 百度砸120W年薪,只要这个专业,应届生也行!
- C++入门编程之成语接龙
- 在Windows下使用Python编程
- 计算机与现代化在线投稿,计算机与现代化审稿周期
- Unity导入资源解决报错
- Bluekeep(0708)漏洞利用发布:潘多拉盒子已经打开
- mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...
- CSDN排名第一和第二的人