博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展欧几里得
阅读量:4582 次
发布时间:2019-06-09

本文共 1532 字,大约阅读时间需要 5 分钟。

 

然后是无耻的复制环节

 

扩展欧几里得算法,简称 exgcd,一般用来求解不定方程,求解线性同余方程,求解模的逆元等

 

引理 存在x,y满足 ax+by=gcd(a,b)

原式:ax1+by1=gcd(a,b) = bx2+(a%b)y2=gcd(b,a%b)
因为 a%b=a-a/b*b
-->ax1+by1 = bx2+(a-a/b*b)y2
-->ax1+by1 = bx2+ay2-(a/b*b)y2
-->ax1+by1 = ay2+bx2-b*a/b*y2
-->ax1+by1 = ay2+b(x2-a/b*y2)
-->x1=y2; y1=x2-a/b*y2;

 

板子代码

inline void Exgcd(ll a,ll b,ll &X,ll &Y){    if(b==0)    {        X=1;        Y=0;        return;    }    Exgcd(b,a%b,X,Y);    int XX=X,YY=Y;    X=YY;    Y=XX-a/b*YY;    return;}

 

    因为当 b=0 时存在 x , y 为最后一组解

    而每一组的解可根据后一组得到

    所以第一组的解 x , y 必然存在

  根据上面的证明,在实现的时候采用递归做法

  先递归进入下一层,等到到达最后一层即 b=0 时就返回x=1 , y=0

  再根据 x=y’ , y=x’-a/b/y’ ( x’ 与 y’ 为下一层的 x 与 y ) 得到当层的解

  不断算出当层的解并返回,最终返回至第一层,得到原解

 

 

 

exgcd 解不定方程(使用不将a与b转为互质的方法)

  对于 ax+by=c 的不定方程,设 r=gcd(a,b)

  当 c%r!=0 时无整数解

  当 c%r=0 时,将方程右边 *r/c 后转换为 ax+by=r 的形式

  可以根据扩展欧几里得算法求得一组整数解 x0 , y0

  而这只是转换后的方程的解,原方程的一组解应再 *c/r 转变回去

  (如 2x+4y=4 转换为 2x+4y=2 后应再将解得的 x , y 乘上2)

  则原方程解为 x1=x0*c/r , y1=x0*c/r

  通解 x=x1+b/r*t , y=y1-a/r*t ,其中 t 为整数

  证明:

    将 x , y 带入方程得

    ax+ab/r*t+by-ab/r*t=c

    ax+by=c

    此等式恒成立

    得证

 

 

exgcd 解线性同余方程

  关于 x 的模方程 ax%b=c 的解

  方程转换为 ax+by=c 其中 y 一般为非正整数

  则问题变为用 exgcd 解不定方程

  解得 x1=x0*c/r

  通解为 x=x1+b/r*t

  设 s=b/r (已证明 b/r 为通解的最小间隔)

  则 x 的最小正整数解为 (x1%s+s)%s

  证明:

    若 x1>0,则 (x1%s+s)%s=x1%s%s+s%s=x1%s=x1-ts (t∈N)

    若 x1<0,因在 C++ 里 a%b=-(-a%b)<0 (a<0 , b>0)  如 -10%4=-2

         则 (x1%s+s)%s=(-(-x1%s)+s)%s=(-(ts-x1)+s)%s=ts-x1 (t∈N)

    即为 x1 通过加或减上若干个 s 后得到的最小正整数解

    得证


完结撒花。。。。。。(黑人问号.jpg)

 

转载于:https://www.cnblogs.com/gaojunonly1/p/10440241.html

你可能感兴趣的文章
前端和算法实现:给网站上加上自己的水印(简单+复杂)
查看>>
react-native学习(RN)--之Window环境下搭建环境配置,以及初始化建立react-native项目,(真机和模拟器运行的相关错误解决办法,android打包报错)...
查看>>
WPF路由事件学习(一)
查看>>
特殊字符导致jquery-mobile 挂起(firefox控制台报错 malformed URI sequence)
查看>>
Java3-1
查看>>
系统分析与设计 作业一
查看>>
大数据入门---------------------Java部分开始
查看>>
Java中的逆变与协变
查看>>
ASP.NET站点
查看>>
mvc
查看>>
[leetcode]Map-560. Subarray Sum Equals K
查看>>
LeetCode No.6 ZigZag Conversion
查看>>
CSS中position为relative时的特性
查看>>
javascript类式继承最优版
查看>>
opencv
查看>>
将相关数据拼成所需JSON数据
查看>>
第一章
查看>>
python全栈-Day 13
查看>>
二十五、侧边栏(charm)
查看>>
C# 部分类: partial关键字的作用(转摘)
查看>>