欧几里得

这人是真的厉害!
辗转相除法

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int gcd(int a, int b)  // 欧几里得算法,a非负,
{return b ? gcd(b, a % b) : a;
}int main()
{int a,b;cin >> a >> b;cout <<gcd(a,b);return 0;
}

定理

gcd(a,b) = gcd(b,a mod b);

证明

  • a可以表示成a = kb + r,则 r = a mod b;
  • r = a - kb则a = r mod b;
  • 易得 gcd(a,b) = gcd(b,a mod b);

扩展欧几里得

扩展欧几里得算法的描述是:一定存在整数 x, y 满足等式 a * x + b * y = gcd(a,b)
这里的a,b是已知,gcd(a,b)表示的是a和b的最大公约数,所以扩展欧几里得算法既可以计算出最大公约数gcd(a,b),又可以计算出变量x,y的一组解。如何求解呢?

计算最大公约数的下一步,带入等式:gcd(b, a % b) = bx1 + (a % b) * y
即就是:gcd(b, a % b) = bx1 + (a - (a / b) * b) * y1
gcd(b, a % b) = a * y1 + b * (x1 - (a / b) * y1 )
在回过头来看看等式 当b不等于0时:gcd(a,b) = gcd(b,a%b)
所以,x = y1 ; y = x1 - (a / b) * y1

所以可以递归的求解x,y。那退出条件是什么呢?
我们可以看到当b == 0时,求出最大公约数。考虑一下当b == 0时,a * x = gcd(a, 0) = a。
此时,x == 1,y取0即可计算出一组特解。

普通版

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

升级版

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

扩展欧几里得算法可以计算二元一次方程组是否存在整数解,并且求出一组解
欧几里得算法只能用来求整数解(因为最大公约数的缘故)

二元一次方程:ax + by = c

1)当a == 0 或 b == 0的时候,方程转为一元一次方程,可直接求得。

2)当c不是 gcd(a,b)的倍数的时候,方程无解。
因为a和b都是他因子的倍数,这个毫无疑问,所以ax+by(a, b的线性组合)也是gcd(a, b)的倍数。如果c不是gcd(a, b)的倍数,那么两边不相等,无解。这条结论叫做“裴蜀定理”。

3)当c是gcd(a, b)的倍数,设g = gcd(a, b),则用ax + by = g求解出的一组解(x0,y0),有ax + by = c 求出的一组解为(x0c/g,y0c/g)

如果你理解了,可以挑战一下 青蛙的约会 这道题。
题解:http://blog.csdn.net/SwordHoly/archive/2009/08/07/4423543.aspx可以参考一下

用扩展欧几里得算法求乘法逆元

这里先说一下乘法逆元,我们都知道,‘取模%’ 具有加、减、乘法的分配率即:
1). (a+b) % c = ((a%c) + (b%c))%c
2). (a-b) % c = ((a%c) - (b%c))%c
3). (a× \times×b) % c = ((a%c)× \times× (b%c))%c
这样的好处就是,如果a+b+…+n计算出来的值太大的话,可以通过分配率来计算出每一步的值在求余。
除法没有分配率,但是有乘法逆元。就是将除法转化为乘法。

逆元:设c是b的逆元,则有ax ≡ \equiv≡ 1(mod p);
(a/b)mod p = (a/b) * 1(mod p) = (a/b)bx (mod p) = ax(mod p)

定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1;(定理的证明在这里就不叙述了)

对于ax + by = 1,可以看出x是a模b的乘法逆元,y是b模a的乘法逆元。

中国剩余定理(孙子定理)利用乘法逆元

中国剩余定理这样描述,给出以下一元线性同余方程组

给出你n个ai和mi,求出符合题意的X值,一般输出最小解。

ti 要用扩展欧几里得算法e_gcd()计算。

一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《 孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《 孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。
宋朝数学家 秦九韶于1247年《 数书九章》卷一、二《大衍类》对“物不知数”问题做出了完整系统的解答。明朝数学家 程大位将解法编成易于上口的《孙子歌诀》:
三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五使得知
这个歌诀给出了模数为3、5、7时候的同余方程的秦九韶解法。意思是:将除以3得到的余数乘以70,将除以5得到的余数乘以21,将除以7得到的余数乘以15,全部加起来后减去105(或者105的倍数),得到的余数就是答案。比如说在以上的物不知数问题里面,按歌诀求出的结果就是23。
例题中三个模数 m1=3,m2=5,m3=7;

余数a1=2,a2=3,a3=2;

M=105,M1=35 , M2=21,M3=15;

t1=2,t2=1,t3=1;

70=t1M1,21=t2M2,15=t3*M3

