【数论】同余(五):多元线性同余方程

同余问题共7part,我的博客链接:

多元线性同余方程

形如: a 1 x 1 + a 2 x 2 + ⋯ + a n x n ≡ b ( m o d    m ) a_1x_1+a_2x_2+\cdots+a_nx_n\equiv b(\mod m) a1x1+a2x2++anxnb(modm)

a 1 x + a 2 y = gcd ⁡ ( a 1 , a 2 ) a_1x+a_2y=\gcd(a_1,a_2) a1x+a2y=gcd(a1,a2) 有解可知左式能表达 c gcd ⁡ ( a 1 , a 2 ) , c ∈ N c\gcd(a_1,a_2),c\in N cgcd(a1,a2),cN ;引入 a 3 a_3 a3 ,则 g c d ( a 1 , a 2 ) x + a 3 y gcd(a_1,a_2)x+a_3y gcd(a1,a2)x+a3y 可以表示 c gcd ⁡ ( a 1 , a 2 , a 3 ) , c ∈ N c\gcd(a_1,a_2,a_3),c\in N cgcd(a1,a2,a3),cN 。以此类推, a 1 x 1 + a 2 x 2 + ⋯ + a n x n a_1x_1+a_2x_2+\cdots+a_nx_n a1x1+a2x2++anxn 可以表达 c gcd ⁡ ( a 1 , a 2 , ⋯   , a n ) , c ∈ N c\gcd(a_1,a_2,\cdots,a_n),c\in N cgcd(a1,a2,,an),cN ,因此有解的条件为 gcd ⁡ ( a 1 , a 2 , ⋯   , a n , m ) ∣ b \gcd(a_1,a_2,\cdots, a_n,m)\mid b gcd(a1,a2,,an,m)b

一个很好理解的推导:我们将 m m m 添加到 a a a 数列中,仍设数量为 n n n 。设 d = gcd ⁡ ( a 1 , a 2 , ⋯   , a n ) , d 1 = gcd ⁡ ( a 1 , a 2 , ⋯   , a n − 1 ) d=\gcd(a_1,a_2,\cdots, a_n),d_1=\gcd(a_1,a_2,\cdots, a_{n-1}) d=gcd(a1,a2,,an),d1=gcd(a1,a2,,an1) ,于是有 gcd ⁡ ( d 1 , a n ) = d \gcd(d_1,a_n)=d gcd(d1,an)=d ,则原式转化为 a n x n + d 1 k = b a_nx_n+d_1k=b anxn+d1k=b ,可以通过前面一元线性同余方程的解法解出 x n , k x_n,k xn,k ,则问题转化为 a 1 x 1 + a 2 x 2 + ⋯ + a n − 1 x n − 1 = d 1 ∗ k a_1x_1+a_2x_2+\cdots+a_{n-1}x_{n-1}=d_1*k a1x1+a2x2++an1xn1=d1k,仍采取相同的解法。

O ( n 2 ) O(n^2) O(n2) 求每次的 gcd ⁡ \gcd gcd 显然不现实。设 d i = gcd ⁡ ( a 1 , a 2 , ⋯   , a i ) d_i=\gcd(a_1,a_2,\cdots,a_{i}) di=gcd(a1,a2,,ai) x [ 1... n ] x[1...n] x[1...n] 表示解(从 1 1 1 标号, a [ n + 1 ] a[n+1] a[n+1] m m m )则可以求解 d i X i + a i + 1 y i = d i + 1 d_iX_i+a_{i+1}y_i=d_{i+1} diXi+ai+1yi=di+1 X i , y i X_i,y_i Xi,yi
观察最后一个式子: d n X n + a n + 1 y n = d n + 1 d_{n}X_{n}+a_{n+1}y_{n}=d_{n+1} dnXn+an+1yn=dn+1 要求解答案,等式两边乘上 c = b d n + 1 c=\frac{b}{d_{n+1}} c=dn+1b ,所以 x n + 1 = y n c b − a n + 1 x n + 1 = d n X n c x_{n+1}=y_{n}c\\b-a_{n+1}x_{n+1}=d_{n}X_{n}c xn+1=yncban+1xn+1=dnXnc 则前一个式子 d n − 1 X n − 1 + a n y n − 1 = d n d_{n-1}X_{n-1}+a_{n}y_{n-1}=d_{n} dn1Xn1+anyn1=dn 要求解答案,等式两边乘上 c ′ = c X n c'=cX_{n} c=cXn ,依次求解即可。

