zoukankan      html  css  js  c++  java
  • 欧几里德及其拓展和应用

    • 欧几里德定理求最大公约数:
    Datatype Gcd(Datatype  a, Datatype  b){
             return (b == 0 ? a : Gcd (b, a%b));
    }

    运用的原理为辗转相除

    Gcd(a, b) == Gcd (b, a) == Gcd(-a, b) == Gcd(|a|, |b|)
    • 拓展欧几里得定理:

    求解方程ax + by = Gcd(a, b);

    int Gcd_value = 0, x = 0, y = 0; //Gcd_value为a,b的最大公约数
    
    int exGcd(int a, int b, int &Gcd_value, int &x, int &Y){
            if (b == 0){
                 x = 1;
                 y = 0;
                 Gcd_value = a;
            }
            else{
                 exGcd(b, a%b, Gcd_value, x, y);
                 int temp = x;
                 x = y;
                 y = tm - y*(a/b);
            }
    }

    证明:

    当a != 0且b == 0,Gcd(a, b) = a,则ax + by = a ==> x = 1且y =0;

    a*b!= 0时,Gcd(a, b) == Gcd (b, a%b);

    则有 ax1 + by1 = Gcd(a, b) = Gcd (b, a%b) = bx2 + (a%b)y2;

    将右边变形:b*x2 + (a%b)*y2 = b*x2 + (a –[a/b]*b)*y2 = b*x2 + a*y2 – b*y2*[a/b] = a*y2 + b*(x2 - y2*[a/b]);

    则有 ax1 + by1 = a*y2 + b*(x2 - y2*[a/b]) ==> x1 = y2 且 y1 = x2 - y2*[a/b];

    故采用递归的方法直到找到 b==0 时的情况,即 xn = 1 且 yn = 0,然后回溯赋值给xn-1,yn-1,然后继续回溯......直到找到x0,y0 !

    此时就有 a*x0 + b*y0 = Gcd(a, b) ==> a*(x0 + T*b) + b(y0 - T*a) = Gcd(a, b);

    则有 通解 x = x0 + T*b,y = y0 - T*a(T为任意整数,即 ····,-2,-1,0,1,2,······);

    • 运用拓展欧几里德求解 ax + by = c:

    首先有如下结论,(我不知道怎么来的)

    ax + by = c 有解 c%Gcd(a, b) == 0 否则 方程无解;

    下面求解:

    上面我们得到了 ax + by = Gcd(a, b) 的初始解,x0y0

    p = c/Gcd(a, b) => c = p*Gcd(a, b);

    联立方程: a*x + b*y = Gcd(a, b) 与 a*xx + b*yy = c = p*Gcd(a, b);

    则可得 a*(xx/p) + b*(yy/p) = Gcd(a, b)  则可推出通解: 

    xx = x*p = x*c/Gcd(a, b);

    yy = y*p = y*c/Gcd(a, b);

     

    • 运用拓展欧几里德求乘法逆元:
    例如:4关于模7的乘法逆元为多少?
    4X≡1 mod 7
    这个方程等价于求一个X和K,满足
    4X=7K+1
    其中X和K都是整数。
    若ax≡1 mod f, 则称a关于模f的乘法逆元为x。也可表示为ax≡1(mod f)。
     
    当a与f互素时,a关于模f的乘法逆元有唯一解。如果不互素,则无解。
    如果f为素数,则从1到f-1的任意数都与f互素,即在 1到 f-1 之间都恰好有一个关于模f的乘法逆元。
     
    例如,求5关于模14的乘法逆元:
    14=5*2+4
    5=4+1
    说明5与14互素,存在5关于14的乘法逆元。
    1=5-4=5-(14-5*2)=5*3-14
    因此,5关于模14的乘法逆元为3。
     
    其求法可运用拓展欧几里德原理。
    求 ax≡1 mod b 中的x值相当于 求解 ax - by = 1,将负号并入 y 中则有 ax + by = 1,其中 Gcd(a, b) == 1(因其互质),则我们就可以运用拓展欧几里德原理解出x,y的基础解,然后通过求解通解的方式找到 1 <= x < b 的值,此值即为 a关于模b的乘法逆元! 
  • 相关阅读:
    【 星 辰 · 第 二 条 约 定 】
    【 星 辰 · 第 一 条 约 定 】
    【 塔 · 第 三 条 约 定 】
    【 塔 · 第 二 条 约 定 】
    某些奇葩的正则校验
    localstorage本地存储的简单使用
    js基础(3)之闭包。
    js基础(2)filter()筛选过滤
    js基础(1)变量作用域
    scrum过程
  • 原文地址:https://www.cnblogs.com/shengshouzhaixing/p/3570358.html
Copyright © 2011-2022 走看看