线性同余方程
定义
形如
的方程称为 线性同余方程(Congruence Equation)。其中,
用逆元求解
首先考虑简单的情况,当
此时可以计算
证明
接下来考虑
设
当
如果
其中
很明显,
总之,线性同余方程的 解的数量 等于
用扩展欧几里得算法求解
根据以下两个定理,可以求出线性同余方程
定理 1:线性同余方程
其中
应用扩展欧几里德算法可以求解该线性不定方程。根据定理 1,对于线性不定方程
于是找到方程的一个解。
定理 2:若
并且对任意整数
根据定理 2,可以从已求出的一个解,求出方程的所有解。实际问题中,往往要求出一个最小整数解,也就是一个特解
其中有
如果仔细考虑,用扩展欧几里得算法求解与用逆元求解,两种方法是等价的。
实现
=== "C++"
```cpp
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 temp = x;
x = y;
y = temp - a / b * y;
return d;
}
bool liEu(int a, int b, int c, int& x, int& y) {
int d = ex_gcd(a, b, x, y);
if (c % d != 0) return 0;
int k = c / d;
x *= k;
y *= k;
return 1;
}
```
=== "Python"
```python
def ex_gcd(a, b ,x, y):
if b == 0:
x = 1; y = 0
return a
d = ex_gcd(b, a % b, x, y)
temp = x
x = y
y = temp - a // b * y
return d
def liEu(a, b, c, x, y):
d = ex_gcd(a, b, x, y)
if c % d != 0:
return 0
k = c // d
x = x * k
y = y * k
return 1
```
本页面主要译自博文 Модульное линейное уравнение первого порядка 与其英文翻译版 Linear Congruence Equation。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
习题
贡献者:@Menci@queenwen@WenzelTian@Great-designer@Ir1dXD
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用