// 求解a1x1+a2x2+...+anxn==b mod m,a从1开始标号
int X[N], y[N];
bool mod_Xn_equation(int a[], int b, int m, int n, int x[])
{
    a[n + 1] = m;
    int d = a[1];
    for (int i = 2; i <= n + 1; i++)
        exgcd(d, a[i], X[i - 1], y[i - 1]);
    if (b % d)
        return false;
    int c = b / d;
    x[n + 1] = y[n] * c;
    y[0] = 1;
    for (int i = n; i >= 1; i--)
    {
        c = (c * X[i] % m + m) % m;
        x[i] = (y[i - 1] * c % m + m) % m;
    }
    return true;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同余方程数论中常见的问题,欧拉定理是求解同余方程的一种重要方法。假设a、m是正整数,且它们互质,即gcd(a,m)=1,则欧拉定理表示:a^(φ(m)) ≡ 1 (mod m),其中φ(m)表示小于等于m的正整数中与m互质的数的个数(欧拉函数)。这个公式可以用来求解同余方程a^x ≡ b (mod m)。 具体步骤如下: 1. 求出φ(m)的值。如果m是质数,则φ(m)=m-1;如果m不是质数,则φ(m)=m×(1-1/p1)×(1-1/p2)×...×(1-1/pn),其中p1、p2、...、pn是m的所有质因数。 2. 判断a和m是否互质,如果不互质则无解,如果互质则继续。 3. 利用欧拉定理,求出a^(φ(m))的余数r。 4. 如果b不等于r,则无解;如果b等于r,则设x=k×φ(m)+j,其中k为非负整数,j为0到φ(m)-1之间的整数。则a^x ≡ a^(k×φ(m))×a^j ≡ (a^(φ(m)))^k × a^j ≡ 1^k × b ≡ b (mod m)。 因此,同余方程a^x ≡ b (mod m)的解为x=k×φ(m)+j,其中k为非负整数,j为0到φ(m)-1之间的整数。 例如,假设要解同余方程2^x ≡ 5 (mod 17),则φ(17)=16,2和17互质,因此2^(φ(17)) ≡ 1 (mod 17),即2^16 ≡ 1 (mod 17)。因此,2^x ≡ 5 (mod 17)的解为x=k×φ(17)+j,其中k为非负整数,j为0到15之间的整数。将2^x在模17意义下的余数列出来如下: 2^0 mod 17 = 1 2^1 mod 17 = 2 2^2 mod 17 = 4 2^3 mod 17 = 8 2^4 mod 17 = 16 2^5 mod 17 = 13 2^6 mod 17 = 7 2^7 mod 17 = 14 2^8 mod 17 = 9 2^9 mod 17 = 18 ≡ 1 (mod 17) 2^10 mod 17 = 2×2^9 ≡ 2 (mod 17) 2^11 mod 17 = 4×2^9 ≡ 4 (mod 17) 2^12 mod 17 = 8×2^9 ≡ 8 (mod 17) 2^13 mod 17 = 16×2^9 ≡ 16 (mod 17) 2^14 mod 17 = 13×2^9 ≡ 13 (mod 17) 2^15 mod 17 = 7×2^9 ≡ 7 (mod 17) 因此,2^x ≡ 5 (mod 17)的解为x=k×φ(17)+j,其中k为非负整数,j=14,因为2^14 ≡ 13 (mod 17)。因此,2^x ≡ 5 (mod 17)的解为x=16k+14,其中k为非负整数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值