欧几里得

扩展欧几里得定律

北城以北 提交于 2019-11-30 23:21:47
扩展欧几里得所能求的东西:不定方程的某一整数解,同余方程,乘法逆元 首先了解一个性质(裴蜀定理):ax+by=c 有整数解当且仅当c为gcd(a,b)的倍数 然后是两个预备知识:gcd(a,b)=gcd(b,a%b) a%b=a-a/b*b(此处/表示整除) 不定方程的解: 不妨设a>b 另ax 1 +by 1 =gcd(a,b) bx 2 +(a%b)y 2 =gcd(b,a%b) 因为gcd(a,b)=gcd(b,a%b) 所以 ax 1 +by 1 =bx 2 +(a%b)y 2 因为a%b=a-a/b*b 所以ax 1 +by 1 =ay 2 +b(x 2 -(a/b)*y 2 ) 所以x1=y2 ; y1=x2-(a/b)*y2 这样就可以递归处理 显然当b=0时为边界条件 我们令当b=0时 x=1 y=0 然后慢慢回溯 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #define int long long using namespace std; int exgcd(int a,int b,int &x,int &y) { int d,t; if(b==0) { x=1;y=0; return a; } d=exgcd(b,a

扩展欧几里得算法+Python代码

ε祈祈猫儿з 提交于 2019-11-30 22:28:22
算法原理 Python代码 def myExtGCD(a, b): """ a: 模的取值 b: 想求逆的值 """ if (b == 0): return 1, 0, a x, y, gcd = myExtGCD(b, a % b) return y, x-a//b*y, gcd print(myExtGCD(71, 7)[1] % 71) 参考文献 https://blog.csdn.net/zhjchengfeng5/article/details/7786595 来源: https://www.cnblogs.com/kexve/p/11642861.html

非递归的扩展欧几里得算法

