线性丢番图方程Linear Diophantine equation,名字听得非常高大上的。但是实际上很简单的,线性丢番图就是下面这种形式的方程:
ax+by=cax+by=c ax+by=c
  公式中a,b,c都是已知数,x和y是未知数,然后求x和y的整数解。这种有两个未知数,却只有一个方程的情况,解不止一个。这种解不止一个的情况,一般是用字母t或k作为可变的整数来表示通解的形式。首先我们不考虑a和b为零的场景,存在0的场景下,这个方程就没什么意义了。
  举个例子:
9x+100y=19x+100y=1 9x+100y=1
  其中一个解为
x=−11y=19×−11+100×1=1x=-11\\ y=1\\ 9\times-11+100\times 1=1 x=−11y=19×−11+100×1=1
  线性丢番图方程和前面我写的扩展欧几里得法的方程形式很类似。扩展欧几里得法方程是以下形式:
ax+by=gax+by=g ax+by=g
  扩展欧几里得法方程可以说是线性丢番图方程的特殊形式,因为g是a和b的最大公约数。而线性丢番图方程的c是一个更一般的值(后面会讲实际上是g的整数倍)。

一 与同余的联系(觉得难可以略过)

  首先这个方程组可以转变为同余方程组:
ax≡c(modb)bx≡c(moda)ax\equiv c(mod \ b)\\ bx\equiv c(mod \ a)\\ ax≡c(mod b)bx≡c(mod a)
  这个步骤我不能跳过,所以推导一下:
∵ax=c−by∴c=ax−by(cmodb)=(ax−by)(modb)=(axmodb)∴c≡ax(modb)\because ax = c-by\\ \therefore c = ax - by\\ (c \ mod \ b) = (ax - by) (mod \ b)= (ax \ mod \ b)\\ \therefore c \equiv ax (mod \ b) ∵ax=c−by∴c=ax−by(c mod b)=(ax−by)(mod b)=(ax mod b)∴c≡ax(mod b)
  当a、b互质的时候,有下列公式:
x≡ca−1(modb)x \equiv ca^{-1}(mod \ b) x≡ca−1(mod b)
  a−1a^{-1}a−1是aaa模b的模乘逆元,也就是a⋅a−1≡1(modb)a\cdot a^{-1}\equiv 1(mod\ b)a⋅a−1≡1(mod b)。上式的证明很简单,两边同时乘以a,有:
ax≡aca−1(modb)≡aa−1c(modb)≡1⋅c(modb)ax \equiv aca^{-1}(mod \ b)\equiv aa^{-1}c(mod \ b)\equiv 1\cdot c(mod \ b) ax≡aca−1(mod b)≡aa−1c(mod b)≡1⋅c(mod b)
  当a、b不互质的时候,只有c能被a与b的最大公约数整除时才有解,有:
g=gcd(a,b)x≡cg(ag)−1(modbg)y=c−axbg=gcd(a,b)\\ x\equiv\frac c g (\frac a g)^{-1}(mod \ \frac b g) \\ y=\frac{c-ax}{b} g=gcd(a,b)x≡gc​(ga​)−1(mod gb​)y=bc−ax​
  所以说线性丢番图方程可以转换为线性同余方程组,用中国剩余定理去解,但是我们不需要这么做。

二 计算方法

  线性丢番图方程ax+by=cax+by=cax+by=c,有c能被a与b的最大公约数整除时才有解。这个的证明超级简单啊。设g是a和b的最大公约数,那么ax是g的倍数,by也是g的倍数,那么c一定要是g的倍数,否则没有整数解。而且有多个解,但是通解是特解的同余类。这个有点像微分方程,通解等于特解加上一个可变的部分。
  举个例子,6x+9y=216x+9y=216x+9y=21,其中一个特解是x=2,y=1x=2,y=1x=2,y=1,通解是x=3t+2,y=−2t+1x=3t+2,y=-2t+1x=3t+2,y=−2t+1,可以看出通解中包含了特解。
  在前面,我们学过扩展欧几里得法可以计算如下的方程:
ax+by=gax+by=g ax+by=g
  扩展欧几里得法(如果没学过可以看我的文章《3 模乘逆元-扩展欧几里得法》)要求g必须是a和b的最大公约数,否则不能计算。而对于方程ax+by=cax+by=cax+by=c,c不一定是a或b的最大公约数g,但一定是g的整数倍。所以我们可以这样计算:
  第一步,先用扩展欧几里得法解出一组数xgx_gxg​和ygy_gyg​,也就是解下面的方程:
axg+byg=gax_g+by_g=g axg​+byg​=g
  第二步,因为我们知道c是g的整数倍,上面的方程两边同时乘以cg\frac c ggc​:
axgcg+bygcg=gcg=cax_g\frac c g+by_g\frac c g=g\frac c g=c axg​gc​+byg​gc​=ggc​=c
  所以我们就找到了一个特解:
x0=xgcgy0=ygcgx_0=x_g\frac c g\\ y_0=y_g\frac c g x0​=xg​gc​y0​=yg​gc​
  那特解呢?我们把通解代入方程然后再加上俩个特殊的数字
a(x0+kbg)+b(y0−kag)=ax0+by0+kabg−kabga(x_0+\frac{kb}{g})+b(y_0-\frac{ka}{g})=ax_0+by_0+\frac{kab}g-\frac{kab}g a(x0​+gkb​)+b(y0​−gka​)=ax0​+by0​+gkab​−gkab​
  所以特解就是(k为任意整数):
