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

    欧几里得算法又称辗转相除法,主要用于求两数的最大公约数即gcd(a,b)。

    欧几里得算法给出gcd(a,b)=gcd(b,a%b)(a>b)

    下面我们给出证明:

    首先我们设k为gcd(a,b),则a=km,b=kn。

    则a%b=a-c*b=km-c*kn=(m-cn)k

    gcd(b,a%b)=gcd(kn,(m-cn)k)

    由于k为a,b的最大公约数,所以n与m-cn互质,所以gcd(b,a%b)=gcd(a,b)=k。

    程序实现:

    1 int gcd(int a,int b)
    2 {
    3     if (a < b) swap(a, b);
    4     return b==0?a:gcd(b, a % b);
    5 }
    欧几里得

    //------------------------------------------------------------------这是分割线-------------------------------------------------------------------------------------------

    扩展欧几里得算法

    对于任意两个互质的a,b,总有gcd(a,b)=ax+by,扩展欧几里得算法可以用来求解x,y。

    求法:

    根据欧几里得算法可知gcd(a,b)=gcd(b,a%b)。

    则bx‘+(a%b)y'=gcd(a,b)

    将a%b=a-(a/b)*b带入得

    ay'+b(x'-(a/b)*y')=gcd(a,b)

    对于a,b而言,他们对应的x,y则分别为y',(x'-(a/b)*y')。

    而当b=0时,a*1+b*0=gcd(a,b)。

    下面是程序实现:

     1 LL extgcd(LL a,LL b,LL& x,LL& y)
     2 {
     3     if(b!=0)
     4     {
     5         LL d=extgcd(b,a%b,y,x);
     6         y-=(a/b)*x;
     7         return d;
     8     }
     9     else
    10     {
    11        x=1,y=0;
    12        return a;
    13     }
    14 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    [MetaHook] Find a function signature
    [MetaHook] GameUI hook
    [MetaHook] BaseUI hook
    一些常用软件的网络端口协议分类介绍
    Visual C++中最常用的类与API函数
    Ubuntu常用软件安装
    C++字符串完全指引
    C++资源之不完全导引
    超过 130 个你需要了解的 vim 命令
    Little-endian和Big-endian
  • 原文地址:https://www.cnblogs.com/wls001/p/5156965.html
Copyright © 2011-2022 走看看