Ax+By=C问题


title: Ax+By=C问题
tags:

  • 数论

categories:

  • 数学知识

总结总结 Ax+By=C 问题

Ax+By=C的解的讨论(仅A,B为常数)

讨论一下该不定方程的解与C的取值存在什么关联:

  1. 若A,B互质,则对任意的C,满足等式的x,y一定有解且有无穷多个。
    若还要求x,y的解非负,那么满足Ax+By=C的无解的C的个数是有限的,C最大取
    max{C|C导致无解}=AB-(A+B)。**注:也就是说当C大于max值,一定有解。
  2. 若A,B不互质,则对任意C,不能保证x,y一定有解;
    这时当且仅当 C%GCD(A,B)==0 ,不定方程有解;
    ***注:不能保证有解即满足Ax+By=C的无解的C的个数为INF

例题奉上:

Ax+By=C的解(A,B,C均为常数)

不定方程的解分两种情况:

  1. C%GCD(A,B)==0 方程有解,特别的GCD(A,B)=1,方程有唯一解。
  2. 反之无解。

第①种情况下,该方程的解同时可转换为模线性方程(同余方程)的解:
求解模线性方程(同余方程)ax=b(mod n)

  • 设d = gcd(a, n), 假定对整数x', y', 有d = ax' + ny',
    如果d | b, 则方程ax = b(mod n)有一个解的值为x0, 满足:
    x0 = x'(b / d)(mod n)
    于是求得x'的解就可得到x0的解即方程 ax-ny=b的解
    而ax'+ny'=d的解又需要用到Extend_Eculid定理

有关Extend_Eculid的通解可参考我的:Extend_Eculid扩欧

ll Extend_Eculid(ll a, ll b, ll &x, ll &y)
{               //求解ax + by = Gcd(a,b) 函数的返回值为GCD(a,b)
    if(!b)
    {
        x = 1; y = 0;
        return a;
    }
    else
    {
        ll temp = Extend_Eculid(b, a%b, y, x);
        y = y - a/b*x;
        return temp;
    }
}

输出一组特解

int main()
{
    ll a, n, b, d, x, y; 
    cin>>a>>n>>b;        //ax=b(mod n)
    d= Extend_Eculid(a, n, &x, &y);    //返回值d = Gcd(a, n),并得到一组特解x',y' 
    printf("Gcd(a,n) = %lld\n", d);
    printf("x0=%lld, y0=%d\n", x, y);
    if(b%d)            //当d|b,方程才有解  
        printf("-1\n");
    else
    {
        int x0 = x*(b/d)%n; 
        int y0 = (b-a*x0)/n;
        printf("特解:%d %d\n", x0, y0);
            
    }
}
当然可以得到一组x0了可以算一下其他通解
​```c++
int x1 = x0 + i*(n/d);

对于特别的 GCD(A,B)=1 有唯一解,其解即为a的逆
有关逆元可参考我的: https://www.weayer.top/2020/02/28/Inverse/

猜你喜欢

转载自www.cnblogs.com/weayer/p/13184509.html