1. 整除与取模

先普及一下整除符号“|”
对于整数a,b(a≠0),若存在整数k,使b=ka,则称a整除b,或b能被a整除,记为a∣b

然后是取模运算

取模运算不用说,大家都懂,不过有几条性质希望大家也都明白。

(a+b)%m = (a%m + b%m ) %m;

(a-b)%m = (a%m - b%m ) %m;

(a*b)%m = (a%m * b%m ) %m;

除法在这里是不成立的:(a/b)%m = (a%m / b%m ) %m; 这是错误的

2. 欧几里得算法

gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\% b) gcd(a,b)=gcd(b,a%b)

若a<b,则gcd(a,b)=gcd(b,a)=gcd(b,a% b),命题成立。

若a>=b,不妨设a=q*b+r,其中0≤r<b。显然r=a%b。 对于a,b的任意公约数d, 因为d|a,
d|(qb),故d|(a-qb), 即d| r, 因此d也是b,r的公约数。 对于b,r的任意公约数k, 因为k|b, k|(a-qb)
[r=a-qb], 故k|a,因此k也是a,b的公约数 故a,b的公约数集合与b,a%b的公约数集合相同。于是它们的最大公约数自然也相等。

如果觉得不自然,请再往下看。

假设(a,b)>(b,a%b),令d等于a,b的最大公约数,即d=(a,b))
根据上面的推导可知:d同时也是b,r的公约数,而b,r的最大公约数一定大于等于d,假设不成立
假设(a,b)<(b,a%b),和上面一样的道理,假设不成立。 (a,b)既不大于也不小于(b,a%b),两者相等。

3. 最大公约数、最小公倍数

int gcd(int a,int b)//最大公约数
{if(b==0) return a;return gcd(b,a%b);
}
//gcd(a,b)=gcd(b,a%b)=====>>>>>>gcd(a,0)=a;
//(16,24)=(24,16%24)==>(24,8)=(8,24%8)=(8,0)=0;
int lcm(int a,int b)//最小公倍数  = a*b/gcd(a,b)
{return a/gcd(a,b)*b;
}

4. 扩展欧几里得算法

满足ax+by=(a,b) 时,可以用扩展欧几里得算法求出一组特解 ( x0 , y0 )

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

ax+by = bx+(a%b)y = ay + ( x -a/b*y)b

于是我们可以不断递归至b=0,使得 ax+by=(a,0)=a,x=1,y=0;

5. ax+by=n

5.1 有解条件

当且仅当n是gcd(a,b)的倍数时,才有整数解。当且仅当n是gcd(a,b)的倍数时,才有整数解。 当且仅当n是gcd(a,b)的倍数时,才有整数解。

5.2 求解步骤

1.判断ax+by=n是否有整数解,有解的条件是gcd(a,b)∣n2.求ax+by=d=(a,b)的一个解(x0,y0)3.在得到的ax0+by0=d两边同时乘n/d得到ax0∗n/d+by0∗n/d=n4.对照ax+by=n得到它的一个解x=x0∗n/d,y=y0∗n/d5.它的通解表达式为x=x+b/dy=y−a/d1.判断ax+by=n 是否有整数解,有解的条件是 gcd(a,b)|n\\ 2.求ax+by= d=(a,b) 的一个解 (x_0, y_0) \\ 3.在得到的 ax_0+by_0 = d 两边同时乘 n/d 得到 \ \ ax_0 *n/d+by_0 *n/d = n\\ 4.对照 ax+by=n 得到它的一个解 x = x_0 *n/d,\ \ y = y_0 *n/d \\ 5.它的通解表达式为 \ x=x+b/d\ \ \ \ y=y-a/d\\ 1.判断ax+by=n是否有整数解,有解的条件是gcd(a,b)∣n2.求ax+by=d=(a,b)的一个解(x0​,y0​)3.在得到的ax0​+by0​=d两边同时乘n/d得到  ax0​∗n/d+by0​∗n/d=n4.对照ax+by=n得到它的一个解x=x0​∗n/d,  y=y0​∗n/d5.它的通解表达式为 x=x+b/d    y=y−a/d

如果要求x的最小正整数解,令t=b/d ,x=(x%t+t)%t; 求y同理

5.3 代码

int solve(int a,int b,int n)  //ax+by=n
{int x,y;int d=exgcd(a,b,x,y);//x',y'if(n%d!=0) return -1;x=x*n/d;int t=b/d;//t<0if(t<0) t=-t;return (x%t+t)%t;  //x和y不一定同时到最小值
}

6. 同余方程

1.同余

两个整数a、b和正整数m ,如果a除以m所得的余数和b除以m所得的余数相等,即a %m=b%m.

称a和b对于m同余.m称为同余的模。同余的概念也可以这样理解: m l(a-b)。即a-b是m的整数倍。

例如 6|(16-4)16和4对6同余。同余的符号记为
a≡b(modm)a \equiv b(mod \quad m) a≡b(modm)

2.同余方程

ax≡b(modm)ax \equiv b(mod \quad m) ax≡b(modm)

