zoukankan      html  css  js  c++  java
  • 解线性不定方程

    1,

    定义:线性不定方程是指ax + by = c。

    2,

    给出整数a, b, c,先求出一组解,然
    后讨论如何表示通解(所有解)。首先设gcd(a; b) = d。如果c不是d的倍数,那么方程
    无解,因为左边是d的倍数,而右边不是。在有解的情况,设c = c0 £ d,则可以先求
    出ax + by = d的一组(x0; y0),则ax0 + by0 = d,两边乘以c0得:a(c0x0) + b(c0y0) = c,因
    此(c0x0; c0y0)是原方程的一组解。换句话说,核心问题是:求ax + by = gcd(a; b)的解。

    3,

    下面的扩展euclid算法求出了这样一组解。

    void gcd(int a , int b , int & d , int & x , int & y)
    {
        if (!b){ d = a; x = 1; y = 0; }
        else 
        {
        gcd(b , a%b , d , y , x ); // (**)
        y -= x*(a/b);
        }
    }

    4,证明:

    用数学归纳法可以证明它的正确性。归纳基础:

    b = 0时,gcd(a; 0) = a,取x =1; y = 0,有ax + by = a ¢ 1 + 0 ¢ 0 = a = gcd(a; 0),成立。

    先假设i次迭代以后,(**)行得到了正确的结果,即返回值y0和x0满足:
    by0 + (a mod b)x0 = gcd(b; a mod b) = gcd(a; b) = d 
    经过步骤y¡ = x0 ¤ (a=b)后,新的数对(x; y)满足:
    ax + by = ax0 + b(y0 ¡ x0(a=b)) = ax0 + by0 ¡ bx0(a=b) = s 
    这里的a=b是整除运算,它等于(a ¡ a mod b)=b,

    因此s = ax0 +by0 ¡bx0(a¡a mod b)=b = ax0 +by0 ¡ax0 +(a mod b)x0 = by0 +(a mod b)x0 = d

  • 相关阅读:
    [JSOI2008]Blue Mary开公司[李超线段树]
    线段树分治
    满汉全席[2-SAT]
    「一本通 3.5 练习 5」和平委员会
    2-SAT问题
    2019/04/06 BJ省选模拟DAY1
    构造题【随时更
    文本编辑器vim/vi——命令模式
    指令——cat
    指令——history
  • 原文地址:https://www.cnblogs.com/RoitAGI/p/5686429.html
Copyright © 2011-2022 走看看