zoukankan      html  css  js  c++  java
  • 拓展欧几里得模板(转载学习)

    拓展欧几里得算法解二元一次不定方程:a*x+b*y=m;

    因为:gcd(a,b)|  a    ,   gcd(a,b)|  b   ;

    所以:gcd(a,b)|  a*x   ,   gcd(a,b) | b*y   ==>  gcd(a,b)|(a*x+b*y)   ==>gcd(a,b)|m ;

    所以要求a*x+b*y=m,可以先求a*x+b*y=gcd(a,b).

    对于:a*x+b*y=gcd(a,b)

    1.当b==0时,gcd(a,b)=a,此时x=1,y=0;

    2.先求出 a*x+b*y=gcd(a,b) 的一组解。

    因为 a*x1+b*y1=gcd(a,b)

           b*x2+a%by2=gcd(b,a%b)

    且    gcd(a,b)=gcd(b,a%b);

    所以有a*x1+b*y1=b*x2+(a-(a/b)*b)*y2

    从而得x1=y2,y1=x2-(a/b)*y2

    然后执行程序段:

    __int64 exgcd(__int64 a,__int64 b)
    {
        __int64 t,ans;
        if(b==0)
        {
                x=1;
                y=0;
                return a;
        }
        ans=exgcd(b,a%b);
        t=x;
        x=y;
        y=t-a/b*y;
        return ans;
    }
    View Code


    得出一组解x0,y0;

    又因为此时的解并非是原不定方程a*x+b*y=m的解并且gcd(a,b)|m
    所以的原不定方程的一组解  x1=x0*(m/gcd(a,b)),y1=y0*(m/gcd(a,b));
    然后又因为原不定方程有无数组解,并且又有a*(x+(b/gcd(a,b)))+b*(y-(a/gcd(a,b)))=gcd(a,b)
    所以得到原不定方程的所有解为
    x=x1+b/gcd(a,b)*t;
    y=y2-a/gcd(a,b)*t;(t=0,1,2,3,4,5......................这里的t其实还可以是包括t)
     
  • 相关阅读:
    python中的map,fliter,reduce用法
    python中的函数参数传递
    python中的全局变量和局部变量
    python中的函数定义
    python中的eval()和exec()函数
    kafka手动提交,丢失数据
    02-基本概念
    01-接触kafka
    (8)适配模式--结构性
    java内存划分
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3266658.html
Copyright © 2011-2022 走看看