X =( a1 * t1 * M1 + a2 * t2 * M2 + a3 * t3 * M3)%M=( 2 * 2 * 35 + 3 * 1 * 21 + 2 * 2 * 15)%105=23

适用于n个mi两两互质的情况。

代码


//n个mi互质
ll m[101];ll a[101];//m[]存放互质的数,a[]存放余数
void e_gcd(ll a,ll b,ll &x, ll &y){//计算逆元 if(b==0){x=1;y=0;return;}e_gcd(b,a%b,x,y);ll temp=x;x=y;y=temp-a/b*y;
}
ll CRT(){ll M=1;for(int i=0;i<n;i++) M*=m[i];ll ret=0;for(int i=0;i<n;i++){ll x,y;ll tm=M/m[i];//计算Mie_gcd(tm,m[i],x,y);//计算逆元x ret=(ret+x*a[i]*tm)%M;//计算结果值 }return (ret+M)%M;
}

126 x 2 +225 x 2 + 280 x 4 = 247 (mod 315)

欧几里得,扩展欧几里得,孙子定理相关推荐

  1. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  2. 欧几里得 扩展欧几里得

    欧几里得  &  扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1.    时间复杂度不高,和普通欧几里得一样: 2.    代 ...

  3. 【欧几里得扩展欧几里得】

    欧几里得 LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);} 扩展欧几里得 int ex_gcd(int a,int b,int &x,int ...

  4. 欧几里得+扩展欧几里得+RSA

    欧几里得算法: 就是辗转相除法,gcd(a,b)=gcd(b,a%b), 实现简单,用途广泛,模板如下: int gcd(int a,int b)//或者都取 long long {return b! ...

  5. 欧拉降幂及其扩展欧拉降幂

    欧拉降幂: 从公式来看,需要使用快速幂运算和欧拉函数 #include<bits/stdc++.h>using namespace std; typedef __int64 LL;cons ...

  6. 欧几里得扩展欧几里得

    原博网址:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数 ...

  7. 【笔记】 欧几里得(扩展欧几里得)

    欧几里得 本质:利用辗转相减法求最大公约数,即 gcd(a, b). 数学表达: 设 a > b ,则                          gcd(a, b) = gcd(a-b, ...

  8. 欧拉定理相关及扩展欧几里得

    威尔逊定理.费马定理.欧拉函数.欧拉定理.逆元.exgcd 威尔逊定理: ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 \pmod p (p−1)!≡− ...

  9. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  10. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

最新文章

  1. Exception in thread main java.lang.Error: Unresolved compilation problem
  2. 《VMware Virtual SAN权威指南》一2.2.4 容量层设备
  3. Live Source Address 2019最新的电视广播包_Arturia MiniLab MkII迷你MIDI键盘2019年换新装:反色纯黑版...
  4. c语言头文件_C语言学习之头文件的原理和使用方法
  5. Spring注入方式及用到的注解 -----@Component,@Service,@Controller,@Repository
  6. java中的jni_JAVA中JNI的简单使用
  7. 被误传了数千年的七句话(精简版_转载)
  8. slitax 制定iso
  9. 视频压制探索与B站视频压制参数解析
  10. html自动弹图片,JS自动适应的图片弹窗实例
  11. 内核block层IO调度器—bfq算法深入探索3
  12. 有关结合律和优先规律
  13. 【循环搜寻法(使用卫兵)】
  14. 如何顺利通过c语言补考,大学里补考比考试难的学科,不想挂科最好认真学,尤其大一新生...
  15. 阿里云使用笔记-第三篇-使用阿里云App连接实例
  16. 【Python】批量修改照片日期
  17. pdb文件及其作用(转)
  18. 阿里云服务器是什么,可以用来干嘛?
  19. 全网心疼的鸿星尔克,距离安踏还差两个李宁
  20. 深入探索Android 启动优化(七) - JetPack App Startup 使用及源码浅析

热门文章

  1. FTPClient实现ftp的上传和下载
  2. MATLAB feof和~feof函数用法
  3. 安卓逆向入门级学习————自用
  4. 直击CES 2019 带你围观思岚科技那些“亮眼”展品
  5. 兄弟连沈超linux教程视频,x_13_Linux系统管理-兄弟连-李明-沈超视频教程笔记
  6. 发改委:组织实施2018年“互联网+”、人工智能创新发展和数字经济试点重大工程的通知
  7. 2022年Mathorcup数学建模-大数据竞赛A题二手车估价论文(仅供参考)
  8. linux内核nmi中断,LINUX AM335X NMI中断使用方法
  9. 金三银四跳槽涨薪,对标一线互联网大厂面试题
  10. html h1标签字体颜色css,你可能不知道的h1标签美化技巧