首页 > 其他分享 >扩展欧几里得(exgcd)通解及其证明

扩展欧几里得(exgcd)通解及其证明

时间:2024-03-24 21:47:18浏览次数:28  
标签:gcd 欧几里得 exgcd 通解 整数 y0 x0

exgcd求ax + by = gcd(a, b)中x和y的通解(下面简称通解)

什么是通解
我们知道二元一次方程, 是如果只有一个式子, 那么解会有无数个 
而通解就是指让我们只找到一个解就可以推出其他所有解的式子
(注意本证明极其复杂, 请直接背模版或感性理解)

知道了定义下面就是推式子了
首先设x, y是ax + by = gcd(a, b)的一个解
那么有y = (gcd(a, b) - ax) / b (1), 且y, x, a, b是整数

再设一个解x0 = x + k (2), k和x0是整数, 
那么有 a*x0 + b*y0 = gcd(a, b);
y0 = (gcd(a, b) - a*x0) / b (3)
由(3)和(2)得 
y0 = (gcd(a, b) - ax - ak)/b <==> y0 = (gcd(a, b) - ax)/b - a/b * k (4)

由(4)和(1)得 y0 = y - a/b * k (5)
我们要保证y0是整数, y又是整数, 那么a/b * k就是整数
设d = gcd(a, b);
a = a' * d, b = b' * d, 这里a', b'互质(非常基本的知识点, 如果他们不互质, d就可以
通过a', b'的公约数变大, 这就和我们d是最大公约数就矛盾了, 所以a'和b'互质)
a/b * k == a'/b' * k,
因为a'和b'互质, 那么a'/b' * k 要是想是整数的话, k只能是b'的倍数(k == 0时整个就是
0也是整数, 满足要求)
不然就消不掉a'/b'的分母b', 就会产生小数, 就不是整数了
so, k = n*b', (n是任意整数), 
又因为b' * d = b  ==> b' = b / d
这样k = n*b/d
所以x0 = x + n*b/d (6)
通过(5)和(6)可得 y0 = y - n*a/d (7) // 这里是-, 不是+
至此通解就出来了
x0 = x + n*b/d
y0 = y - n*a/d
更常见的是这样的
x0 = x + k*b/d (当然这里的k不是上面的k, 是和n一样的任意整数)
y0 = y - k*a/d

附带最小正整数解就是 x % (b / d); 
因为会有x是负数的情况, 所以更准确的应该是
(x % (b/d) + b/d) % (b/d)
就相当于把所有的k*b/d给删掉, 剩下的就是最小的正整数解

感谢https://blog.csdn.net/qq_41779251/article/details/82634045这篇文章


#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

int n, m;

int exgcd(int a, int b, LL &x, LL &y)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main()
{
    LL x, y, d;
    cin >> n >> m;
    d = exgcd(n, m, x, y);
    cout << (x % m + m) % m << endl; // 这里d是1所以不除也没事
    return 0;
}

补充

    exgcd二元一次等式, 扩大后判断是否有整数解,(小数解都是有的, 但是小数解不符合我们要求)
    首先exgcd求出的等式ax + by = d肯定是有整数解的, 但是等式两边扩大非整数倍后就不一定了, 一定得是整数倍, 
    如果是小数比如1/2就不一定对了, 比如6x + 2y = 2合法, 但是6*x0 + 2*y0 = 1就是无整数解情况(x变为x/2 == x0, 对于后式是求x0, 而非x)
    ax + by = k, k满足扩大d整数倍的条件就是 k % d == 0, k = n * d
    k % d == 0这就是扩大后判断是否有整数解的充要条件
    
    我们知道通解是x = x0 + k*b/gcd(a, b), 设m = gcd(a, b), t = d / gcd(a, b)
    等式扩大了, 但是通解不变, 因为a没变, b没变, a(x*t + k*b/m) + b(y*t - k*a/m) = d
    axt + bxt + akb/m - bka/m = d
    axt + bxt = d, 可以发现等式两边没变
    也就说明通解可行, 对于其他情况也可以这样证明, 通解的可行性

