求解模线性方程

本文详细介绍了线性不定方程与模线性方程的求解方法,包括求解线性不定方程的通解及模线性方程的解的存在性和求解过程。通过扩展欧几里得算法找到特解,并推导出通解的表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:https://www.cnblogs.com/ACSeed/archive/2013/01/31/2887248.html

 

1)求解线性不定方程

  ax + by = c

  先求出一组解, 然后考虑如何表示通解, 设d = gcd(a, b), 假设c不是d的倍数, 则左边是d的倍数而右边不是, 则方程无解, 所以方程有解当且仅当d | c.

  设c = c' * d, 我们先考虑方程  ax + by = d, 这样由扩展gcd便可求出一组解 (x', y'), 则(c'x', c'y')就是原方程的一组解,然后考虑通解:

  假设有两组解(x1, y2) ,  (x2, y2), 有  ax1 + by1 == ax2 + by2 = c,   移项得:  a(x1 - x2) == b(y2 - y1),  消去d后有  a'(x1 - x2) == b'(y2 - y1),

  此时a' 和 b' 互素, 所以(x1 - x2)一定是b'的倍数, 而(y2 - y1)一定是a'的倍数, 由此可得到通解:

  给一组特解(x, y), 通解为(x - kb', y + ka').

2)求解模线性方程

  ax = b(mod n)

  其实方程等价于 ax - ny = b, 标准模线性方程,但是得考虑剩余系。

  算法导论上有两个定理:

  定理一:设d = gcd(a, n), 假定对整数x', y', 有d = ax' + ny', 如果d | b, 则方程ax = b(mod)有一个解的值为x0, 满足:、

      x0 = x'(b / d)(mod n)

  定理二:假设方程ax = b(mod n)有解, x0是方程的任意一个解, 则方程对模n恰有d个不同的解, 分别为: xi = x0 + i * (n / d), 其中 i = 1,2,3......d - 1

  有了这两个定理, 解方程就不难了。

复制代码

 1 void linear_mod_equation (int a, int b, int n, int *sol)
 2 {
 3     int d, x, y;
 4     gcd (a, n, d, x, y );
 5     if (b % d) d = 0;
 6     else
 7     {
 8         sol [0] = x * ( b / d ) % n ;
 9         for (int i = 1; i < d; ++i)
10             sol[i] = (sol[i - 1] + n / d) % n ;
11     }
12 }

复制代码

  如果gcd(a,  n) == 1, 则方程有唯一解, 即解为a的逆。

1 ll inv(ll a, ll n)
2  {
3      ll d, x, y;
4      gcd(a, n, d, x, y);
5      return d == 1 ? (x % n + n) % n : -1;
6  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值