ax−b是m的整数倍,即满足ax−b=my其中y可以是负数于是可以改写为ax+my=bax-b 是m的整数倍,即满足ax-b=my \ \ 其中y可以是负数\\ 于是可以改写为 ax+my=b ax−b是m的整数倍,即满足ax−b=my  其中y可以是负数于是可以改写为ax+my=b

于是解同余方程就变成了求解二元一次不定方程,用扩展欧几里得算法,有解条件是gcd(a,m)能整除b

7. 逆元

什么是逆元?百度百科:逆元

这里只讨论我们需要的乘法逆元:
满足ax≡1(modm)的x,称为a在模m下的逆元,即ax模m等于1满足ax \equiv 1(mod \ m)的x,称为a在模m下的逆元,即ax模m等于1 满足ax≡1(mod m)的x,称为a在模m下的逆元,即ax模m等于1

ax+my=1
ax+by=n=1
int slove(int a,int m)
{int x,y;exgcd(a,m,x,y);return (x%m+m)%m;
}

除法取模

逆元有什么用?

求(a/b)%m时,当a,b是很大的数时,作除法会损失精度

使用逆元可以避免除法:设k是b的逆元,则bk%m=1
(ab%m)=(ab%m)∗bk%m=ak%m(\frac{a}{b}\% m)=(\frac{a}{b}\% m)*bk\%m=ak\%m (ba​%m)=(ba​%m)∗bk%m=ak%m
于是a/b就变成了ak,是不是很nice

扩展欧几里得算法及其简单应用相关推荐

  1. 欧几里得算法和扩展欧几里得算法的简单例子

    欧几里得算法: #include <cstdio> #include <cstdlib>/* * 挑战...p113 */struct point{ //格点int x;int ...

  2. 欧几里得算法及扩展欧几里得算法简单解释

    欧几里得算法: 解释:给定两个自然数,求出两个自然数的最大公约数.也叫--辗转相除法 过程:1.给定两个自然数a.b 2.a == 0 时 gcd(a,b)= b:b == 0 时 gcd(a,b) ...

  3. 欧几里得算法扩展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  4. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  5. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  6. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解

    欧几里德算法: 复习:求最大公约数算法(欧几里得算法.也叫辗转相除法).欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd ...

  7. 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)

    扩展欧几里得算法及其应用 问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B).这里提 ...

  8. 扩展欧几里得算法 求解 丢番图方程

    丢番图方程: 有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行. a * x + b * y = c  ( 其中所有数均为整数, 已知 x, y, c )        例如:鸡兔同笼问 ...

  9. 扩展欧几里得算法、乘法逆元与中国剩余定理

    文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...

  10. 欧几里得扩展欧几里得算法及相关的数学证明

    //欧几里得算法求最大公约数 int gcd(int m,int n) {int u0=m,u1=n,t;if( u0<u1 )// 保证u0>=u1u0^=u1,u1^=u0,u0^=u ...

最新文章

  1. Mybatis自定义排序
  2. CVPR新规严禁审稿期间公开宣传论文,可发arXiv,LeCun:疯了吧!
  3. 真不夸张,90%的人都被需求整“哭”过
  4. makefile变量赋值
  5. PAT-1124. Raffle for Weibo Followers (20)
  6. Spring IOC 知识点总结,写得太好了!
  7. html实现全选 反选,jquery实现全选、不选、反选的两种方法
  8. Trustdata:映客直播站稳行业第一梯队 用户粘性增长明显
  9. c++分治法求最大最小值实现_快速实现分组统计,均数标准差 中位数(四分位数间距) 最大值 最小值,非常全...
  10. RUNOOB python练习题5
  11. 易支付系统源码_刷脸支付系统源码,插件源码合作模式有哪些,采购源码需要注意什么...
  12. 直接插入排序、冒泡排序实验详解【数据结构实验报告】
  13. RS232通讯数据解析C#
  14. 给刚做网站不久的草根站长们
  15. 乌拉、利用python实现tree命令
  16. 第1章 数据库系统概论-单元测验-数据库原理及应用
  17. linux如何显示文件后缀名,如何在win7系统中显示文件后缀名、扩展名
  18. IELAB网络实验室 理解IGRP协议
  19. 微信小程序云函数如何返回参数?
  20. 平均电流型LED降压恒流驱动器 常用恒流IC

热门文章

  1. 如何利用计算机技术检索文献,文献检索过程作业怎么写
  2. imx6ull 485 调试
  3. 【开源】一个有趣的文字冒险游戏
  4. html中css的注释怎么写,html注释和css、js注释的写法,使用场景以及性能优化问题...
  5. Nvivo用法--数据可视化工具
  6. 卫星影像的分辨率与成图比例尺
  7. 《计算机网络(第七版)谢希仁 编著》部分课后答案
  8. 水电缴费系统php源码_php水电费缴费管理系统
  9. SPSS26中文免费版下载和安装教程
  10. java开发入行真功夫pdf_Visual C++开发入行真功夫