标签:gcd,欧几里得,exgcd,通解,整数,y0,x0
From: https://www.cnblogs.com/blind5883/p/18093120

相关文章

  • P5656 【模版】二元一次不定方程(exgcd)
    综合考查exgcd功力的题目。没有整数解当且仅当\(\gcd(a,b)\nmidc\),直接输出-1。用exgcd解方程\(ax+by=\gcd(a,b)\)得到一组特解\(x_0,y_0\)。对原方程变形得到\(a\cdot\dfrac{xc}{\gcd(a,b)}+b\cdot\dfrac{yc}{\gcd(a,b)}=c\),于是有\(ax+by=c\)的一组特解\(x_1=\d......
  • 类欧几里得
    题目主要分析这道题目的做法,大致也就是类欧的用处。设\(f(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor,g(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor^2,h(a,b,c,n)=\sum_{i=0}^ni\lfloor\frac{ai+b}{c}\rfloor\)。首先考虑\(f\)的转移:设\(m=\l......
  • 拓展欧几里得算法
    一、拓展欧几里得算法1.1算法简析根据裴蜀定理,对任意\(a\)和\(b\),一定存在\(x\)和\(y\),使\(ax+by=\text{gcd}(a,b)\)。拓展欧几里得算法不仅能求出\(a\)和\(b\)的最大公约数,而且能找到一对\((x,y)\)使该方程成立。设求解\(ax+by=\text{gcd}(a,b)\)......
  • 基本操作之——多维空间欧几里得距离距离计算及标量积计算
    dev_clear_window()dev_disp_text('欧几里得距离计算','window',200,200,'black','box_color','#00ffffc0')V1:=[18.8,132.4,33,19.3]dev_disp_text('V1='+V1,'window',220,200,'black',......
  • 类欧几里得算法
    要求类似于这样的东西:\[\begin{align*}f(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}\\g(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}^2\\h(n,a,b,c)&=\sum\limits_{i=0}^......
  • 对最大公约数求法和扩展欧几里得算法的简要概述
    目录1.最大公约数(gcd)1.1更相减损术时间复杂度分析1.2辗转相除法(欧几里得算法)时间复杂度分析2.最小公倍数(lcm)3.裴蜀定理(贝祖定理)3.1扩展欧几里得算法(exgcd)1.最大公约数(gcd)数论中,通常用\(d\|\a\)表示\(d\)能整除\(a\),即\(......
  • C语言解题 || 小乐乐与欧几里得
    题目:小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。输入描述:每组输入包含两个正整数n和m。(1≤n≤109,1≤m≤109)输出描述:对于每组输入,输出一个正整数,为n和m的最大公约数......
  • gcd & exgcd
    gcd&exgcdgcd设\(a=bk+c\),显然有\(c=a\bmodb\)。设\(d\mida,~d\midb\),则\(c=a-bk,\frac{c}{d}=\frac{a}{d}-\frac{b}{d}k\)。由右边的式子可知\(\frac{c}{d}\)为整数,即\(d\midc\),所以对于\(a,b\)的公约数,它也会是\(b,a\bmodb\)的公约数。反过来也需要证......
  • 类欧几里得算法
    模板题:P5170【模板】类欧几里得算法复述题解:我们记\(f(a,b,c,n)=\sum\limits_{i=0}^{n}\Big\lfloor\dfrac{ai+b}{c}\Big\rfloor\,,\g(a,b,c,n)=\sum\limits_{i=0}^{n}i\Big\lfloor\dfrac{ai+b}{c}\Big\rfloor\,,\h(a,b,c,n)=\sum\limits_{i=0}^{n}{\Big\lfloor......
  • exgcd+乘法逆元相关笔记
    #include<iostream>#include<cstdio>usingnamespacestd;constintpass=0;//exgcd://求解二元一次不定方程//ax+by=(a,b)=(b,a%b)=bx'+(a%b)*y'=bx'+(a-b*(a/b))*y'=b*(x'-(a/b)*y')+ay'//则有y=(x'-(a/b)*y'),x=y'......