裴蜀定理

对于\(a,b\in N^*, x, y\in Z\),方程\(ax+by=k\)当且仅当\(gcd(a, b)|k\)时有解。

证明:

必要性显然。

充分性:只需证明当\(k=gcd(a, b)\)有解。

设\(s\)为令方程有解的最小\(k\)值,\(gcd(a, b) = d\),首先有\(d|s\)。

设$t = \lfloor \frac{a}{s} \rfloor,r = a \bmod s $

则\(r = a - t * s = a - (ax + by)*t = (1-tx)*a + byt\)

那么\(r\)也是\(a,b\)的线性组合,即存在\(x, y\)令\(ax + by = r\)有整数解。

又\(r \in [0, s)\)

\(\therefore r = 0\)

即\(s|a\),同理\(s|b\)。

\(\therefore s|d\),即\(s = d\)

证毕。


扩展欧几里得算法

​ 裴蜀定理告诉我们,方程\(ax + by = k\)当且仅当\(gcd(a, b)|k\)时存在无数组整数解。扩展欧几里得算法可以递归求出该方程的一组解,结合各组解之间的关系便有了解该方程的一般方法。

基于欧几里得算法的核心性质:\(gcd(a, b) = gcd(b, a \bmod b) (b \neq 0)\)

如果找到\(bx + (a \bmod b)y = d\)的一组解\(x_1, y_1\),并且通过待定系数法确定\(x,y\)和\(x_1, y_1\)的关系,我们就可以解出\(x, y\)了。

解:

对于方程\(dx + 0*y = d\)(边界),显然有一组解\((1, 0)\)

设\(gcd(a, b) = d\),对于方程\(ax + by = d\),我们递归求解得方程\(bx_1 + (a \bmod b)y_1 = d\)的解。

设\(\lfloor \frac{a}{b} \rfloor = q\),则\(a \bmod b = a - q * b\)

有\(bx_1 + (a - qb)y_1 = d\)

即\(ay_1 + b * (x_1 - qy_1) = d\)

对比系数得\(
x=y_1,y = x_1 - \lfloor \frac{a}{b} \rfloor * y_1\)。

​函数的递归结构由此确定,最终返回的为方程\(ax + by = gcd(a, b)\)的一组解\(x_0, y_0\)。

如果\(\frac{k}{d} = s\),那么\(x = sx_0, y = sy_0\)。

现在我们着手来考虑方程\(ax + by = k (gcd(a, b)|k)\)通解的形式。

不妨设通过扩欧得到的一组解为\(x_0, y_0\),任意解\(x = x_0 + \Delta x,y = y_0 + \Delta y\)

消元得\(a(x - x_0) + b(y - y_0) = 0\)

即\(a\Delta x = -b\Delta y\)

设\(a = pd, b = qd\)

则\(\frac{\Delta x}{\Delta y} = -\frac{q}{p}\)

最终得到通解的形式为\(x = x_0 + kq, y = y_0 - kp (k \in Z)\)

解毕。

代码:

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

【初等数论】裴蜀定理&扩展欧几里得算法的更多相关文章

  1. 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)

    欧几里得算法 又称辗转相除法 迭代求两数 gcd 的做法 由 (a,b) = (a,ka+b) 的性质:gcd(a,b) = gcd(b,a mod b) int gcd(int a,int b){ ...

  2. 扩展欧几里得算法(EXGCD)学习笔记

    0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...

  3. 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))

    我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...

  4. 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树

    题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...

  5. 【bzoj2257】[Jsoi2009]瓶子和燃料 扩展裴蜀定理+STL-map

    题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.从中选出 $k$ 个瓶子,使得能够通过这 $k$ 个瓶子凑出 ...

  6. 【bzoj1441】Min 扩展裴蜀定理

    题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S ...

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

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 辗转相除法 & 裴蜀定理

    2018-03-11 17:39:22 一.辗转相除法 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法.辗转相除法首次出现于欧几里得的&l ...

随机推荐

  1. windows下安装RabbitMq和常用命令

    ----RabbitMq安装-----windows下安装:(1)首先windows下安装好了erlang和rabbitmq.如下地址同时下载和安装:Erlang:http://www.erlang. ...

  2. JUC---05线程间通信(一)

    一.普通的线程间通信 1.synchronized实现 package com.jenne.mydemo; class ShareDataOne { private int number = 0; p ...

  3. Java入门(3)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 在程序中使用字符值时,必须用单引号将赋给变量的字符值括起来,对于字符串必须用双引号括起来. int整型-2.14*10^9~2.14*10 ...

  4. C++在C的基础上改进了哪些细节

    C++ 是在C语言的基础上改进的,C语言的很多语法在 C++ 中依然广泛使用,例如:  C++ 仍然使用 char.short.int.long.float.double 等基本数据类型:   ...

  5. c#mysql数据库

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. layui下拉框实现级联

    <!DOCTYPE html><html><head> <meta charset="utf-8" /> <link href ...

  7. 内网渗透 day5-msf本地提权(windows)

    msf本地提权 目录 1. 利用uac提权 1 2. 绕过uac认证 2 3. 利用windows本地提权漏洞进行提权 4 1. 利用uac提权 前提与目标机建立会话连接 seach local/as ...

  8. ExecutorService的invokeAny方法注意

    package com.msxf.datasource.thirdpart.service.extface; import java.util.HashSet; import java.util.Li ...

  9. npm pm2

    安装 npm install -g pm2 用法 $ npm install pm2 -g # 命令行安装 pm2 $ pm2 start app.js -i 4 # 后台运行pm2,启动4个app. ...

  10. CSS之calc()

    calc() 函数支持任意CSS长度单位的混合计算,遵循标准数学运算优先级规则,可以动态计算长度值.注意,calc()函数内部的运算符两侧各加一个空白符,否则会产生解析错误. calc()使用的难点在 ...