简单数论总结2——同余方程与扩展欧几里得算法

在上一次总结过后鸽了没多久其实是快要开学赶紧来肝上两篇

今日内容——同余方程和扩展欧几里得算法

同余

同余的定义:若存在两个整数a,b,使得(a - b) MOD P为0,则称作a与b在MOD P的情况下同余

换种通俗的说法,就是,a MOD P与b MOD P相等

记作  \( a\equiv b (mod P) \)

对于整数a,b,c和自然数m,n

同余具有以下性质:

  1. 自反性:\( a\equiv a (mod P) \)
  2. 对称性:若存在\( a\equiv b (mod P) \) ,则 \( b\equiv a (mod P) \)
  3. 传递性:若存在\( a\equiv b (mod P) \) ,\( b\equiv c (mod P) \), 则 \( a\equiv b (mod P) \)
  4. 同加性:若\( a\equiv b (mod P) \),则 \( (a+c)\equiv (b+c) (mod P) \)
  5. 同乘性1:若\( a\equiv b (mod P) \),则 \( (a*c)\equiv (b*c) (mod P) \)
  6. 同乘性2:若\( a\equiv b (mod P) \) , \( c\equiv d (mod P) \),则 \( (a*c)\equiv (b*d) (mod P) \)
  7. 同幂性:若\( a\equiv b (mod P) \),则 \( (a^c)\equiv (b^c) (mod P) \)

  由此,我们可以得到两条推论

  1.   \( (a*b)mod k = (a mod k)*(b mod k) mod k \)
  2. 若\( a mod p = x ,a mod q = x,p、q互质,则a mod p*q =x \)

  但是,相信像我一样睿智的你也发现了一个问题,没错,同余不满足同除性,即不满足若\( a\equiv b (mod P) \),则 \( (a/c)\equiv (b/c) (mod P) \)

  那么除法取模要如何解决呢,秃顶聪明绝顶的数学家也发现了这个问题,利用逆元的知识,我们就可以解决这个问题啦!

  但是逆元,我决定下次再讲,其实就是鸽了(咕咕咕)

扩展欧几里得算法

  欧几里得算法相信大家都已经知道了QwQ

  就是求gcd的辗转相除法

  不知道的可以去看我的上一篇文章(理直气壮的骗访问量QwQ)

  那么扩展欧几里得算法是啥?(黑人问号.jpg)

  扩展欧几里得算法就是利用了欧几里得算法中迭代的过程,使其能够求出形如\( ax + by = gcd(a , b) \) 的方程的应用

  我们可以简单的证明和感性理解一下扩展欧几里得算法的正确性:

  

  首先,当欧几里得算法停止迭代时

  有此情况 \( a=1,b=0,此时,gcd(a,b)=x,ax+by = gcd(a,b)显然成立 \)

  在迭代的过程中

  有 \( b{x}‘ + (a mod b) {y}‘ = gcd(b, a%b) \)与 \( ax + by = gcd(a, b) \)

  则由上一层推出

  \( x= {y}‘ \),\( y={x}‘-a/b*{y}‘ \)

  于是可推至初始情况,得出解

  

  下面给出代码的实现

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

  就是这样喵

对扩展欧几里得定理的应用

  利用扩展欧几里得定理,我们能够求解形如\( ax+by = c \)的问题

  当 \(c \mid gcd(a,b) \)时,有\( ax+by = c \)的不定方程有整数解

  所以,把原式变形为 \( ax+by = d (d = gcd(a,b) ) \)的形式,利用扩展欧几里得定理可解出方程的一组解\( (x,y) \),再将其乘以 \( \frac{c} {gcd(a,b)} \)

  就能解出原方程的解啦!(快夸我.jpg)

