解同余式ax ≡ c(mod m)

将式子变形为

ax-c=my

可以看出原式有解当且仅当线性方程ax-my=c有解

设g = gcd(a, m)

则所有形如ax-my的数都是g的倍数

因此如果g不整除c则原方程无解。

下面假设g整除c:

利用扩展欧几里得算法解出 au + mv =g 一个特解(u0, v0)

所以可用整数c/g乘上上式

au0*(c/g) + mv0*(c/g) = c

得到原式的解x0 = u0*(c/g)

解的个数:

假设x1是ax ≡ c(mod m)的其他解

ax1 ≡ ax2(mod m),所以m整除ax1 - ax2

所以(m/g)整除(a/g)(x1-x2)

因为(m/g)与(a/g)互质,所以(m/g)整除(x1-x2)

原方程的通解为x = x0 + k*(m/g)    (k = 0, 1, 2, …… g-1)

共g个

 1 void solve(int a, int c, int m)
 2 {
 3     int u0, v0;
 4     int g = ex_gcd(a, m, u0, v0);
 5     if(c%g != 0)
 6     {
 7         printf("The equation has no solution!\n");
 8         return;
 9     }
10     int i, x;
11     for(i=0; i<g; ++i)
12     {
13         x = c/g*u0 + m/g*i;
14         x = x % m;
15         if(x<0)
16             x+=m;
17         printf("%d\n", x);
18     }
19 }

代码君

解同余式ax ≡ c(mod m)

时间: 2024-08-19 03:38:52

解同余式ax ≡ c(mod m)的相关文章

POJ 2115 模线性方程 ax=b(mod n)

/* (x*c+a)%(2^k)==b →(x*c)%(2^k)==b-a 满足定理: 推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b. 推论2:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a,n),或者无解. 定理1:设d=gcd(a,n),假定对整数x和y满足d=ax+by(比如用扩展Euclid算法求出的一组解). 如果d | b,则方程ax=b(mod n)有一个解x0满足x0=x*(b/d) mod n .特别的设e=x0+

解同余式的最小解

我们知道欧几里得扩展定理是同余方程ax≡b(mod c)解得有力方法.这个方程可能有解也可能没有解,下面给出有解的条件: 定理:同余方程ax≡b(mod c)有解,当且仅当gcd(a,c)|b,且方程有gcd(a,c)个解. 原因是求ax≡b(mod c)可以转化为求ax+cy=b. 令:d=gcd(a,c),  k=c/d; 我们可以用扩展欧几里得求出x,y值.那么方程ax≡b(mod c)的一个特解:x0=x*(b/d)%c.并且它的d个解分别为: Xi=(x0+i*(k))%c,{i=0,

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: (1) 1. 实现该方程的解的MATLAB代码可以分为两种,一种是入门级别的,只是简单地计算出这道题即可,第二种是一种通用的代码,可以实现很多3x3矩阵的方程解,写好以后只需要改不同矩阵里的元素即可算出相应的解,需要建立在对MATLAB比较熟悉的基础上,具体如下: 第一种代码实现-入门级: A=[3

解不定方程ax+by=m的最小解

给出方程a*x+b*y=c,其中所有数均是整数,且a,b,c是已知数,求满足那个等式的x,y值?这个方程可能有解也可能没解也可能有无穷多个解(注意:这里说的解都是整数解)? 既然如此,那我们就得找出有解和无解的条件! 先给出定理:方程a*x+b*y=c有解,当且仅当 c%gcd(a,b)=0. 定理的证明很容易,如下: 证明: 若c%gcd(a,b)=0,则一定存在一个整数K,有c=K*gcd(a,b), 而我们知道a*x+b*y=gcd(a,b)一定存在解(x1, y1),所以就有K*(a*x

Codeforces7C-扩展欧几里德解线性方程(Ax+By+C=0)

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #include <iostream> #include <vector> #include <list> #include <stack> #include <queue> #include <

数学问题——拓展欧几里得算法

一.拓展欧几里得算法 该算法用来解决这样一个问题:给定两个非零整数 a 和 b,求一组整数解 (x,y) ,使得 ax + by = gcd(a,b) 成立,其中 gcd(a,b) 表示 a 和 b 的最大公约数. 递归边界:当 b 为 0 时,此时的 a 就等于 gcd,显然有 a*1+b*0=gcd 成立,此时 x=1,y=0: 递推公式:设当计算 gcd(a,b) 时,有 ax1 + by1 = gcd 成立:而在下一步计算gcd(b,a%b) 时,又有 bx2 + (a%b)y2 = g

同余运算及其基本性质

取模: a%b b定是正整数,尽管语言上b<0合法./b=0出现除0错  (a+b)mod n=((a mod n)+(b mod n)) mod n (a-b)mod n=((a mod n)-(b mod n)+n)mod n     //注意减法, a mod n 可能小于 b mod n 结果需加上n ab mod n=(a mod n)(b mod n)mod n 注意乘法,注意(a mod n)(b mod n)是否会溢出,用long long 保存中间结果 1 int mul_mo

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

欧几理德,扩展欧几里德和模线性方程组。

欧几里德算法: 即求两个整数的最大公约数的一种快捷算法.也就是通常所说的“辗转相除法”.给定两个整数 a, b.欧几里德最坏可以在log(max(|a|, |b|))的复杂度内求出a, b的最大公约数.时间复杂度的计算方法也很有意思, 详见<算法导论>. 证明欧几里德算法的正确性: a可以表示成a = kb + r,且 r = a mod b 我们要证明欧几里德算法的正确性 也即是证明 gcd(a, b) = gcd(b, a%b=r) 假设d是a,b的一个公约数,则有 d|a, d|b,而r