数论杂谈——欧几里得算法及扩展欧几里得

数学是oi的重要基础,所以说数论在oi中占据了非常重要的地位,因此,学好数学,对于一个oier来说也是非常重要的。

oi中的数学,其实也就和数竞并没有什么区别。

欧几里得法辗转相除法求最大公约数 我们可以证明gcd(a,b)=gcd(b,a%b),也就是我国古代数学智慧的结晶,更相损减术。并且一直递归下去,直到b的值为零,最大公约数值即为a。在这里就不给出详细证明了,大家可以代几个数据去验证它一下。谁叫我数学太菜。

代码如下

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

其实讲了这么多,我们还是为了引出扩展欧几里得算法,也是基于辗转相除法的基础,对此我们就可以求得不定方程ax+by=gcd(a,b)的一组特殊解。

这个方程也可以等价于ax≡gcd(a,b)(mod b)也就是我们所说的同余方程。

我们还可以通过此得出一种性质,那就是bx‘+a%by‘=gcd(b,a%b)=ax+by=gcd(a,b)。也就和辗转相除法联系起来了。

所以我们再把a%b展开,就可以得到a%b=a-a/b,再把它代入原式得bx‘+(a-a/b)y‘=bx‘+ay‘-a/b*y‘=ay‘+bx‘-a/b*y。我们可以发现,在原来的位置上(ax+by),可以等效于x=y‘,y=x-(a/b*y)。因此我们只要知道一个解便可以推出。

代码如下

int Exgcd(int a,int &x,int b,int &y)//‘&’符号便于我们直接修改x和y的值
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;//相当于求一个gcd的过程
    }
    int ans=Exgcd(b,x,a%b,y);//求解方程
    int tmp;//用来保存上一个x的值
    x=y;
    y=tmp-(a/b)*y;//我们刚才推出的式子
    return ans;
}

 然而,你以为这样就完了吗?

别高兴的太早,我们上面的方程只是求的ax+by=gcd(a,b)的一组特殊解

但往往恶心的出题人会让你求诸如ax+by=c的特殊情况

所以仅仅有一个扩展欧几里得是不够的

我们现在就以Noip提高组2012年的"同余方程"为例

题目见洛谷P1082

其实也是一道扩展欧几里得的模板题

但他是让我们求关于xx的同余方程ax≡1(mod b) 的最小正整数解。

还是我们先求出ax+by=gcd(a,b)的解,用裸的扩展欧几里得即可

然后这个同余方程可以看做ax+by=1;

好吧是我看错了

题目中的数据都是满足互质的情况,所以gcd(a,b)一定是1。

那我们怎样来找它的最小整数解呢

那么取模就非常重要了!

取模就是将一个随机的值摸到相应的一个区间中

所以说我们求他的最小整数解就可以用这样一个公式来解决

ans=(x*(c/gcd(a,b))%abs(b/gcd(a,b))+abs(b/gcd(a,b)))%gcd(b/gcd(a,b))

原文地址:https://www.cnblogs.com/LJB666/p/10502166.html

时间: 2025-01-13 19:40:58

数论杂谈——欧几里得算法及扩展欧几里得的相关文章

[模板]欧几里得算法/扩展欧几里得

最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 return a==0?b:gcd(b%a,a); 3 } 扩展欧几里得 寻找$ax+by=gcd(a,b)$的一组解x,y(一定存在整数解) $ax+by=gcd(a,b)=gcd(b\%a,a)=(b-\lfloor\frac{b}{a}\rfloor*a)x'+ay'$ 所以有一组解$x=y'-\lfloo

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人

欧几里得算法与扩展算法相关内容

推荐博客     http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里得算法求最大公约数(辗转相除) 定理 gcd( m , n )=gcd ( n , m mod n ) ( m>n 且 m mod n 不为0) 最小公倍数记为lcm( m , n ),显然lcm( m , n )=m*n / gcd( m , n ) 对于正整数k,有性质 lcm( km , kn)=k*gcd( m , n ) 欧几里得算

数论(欧几里得,扩展欧几里得,欧拉)

今天考试了,三道题分别是求欧拉,逆欧拉,欧拉求和 对于我这样的蒟蒻来说,我选择狗带. 爆零稳稳的. 现在整理一下: φ(n)(欧拉函数值)为不大于n的正整数中与n互质的数的个数: 有几条这样的性质: 1.欧拉函数是积性函数,但不是完全积性函数,即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立. 2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn). 3.除了N=2,φ(N)都是偶数.

【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions

题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < a1, a2 ≤ 2·109,  - 2·109 ≤ b1, b2, L, R ≤ 2·109, L ≤ R). 题目思路: [数论][扩展欧几里得] 据题意可得同余方程组 x=b1(mod a1) 即 x=k1*a1+b1 x=b2(mod a2) x=k2*a2+b2 化简,k1*a1=k2*a2

JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

http://172.20.6.3/Problem_Show.asp?id=1371 http://www.cnblogs.com/jackge/archive/2013/04/22/3034925.html详细的题解,大概是网上能看到的最简单易懂的扩展欧几里得讲解了 代码 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include&

HDU 2669 (扩展欧几里得入门)

练习一下数学知识了.. [题目链接]click here~~ [题目大意]Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead. 求满足式子的x和y否则输出"sorry" [解题思路]扩展欧几里得的基础了, 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足 等式: ax+by = gcd

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b