x=x0+kbgy=y0−kagx=x_0+\frac{kb}{g}\\ y=y_0-\frac{ka}{g} x=x0​+gkb​y=y0​−gka​
  读者会诧异为什么要除以g,虽然不除于g也是解,但是除以g是为了找出所有的解,只有包含了所有的解才能叫通解all solutions嘛。

三 代码实现

  我用python实现的,但是我把以前的扩展欧几里得法代码修改了下,增加了一个返回值最大公约数g。因为无论是校验方程是否可解,还是求特解和表示通解,这个g都特别重要。

def extend_euclid(a: int, b: int):if a < b:x, y, g = extend_euclid(b, a)return y, x, g# 保存a/b的系数coefficients = []while b != 0:coefficients.append(a // b)a, b = b, a % b# 循环代入x, y = 1, 0coefficients.reverse()for i in coefficients:x, y = y, x - y * ireturn x, y, adef diophantine(a, b, c):x_g, y_g, g = extend_euclid(a, b)if c % g != 0:raise 'No solutions'return x_g * c // g, y_g * c // g, b // g, -a // gif __name__ == '__main__':x0, y0, xk, yk = diophantine(6, 9, 27)print(f'solution is x ={x0} {"+" if xk > 0 else ""}{xk}t, y = {y0} {"+" if yk > 0 else ""}{yk}t')

  测试结果:

solution is x = -9 +3t, y = 9 -2t

  测试结果完全正确,哦,耶,挑战下一数论题目。

2.4 线性丢番图方程相关推荐

  1. 知识点 - 线性丢番图方程 Linear Diophantine Equations

    知识点 - 线性丢番图方程 Linear Diophantine Equations 解决问题类型: 对于不定方程(a,b,c是给定参数,x,y为系数) ax+by=cax + by = c ax+b ...

  2. 线性丢番图方程 --算法竞赛专题解析(21):数论

    本系列文章将于2021年整理出版.前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当   作者签名书:点我 公众号同步:算法专辑    暑假福利:胡说三国 有建议请加QQ ...

  3. 线性丢番图方程的C++实现

    阅读<密码学与网络安全>这本书,看到线性丢番图方程,就结合之前看到的一些算法,写了一个得到解的程序,加深理解. 也就把代码贴在这里: void exEuclidean(int a,int ...

  4. 整除理论与线性丢番图方程相关

    一.整除的定义. 整除:对于两个自然数a,ba,ba,b,若存在一个自然数xxx满足ax=bax=bax=b,则称aaa整除bbb,记为a∣ba|ba∣b. 显然{N,∣}\{N,|\}{N,∣}构成 ...

  5. JAVA:实现线性丢番图方程求解器算法(附完整源码)

    JAVA:实现线性丢番图方程求解器算法 package com.thealgorithms.maths;import java.util.Objects;public final class Line ...

  6. 数论读书笔记——线性丢番图方程——解不定方程

    线性丢番图方程: 背景:当我们需要求解特定方程的整数解的时候,那么就得到了一个丢番图方程,这些方程是根据丢番图(diophantus)命名的.他写下了一些方程并将解限定在有理数域上.方程ax+by=c ...

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

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

  8. 【蓝桥杯】简单数论4——丢番图方程

    1.二元线性丢番图方程 方程ax +by = c被称为二元线性丢番图方程,其中a.b.c是已知整数,x.y是变量,问是否有整数解. ax + by= c实际上是二维x-y平面上的一条直线,这条直线上如 ...

  9. python【力扣LeetCode算法题库】365- 水壶问题(裴蜀等式)

    水壶问题 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许: ...

最新文章

  1. 结构体解决念数字问题
  2. 6.Java集成开发环境
  3. ES分布式机制的透明性,垂直扩容和水平扩容,数据rebalance,master节点,节点平等的分布式架构,shard和replica机制(学习)
  4. vue 接口数据排序_Vue 使用 axios 请求 mock 模拟接口的数据
  5. python中strip是什么意思啊_Python中的strip()的理解
  6. 积分上下限无穷_数学方法的思考和存在无穷多个孪生素数证明的思路
  7. 学习Identity Server 4的预备知识
  8. vb 获取系统声音的电平_专业音响系统中常见问题,看看你懂几个?
  9. 从Element ui看开发公共组件的三种方式
  10. 【恋上数据结构】基数排序、桶排序、休眠排序
  11. Rational Rose 2007安装使用教程
  12. tomcat6\webapps\manager does not exist or is not a readable directory
  13. docker 强制使用root进入容器
  14. 5G网速比4G快那么多,是否意味着4G即将淘汰?
  15. salesforce与微信集成(一)-- 如何配置微信和salesforce
  16. Matter协议与Zigbee
  17. 【hihocoder1430】 A Boring Problem
  18. 超实数(Hyper-reals)是什么人发明的?
  19. Docker百度云下载链接
  20. 什么是托管资源,什么是非托管资源

热门文章

  1. LSV又新增13个地质图!量测对比分析全都能搞定
  2. t00ls.php,php学习心历(2)-中文分词
  3. Lab 2 Bomb Lab
  4. 鼠标悬停出现二维码动画放大,url转二维码
  5. 2019迅雷校园招聘后端工程师面试总结
  6. 一道题讲懂SQL盲注 / [第一章 web入门]SQL注入-2
  7. error2203matlab,小编详解Win10安装MATLAB软件提示Internal error 2203的解决方法
  8. 单元测试 CI/CD
  9. 上海出租车价格计算器
  10. Arduino 驱动TM1638显示十位的共阳数码管