zoukankan      html  css  js  c++  java
  • 浅谈扩展欧几里得算法

    扩展欧几里得算法

    以前写的= = 现在发的原因是 懒得写博客= =

    (ax+by=gcd(a,b))

    求满足等式的整数解(x,y)

    假设(a>b)

    假设有一组合法解为(x_1,y_1),则有(ax_1+by_1=gcd(a,b))

    由欧几里得算法((gcd(a,b)=gcd(b, a\% b)))得

    [ax + by = gcd(a,b) = gcd(b, a\%b) = bx_1 + (a \% b)y_1 ]

    因为(a\% b = a - lfloorfrac{a}{b} floor * b)

    所以原式可以转化为:

    (ax+by = bx_1 + (a - lfloorfrac{a}{b} floor * b)y_1)

    (ax+by=bx_1+ay_1 - lfloorfrac{a}{b} floor by_1)

    (ax+by=ay_1 + b(x_1-lfloorfrac{a}{b} floor y_1))

    由此得

    (x = y_1,y = x_1 - lfloorfrac{a}{b} floor y_1)

    这样就能得到一组合法解

    (b=0)时 , (gcd(a,b)=a),
    此时有唯一的解 : (x = 1,y = 0)

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

    求ax+by=c的最小整数解

    (下面的(d)都是指(gcd(a,b)))

    1. 给出方程(ax + by = c)
    2. 用辗转相除法算出(d = gcd(a, b))
    3. 运用扩展欧几里德算法求出(ax + by = gcd(a,b))(一组解(x1, y1))
    4. 根据(c % gcd(a, b))判断方程(ax + by =c)是否有解 。
    5. 根据(ax + by = c)的通解公式(x_1 = (x + k * (b / d)) * (c / d)),令(b_1 = b / d),所以(x_1)的最小正整数解为:(x_1 = (x_1 \% b_1 + b_1) \% b_1), 对应的 (y1 = (c - a*x_1) / b)
  • 相关阅读:
    拉格朗日插值
    文档 所有空格变为Tab
    windows 计算器
    map 结构体
    插入图片 图片地址
    扩展中国剩余定理
    欧拉定理、欧拉函数、a/b%c
    hdu1033Defragment
    Minimum Inversion Number_线段树||树状数组
    hdu1166敌兵布阵_线段树单点更新
  • 原文地址:https://www.cnblogs.com/loceaner/p/12750679.html
Copyright © 2011-2022 走看看