欧几里得&扩展欧几里得算法

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

\(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

时间: 2024-12-19 20:29:37

欧几里得&扩展欧几里得算法的相关文章

欧几里得与扩展欧几里得算法

欧几里得算法:最大公因数\((gcd)\) 该算法基于: \(gcd(a,b)=gcd(b,a\)%\(b)\) 证明: 令\(a\) % \(b = r\), 则 \(a = k * b + r,\) 因此\(r = a - k * b\) 设\(d\)为\(a,b\)的公约数,那么\(d|a, d|b,\) 则\(a - k * b\) 能被\(d\)整除,即\(d|r\),即\(d|(a\) % \(b)\), 因此\(d\)是\(b\) 和 \((a\) %\(b)\)的公约数, 因此\

扩展欧几里得算法的模板实现

我居然现在还记不住扩欧的板子,我太弱啦! 扩展欧几里得算法解决的是这样的问题: 给定一个不定方程组ax+by=gcd(a,b),求他的一组整数解 先给出实现代码 void exgcd(int a,int b,int &x,int &y) { if(!b) { x=1,y=0;//gcd(a,0)显然等于1*a-0*0=a return a; } int ans=exgcd(b,a%b,x,y); int tem=x; x=y; y-=tem-(a/b)*y; return ans;} 但实

POJ - 1061 青蛙的约会 (扩展欧几里得算法)

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

HDU - 1576 A/B(扩展欧几里得算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 普通版欧几里得算法(辗转相除): 1 typedef long long LL; 2 LL gcd(LL a,LL b){ 3 return (b==0) ? a : gcd(b,a%b); 4 } 扩展欧几里得算法(理论):对于不完全为0的非负整数,

【hdu1576】A/B——扩展欧几里得算法

扩展欧几里得的模板题,要记住: x=y1; y=x1-a/b*y1. 这道题的推导过程如下: 1.因为A/B==0,所以令A/B=x,即A=Bx.又因为n=A%m,所以m*y+n=A. 由上面可推导出Bx-my=n. 2.由扩展欧几里得算法可以算出B*x1+m*y1=1的根,等式两边同时乘上n可以变形为B*(x1*n)-m*(-n*y1)=n. 所以x=n*x1.到这里我们只需要通过扩欧算出x1,答案即为(x1*n)%m. 3.最后要注意的一点,扩展欧几里得算法算出的x1可能为负数,这显然是不成

欧几里得扩展定理

//poj   1061 思路:两只青蛙跳一次所花费的时间相同,我们设其为t,则x+mt是青蛙A从坐标原点到终点所走的距离,y+nt是B走的距离,要想碰面,则他们相减一定是地面周长的整数倍,设为k*L:则:(x+mt)-(y+nt)=kl;变形得:(m-n)t-(y-x)=kL;即有(m-n)t mod L=y-x;为线性同余方程.此方程有解当且仅当y-x能被m-n和L的最大公约数(记为gcd(m-n,L)),即gcd(m-n,L)|y-x.这时,如果x0是方程的一个解,即当t=x0时,(m-n

扩展欧几里得算法求解不定方程【例 poj 1061】

扩展欧几里得算法是数论当中一种常用的算法,他可以用如下的姿势来表达: 设a, b为不全为0的整数,则存在整数x和y,使得 gcd(a, b) = a*x + b*y. 证明就略去. 树上还有一个拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需要的除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍. 拉梅定理的一个推论:求两个正整数a, b, a > b的最大公因子需要O(log2a)3次的位运算. 至于拉梅定理有什么用,暂时还没有研究=—=. 例1 求225和21的最大公因子s,

扩展欧几里得算法------扩展欧几里德算法

扩展欧几里得算法及其应用 一.扩展欧几里得算法 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,若gcd(a,b)表示 a,b 的最大公约数,必然存在整数对x,y ,使得 ax+by = gcd(a,b). 算法过程: 设 a>b,当 b=0时,gcd(a,b)=a.此时满足ax+by = gcd(a,b)的一组整数解为x=1,y=0:当a*b!=0 时, 设 a*x1+b*y1=gcd(a,b):b*x2+(a mod b)*y2=gcd(b,a mod b): 根据欧几里得原理知 g

扩展欧几里得算法及实现

欧几里得算法,即辗转相除法,用于求整数a,b的最大公约数. 欧几里得算法C++实现代码:(无需确定 a,b 大小关系) long long gcd(long long a,long long b){     return b?gcd(b,a%b):a; } 扩展欧几里得算法:设a和b不全为0,则存在整数x和y,使得 gcd(a,b) = xa + yb 证明: 假设 a>b 当 b==0 时:gcd(a,b) = a , 此时 x=1 , y=0 当 ab!=0时: 设: x1a + y1b =