zoukankan      html  css  js  c++  java
  • 扩展欧几里得

    定义

    就是如何求得 (ax + by = d) 的一个解, (d = (a, b))

    做法

    考虑使用欧几里得算法的思想, 令 (a = bq + r), 其中 (r = a mod b)
    递归求出 (bx + ry = d) 的一个解
    设求出 (bx + ry = d) 的一个解为 (x = x_0, y = y_0)
    (a = bq + r) 带入 (ax + by = d)
    (b(qx + y) + rx = d)
    (qx+y = x_0, x = y_0), 则上式成立
    (x = y_0, y = x_0 - qy_0)(ax + by = d) 的解
    递归的边界: (b = 0) 时, 令 (x = 1, y = 0).

    code

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

    求得所有解

    先用 (exgcd) 求出任意一个解 (x = x_0, y = y_0)
    再求出 (ax + by = 0) 的最小的解
    (x = d_x = dfrac{b}{(a, b)}, y = d_y = -dfrac{a}{(a, b)})
    所有解就是 (x = x_0 + kd_x, y = y_0 + kd_y, k in Z)

    证明

    我们可以设 (a > b)
    ((1))(b = 0), (gcd(a, b) = 0). 此时 (x = 1, y = 0);
    ((2))(ab eq 0)
    (ax + by = gcd(a, b));
    (bx_0+( a mod b) y_0 = gcd(b, a mod b))
    根据欧几里得算法有 (gcd(a, b) = gcd(b, a mod b));
    则: (ax + by = bx_0 + (a mod b) y_0)
    即: (ax + by = bx_0 + (a - lfloor{dfrac{a}{b}} floor * b)y_0 = ay_0 + bx_0 - lfloor{dfrac{a}{b}} floor*by_0)
    根据恒等定理得: (x = y_0, y = x_0 - lfloor{dfrac{a}{b}} floor * y_0);
    这样我们就得到了求解 (x,y) 的方法: (x.y) 的值基于 (x_0,y_0).

  • 相关阅读:
    c++ 输出 变量名 字符串(zz.is2120.BG57IV3)
    分页存储过程
    连接字符串
    动软 DBHeper 完全代码
    java 数据库连接字符串
    DOS命令行下常见的错误信息
    点击单元格选择整行,又可编辑单元格
    label里文字中的下划线
    Delphi程序中动态生成控件的方法及应用
    双击dbgrid排序的问题
  • 原文地址:https://www.cnblogs.com/lieberdq/p/13280840.html
Copyright © 2011-2022 走看看