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

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

朴素的欧几里得算法大家应该知道

\(gcd(a,b)\)表示a,b的最大公约数

朴素的欧几里得算法其实就是所谓的辗转相除法

  • 辗转相除法

    \(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\)
    证明如下:
    \(设r=a\) \(mod\) \(b\) \(=a-\lfloor\frac{a}{b}\rfloor*b\),\(p=gcd(a,b)\);
    \[a=xp,b=yp\]
    代入可得\[r=xp-\lfloor\frac{xp}{yp}\rfloor*yp\]
    提公因式得\[r=p(x-\lfloor\frac{xp}{yp}\rfloor*y)\]
    所以\[p|r\]
    \[a,b的最大公约数也是r的约数\]
    \(p`=gcd(b,r)\)
    \[b=x`p`,r=y`p`\]
    \[a=r+\lfloor\frac{a}{b}\rfloor*b\]
    代入得\[a=y`p`+\lfloor\frac{a}{b}\rfloor*x`p`\]
    提公因式\[a=p`(y`+\lfloor\frac{a}{b}\rfloor*x`)\]
    所以\[p`|a\]
    得出结论:a,b与b,a mod b的公约数相同,所以最大公约数也相同
    得证;

    Code:

int gcd(int a,int b) {    if(!b) return a;     else return gcd(b,a%b);}

扩展欧几里得算法

扩展欧几里得算法就是在朴素的欧几里得算法上求一组未知数(x,y)的解,满足贝祖定理:\(ax+by=gcd(a,b)\)

  • 公式的推导
    当且仅当\(a>b\)
    \(b=0\)\(x=1,y=0\)
    \(a>b>0\)
    \(ax1+by1=gcd(a,b);bx2+(a\) \(mod\) \(b)y2=gcd(b,a\) \(mod\) \(b)\)
    由朴素欧几里得算法得:\(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\)
    所以\(ax1+by1=bx2+(a\) \(mod\) \(b)y2\)
    \(ax1+by1=bx2+(a-\lfloor\frac{a}{b}\rfloor*b)y2\)
    化简得:\(ax1+by1=bx2+ay2-\lfloor\frac{a}{b}\rfloor*b*y2\)
    由贝祖等式得\(\left\{\begin{array}\\x1=y2\\{y1=x2-\lfloor\frac{a}{b}\rfloor*b} \end{array}\right.\)
    ##Code:
int exgcd(int a,int b,int &x,int &y) {    if(b==0)     {        x=1;y=0;        return a;    }    int r=exgcd(b,a%b,x,y);    int z=x;    x=y;y=z-a/b*y;    return r;}

扩展欧几里得应用

①解不定方程

②解线性同余方程
③求模的逆元

1.解形如ax+by=c的不定方程

用扩展欧几里得算法求出解\(ax`+by`=gcd(a,b)\)

再分别乘上\(\frac{c}{gcd(a,b)}\)
\(c\) \(mod\) \(gcd(a,b)\neq0\)时无解

2.解形如\(ax\equiv b(mod\) \(m)\)的线性同余方程

\[ax-my=b\]

\[ax+m(-y)=b\]
得出:
\[ax+my=b\]
同上解除即可。

3.求\(ax\equiv1(mod\) \(m)\)

由上式子可得\(x\equiv \frac{1}{a} (mod\) \(m)\)

所以 x是a的逆元
同②得:\(ax+my=1\)
解出x即可.

转载于:https://www.cnblogs.com/Chandery/p/11332796.html

你可能感兴趣的文章
HDU6368
查看>>
粒子效果的总结
查看>>
新的开始
查看>>
Linux LVM逻辑卷配置过程详解
查看>>
2034 人见人爱A-B
查看>>
hdu 5256 序列变换(LIS最长上升子序列)
查看>>
[源码解析]HashMap和HashTable的区别(源码分析解读)
查看>>
oracle rollup()
查看>>
Java之JSON操作(Jackson)
查看>>
设置UITextView根据内容动态设置高度的简单方法,类似微信发朋友圈时的文本输入效果实现...
查看>>
C语言对文件的操作函数用法详解2
查看>>
挂载共享文件夹
查看>>
Python exe2shellcode,shellcode2exe
查看>>
ASP.NET MVC 3: Razor中的@:和语法
查看>>
二级标题左侧加粗线条
查看>>
LeetCode 970. Powerful Integers (强整数)
查看>>
linux内核里的字符串转换 ,链表操作常用函数(转)
查看>>
解决因删除app唯一标识设备号改变情况(存储到钥匙串中)
查看>>
iOS中使用Fastlane实现自动化打包和发布
查看>>
C++ primer 第八章笔记
查看>>