zoukankan      html  css  js  c++  java
  • exgcd证明和最基础应用

    如何求解这个方程:(ax + by = gcd (a, b))

    (∵gcd(a, b) = gcd (b, a \% b))

    (∴)易证 $ gcd(a, b)$ 总是可以化为 (gcd (a',0))的形式

    对于原方程(a'*x + 0*y = gcd (a',0)) (根据定义(gcd(a',0) = a')

    存在解为({x=1,y=0})

    设$gcd(a_1,b_1) (为当前的)gcd(,)gcd(a_2,b_2)(为向下迭代后的)gcd$

    ({x1,y1})是当前解,({x2,y2})是下一次(gcd)的解

    $$a_1x_1 + b_1y_1 = gcd(a_1,b_1)$$

    $$=gcd (a_2,b_2)$$

    $$= gcd(b_1,a_1%b_1)$$

    $$ = b_1*x2 + a_1 % b_1 *y2$$

    由于(a\%x = a-x*(a/x))

    原式可以化简为:

    $$a_1x_1 +b_1y_1 = b_1x_2+(a_1-(a_1/b_1)b_1)*y_2$$

    $$a_1x_1 +b_1y_1 = a_1y_2+b_1x_2-(a_1/b_1)b_1y_2$$

    $$a_1x_1 +b_1y_1 = a_1y_2+b_1(x_2-(a_1/b_1)*y_2)$$

    我们已知下一次迭代得到的解(x_2,y_2)(a_1,b_1)(边界为最终解({x=1,y=0 })

    那么就可以据此,系数对应,求出当前解:

    $$x_1=y_2,y_1=x_2-(a_1/b_1)*y_2$$

    经过层层迭代,就可以得到最终解。

    代码:

    int exgcd (int a1, int b1, int &x2, int &y2) {
    	//传址引用修改x2, y2 
    	if (b1 == 0) {
    		x2 = 1, y2 = 0;
    		return a1;//边界情况 
    	}
    	int div = exgcd (b1, a1 % b1, x2, y2);//向下递归 
    	int x1 = y2, y1 = x2 - y2 * (a1 / b1);
    	return div;//返回约数 (可能没啥用QwQ关键求的是方程解)
    }
    

    用处:作为(gcd)的扩展版,它着力求的并不是(gcd),而是利用其性质求解形如(ax + by = gcd (a, b))的方程,通常可以把逆元化为这种方程形式用(exgcd)快速求解。

    (可能还有更多用处)

    (A*X) (mod) (B=1)

    (A*X-B*Y=1)

    (B)是质数,则二者(gcd)显然为(1)

    (B)不是质数逆元就不存在啦(QwQ)

    代入(exgcd),求出来(X)的值就是(A)关于(mod) (B)的逆元

  • 相关阅读:
    流程控制之while循环
    流程控制之case语句
    流程控制之if判断
    元字符
    基本数据类型与值操作
    变量
    shell 基础
    node系列---【node连接数据库步骤解析】
    node系列--【 DML语句对数据库的增删改查】
    node系列--【express生成器安装及第三方中间件安装】
  • 原文地址:https://www.cnblogs.com/maomao9173/p/10322960.html
Copyright © 2011-2022 走看看