线性同余方程
如何解方程ax\equiv b({\rm mod}\ m)呢?因为ax-b|m, 故令ax-b=-ym,即ax+my=b。根据Bezout定理,该方程有解当且仅当\gcd(a,m)|b。我们把等式两边同乘以\frac{\gcd(a,m)}{b},得到ax_0+my_0=\gcd(a, m)。这个方程可以用扩展欧几里得算法求得得到x_0。等式是怎么乘的,就再把它除回来,也就是x=x_0\cdot \frac{b}{\gcd(a,m)}。关于方程的通解,ax+k{\rm lcm}(a,m)+my-k{\rm lcm}(a,m)=b,{\rm lcm}(a,m)=\frac{am}{\gcd(a,m)},也就是a(x+k\frac{m}{\gcd(a,m)})+m(y+k\frac{a}{\gcd(a,m)})=b,所以方程的通解为所有与x同余\frac{m}{\gcd(a,m)}的数。若要求最小正整数解,令p=\frac{m}{\gcd(a,m)},然后x=(x%p+p)%p即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ll Exgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll d = Exgcd(b, a%b, x, y); ll tx = x; x = y; y = tx - (a / b) * y; return d; } ll Gcd(ll a, ll b) { return b ? Gcd(b, a%b) : a; } ll Eq(ll a, ll b, ll m) { ll gcd = Gcd(a, m); if (b%gcd) return -1; ll x, y; Exgcd(a, m, x, y); x = x * b / gcd; ll p = m / gcd; return (x%p+p) % p; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步