一个人想着一个人 提交于 2019-11-30 20:20:03
$\DeclareMathOperator{\extgcd}{extgcd}$ 作者按:写这篇随笔是为了解释 tourist 的逆元模板 template <typename T> T inverse(T a, T m) { T u = 0, v = 1; while (a != 0) { T t = m / a; m -= t * a; swap(a, m); u -= t * v; swap(u, v); } assert(m == 1); return u; // 注意:u 可能为负数 } 一般的扩展欧几里德算法是求 $x, y$ 使得 $ax + by = \gcd(a,b)$ 。若 $a$ 和 $m$ 互素,扩展欧几里得算法可以用来求 $a$ 在模 $m$ 下的逆元,常见的实现如下 int extgcd(int a, int b, int& x, int& y) { int d = a; if (b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else { x = 1; y = 0; } return d; } int mod_inverse(int a, int m) { int x, int y; extgcd(a, m, x, y); return (m + x % m) % m; } 求 $a$

扩展欧几里得算法

吃可爱长大的小学妹 提交于 2019-11-30 00:35:27
#include <iostream> #include <stdio.h> using namespace std; int exgcd(int a,int b,int &x,int &y) { if(b==0) { //1的情况 x=1; y=0; return a; } int r=exgcd(b, a%b, x, y); int t=y; y=x-(a/b)*y; //2的情况 x=t; return r; } int main() { int x,y; exgcd(252,198, x, y); cout<<"252x+198y=18的一个整数解为:"<<endl; cout<<"x="<<x<<" "<<"y="<<y<<" "<<endl; return 0; } 来源: https://blog.csdn.net/qq_37765455/article/details/100980827

扩展欧几里得算法详解(exgcd)

牧云@^-^@ 提交于 2019-11-29 17:24:40
一、前言 本博客适合已经学会欧几里得算法的人食用~~~ 二、扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做 贝祖定理 的玄学定理: 即如果a、b是整数,那么一定存在整数x、y使得$ax+by=gcd(a,b)$。 通俗的说就是:如果$ax+by=c$有解,那么$c\%gcd(a,b)=0$ 来源: https://www.cnblogs.com/szmssf/p/11524295.html

题解 P1292 【倒酒】

坚强是说给别人听的谎言 提交于 2019-11-29 05:05:29
欧几里得与扩展欧几里得 博客食用 , 效果更佳: 欧几里得 与 扩展欧几里得 - 核融合炉心 - 洛谷博客 以下,是本题需要的所有前置知识(大概吧wwww), 如果您已经学会了所有的前置知识, 请忽略 \(Baka\) 阿空的废话 直接看关于本题的内容 目录: 1.欧几里得定理 证明 应用 2.裴蜀定理 3.扩展欧几里得 证明 求解线性不定方程 4.关于本题 1.欧几里得定理: 即 : \(\large gcd(a,b) = gcd(b,a\mod b)\) 当 \(b=0\) 时, \(gcd(a,b)= \mid a\mid\) ; 感谢cyh学长给的证明 : 设 : \(a,b\) 的最大公约数为 \(c\) 则 : \(a=nc\ ,\ b=mc\) , \((n,m \in Z)\) , \(a=k\times b + r\) 则 : \(r=a\%b=a-k b=nc-kmc=(n-km)c\) 若要使 \((a,b) = (b,a\%b)\) , 则需要证 : \(b , r\) 的最大公约数也为 \(c\) , 即 : \(b=mc , r=(n-km)c\) 中 , \(m,(n-km)\) 互质 。 子证明: 用反证法 , 设存在 \(d\) 为 \(m,(n-km)\) 的最大公约数,且 \(d > 1\) 。 设 : \(n-km=qd\) , \(m=pd

数论知识整理

淺唱寂寞╮ 提交于 2019-11-29 05:04:21
\[ \large \text { 数论知识目录 及 前置知识:} \] \(gyh\) 实在是太 ⑨ 了,没脑子的他只能整理在这里: 如果以下内容中存在错误 , 请及时通知博主 , 博主会非常感谢您的指正 , 并欢迎您把蠢货博主的头 拧下来 天真的 \(gyh\) 以为写一篇 基础数论知识整理 ,一篇 进阶数论知识整理 就可以囊括所有的数论知识了 , 但是他错了 于是就有了这篇文章,来更条理地整理数论知识。 于 \(2019.5.15\) 创建 于 \(2019.5.16\) 更新了 约数:欧拉函数,约数和 于 \(2019.5.19\) 更新了 欧几里得 与 扩展欧几里得:求解同余方程组 \[ \text{从此开始,一个天文单位} \] \[ \downarrow \]   前置知识: 取整函数 : 下取整: $\lfloor x\rfloor = $不大于 \(x\) 的最大整数 。 例: \(\lfloor 5.5\rfloor = 5\) , \(\lfloor -1.5\rfloor = -2\) . 上取整: $\lceil x \rceil = $ 不小于 \(x\) 的最小整数 。 例: \(\lceil 5.5 \rceil = 6\) , \(\lceil -1.5\rceil = -1\) . 整除: 定义 : 如果 \(a\) 是 \(p\) 的倍数 ,则

算法设计与分析——习题一

南楼画角 提交于 2019-11-29 04:07:48
习题 1 1.1. 用于计算 gcd(m,n) 的欧几里得算法 1.1.1. 算法描述 辗转相除法,又名欧几里得算法( Euclidean algorithm ),是求最大公约数 (greater common divisor) 的一种,通常做法是:用较小的数去除较大的数,用第二余数再去除第一余数,最终我们可以得到最终的余数为 0 以及最大公约数。 1.1.2. 伪代码 Euclid(m,n) //使用Euclid计算gcd(m,n) //输入:两个不全为0的非负整数m,n //输出:m,n的最大公约数 while n≠0 do r ← m mod n m← n n ← r return m 1.1.3. 算法实现 int Euclid(int m,int n){ int r; while(n!=0){ r=m%n; m=n; n=r; } return m; } 1.2. 用于计算 gcd(m,n) 的连续检测算法 1.2.1. 算法描述 连续监测算法,是求最大公约数的一种,通常做法是:从 1 到自己本身进行遍历,如果说能够被整除,那么将这个数进行返回。 1.2.2. 伪代码 ContinuesMonitor(m,n) //使用ContinuesMonitor计算gcd(m,n) //输入:两个不全为0的非负整数m,n //输出:m,n的最大公约数 for i 1 to n by

扩展欧几里得总结

痴心易碎 提交于 2019-11-28 23:05:59
https://blog.csdn.net/destiny1507/article/details/81750874 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int exgcd(int a,int b,int &x,int &y) { if(b == 0){ x = 1; y = 0; return a; } int r = exgcd(b, a % b, x, y); int temp = y; y = x - (a / b) * y; x = temp; return r; } int main() { int a, b; cin >> a >> b; int x, y; int d = exgcd(a, b, x, y); cout << x << " " << y << " " << d << endl; return 0; } 来源: https://www.cnblogs.com/solvit/p/11432724.html