对扩展欧几里得定理求出解的处理

  由于形如 \( ax+by = c \) 的线性不定方程有无穷多解,扩展欧几里得定理进行求解的过程中,不一定保证求出的是最小正整数解,为得到最小正整数解,我们有如下的方式

  易推出,对于线性不定方程 \(  ax+by = c \),有一组解\(x,y\) 与另一组解 \( a*(x + \frac {a*t} {gcd(a,b)}) ,b*(y- \frac {b*t} {gcd(a,b)} | (t\in \mathbb{Z})) \)都为原方程的解

  则可得出方法:对于线性不定方程 \(ax+by = c \) ,其最小正整数解为( \(  x= ( (x\%t)+t)\%t) ,(t=b/gcd(a,b))\),\( y=(((y\%t)+t)\%t) ,(t=a/gcd(a,b)) \) )

  至此,问题得到了解决

原文地址:https://www.cnblogs.com/dreagonm/p/9362887.html

时间: 2024-11-05 16:31:34

简单数论总结2——同余方程与扩展欧几里得算法的相关文章

扩展欧几里得算法模板题 zoj 3609

Modular Inverse Time Limit: 2 Seconds      Memory Limit: 65536 KB The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (mod m). This is equivalent to ax≡1 (mod m). Input There are multiple test cases. Th

POJ 2115 for求循环次数-数论-(同余方程+扩展欧几里得算法)

题意:给定for循环的初始值,结束值和增量,还有一个模,求最少的循环次数. 分析: 读完题后应该就知道是一个同余的概念,所以就是解一个一元一次同余方程,像上题一样用扩展欧几里得算法.这题的trick点是k最大为32,那么2^32超出了int,要用long long,所以在1<<k时要这样做:1LL<<k,不然就WA了. 代码: #include<iostream> #include<cstdio> #include<algorithm> #inc

POJ 1061 青蛙绕地球约会-数论-(解一元一次同余方程+扩展欧几里得算法)

题意:两只青蛙同向跳,起点是x,y,每次分别跳m,n米,地球周长是L,求最少跳几次相遇. 分析: 把式子写好就发现是一个一元一次同余方程.用扩展欧几里得算法来求.这题很基本得会. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #define INF 100000

数论专题---除法表达式之高精度运算,扩展欧几里得算法

[题意描述] 给定这样一个表达式:X1/X2/X3/·····/Xk,其中Xi是正整数.除法表达式应到按照从左到右的顺序求和.但在表达式中嵌入括号可以改变计算顺序.输入表达式,判断是否可以通过加括号使得表达式最后的值为整数. [分析] 表达式可以写成E=(X1·X3·····Xk)/X2:(X1一定在分子位置,X2一定在分母位置,其它任意) 问题变为E是否为整数. 对于大数相乘,我们可以采用两种方法避免数据溢出: 1.采用素数的唯一分解定理:存储可能存在素数的个数(如何存储,用一个数组就行) 2

数论初步——扩展欧几里得算法

具体内容见紫书p313-p314 一.扩展欧几里得算法 思想:找出一对整数(x,y),使得ax+by=gcd(a,b) 举例:当"a=6,b=15"时,gcd(6,15)=3,故可以得到解"x=3,y=-1",当然还有其他解"x=-2,y=1". 程序: /* 扩展欧几里得算法 */ void gcd(int a, int b, int& d, int& x, int& y) { if(b == 0){ //边界,因为 a

扩展欧几里得算法详解

一:欧几里得算法(辗转相除法) 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a

noip知识点总结之--欧几里得算法和扩展欧几里得算法

一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a mod b) (其中a mod b != 0)  或  b (其中a mod b == 0) 证明: 后半部分呢...是废话,于是只要证明前半部分即可. 不妨设g = gcd(a, b),于是有 a = g * A, b = g * B 且 (A, B) = 1 故gcd(b, a mod b) =

浅谈扩展欧几里得算法(exgcd)

在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当\(a\%b==0\)的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by=gcd(a,b)\)的最小正整数解.根据数论的相关知识,一定存在一组解\(x,y\)使得\(ax+by=gcd(a,b)\).那就来谈谈具体如何来求解吧. 根据辗转相除法的内容\(gcd(a,b)=gcd(b,a\%b)\)我们可以得到:\[ax_1+by_1=gcd(a,b)=gcd(

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

我居然现在还记不住扩欧的板子,我太弱啦! 扩展欧几里得算法解决的是这样的问题: 给定一个不定方程组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;} 但实