1.逆
求解一般形式的同余方程 ax≡b( mod m)ax\equiv b(\bmod m)ax≡b(modm),需要用到逆(Inverse)。
逆的概念
给定整数aaa,且满足gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1,称 ax≡1( mod m)ax\equiv1(\bmod m)ax≡1(modm) 的一个解为 aaa 模 mmm 的逆,记为 a−1a^{-1}a−1。
例如,8x≡1( mod 31)8x\equiv1(\bmod 31)8x≡1(mod31),有一个解是x=4x = 4x=4,444是888 模313131 的逆。所有解,如35,6635,6635,66 等,都是 888模 313131 的逆。
可以借助丢番图方程理解逆的概念,8x≡1( mod 31)8x\equiv1(\bmod 31)8x≡1(mod31) 即方程8x+31y=1,x=48x + 31y=1,x = 48x+31y=1,x=4 是888 模 313131 的逆,4×8−14\times8 - 14×8−1 能整除313131。
从逆的要求gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1可以看出,做竞赛题时,模 mmm 最好是一个大于aaa 的素数,才能保证 gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1。
2.求逆
有多种方法可以求逆。
1)扩展欧几里得算法求单个逆
下面的例题是求逆,即求解同余方程 ax≡1( mod m)ax\equiv1(\bmod m)ax≡1(modm)。
例题1 同余方程(求逆)(洛谷 P1082)
问题描述:求关于 x 的同余方程ax≡1( mod max\equiv1(\bmod max≡1(modm) 的最小正整数解。2≤a,m≤20000000002\leq a,m\leq20000000002≤a,m≤2000000000。
ax≡1( mod m)ax\equiv1(\bmod m)ax≡1(modm),即丢番图方程ax+my=1ax + my = 1ax+my=1,先用扩展欧几里得算法求出ax+my=1ax+my = 1ax+my=1的一个特解 x0x_0x0,通解是 x=x0+mnx = x_0+mnx=x0+mn。然后通过取模操作计算最小整数解(x0 mod m+m) mod m(x_0\bmod m + m)\bmod m(x0modm+m)modm,因为 m>0m>0m>0,可以保证结果是正整数。
long long mod_inverse(long long a, long long m){ //求逆
long long x, y;
extend_gcd(a, m, x, y);
return (x % m + m) % m; //保证返回最小正整数
}
int main(){
long long a, m; cin >> a >> m;
cout << mod_inverse(a, m);
return 0;
}
下面给出一道类似的习题。
例题2 C looooops(poj 2115)
问题描述:C 语言的循环语句 for(variable=A;variable!=B;variable+=C)for(variable = A; variable != B; variable += C)for(variable=A;variable!=B;variable+=C),当 variable==Bvariable == Bvariable==B 时结束循环。A、B、C 的数据类型的长度是 kkk 位,也就是说,当 variablevariablevariable 超过 kkk 位时,只保留 kkk 位,相当于对 2k2^k2k取模。给出 A、B、CA、B、CA、B、C 和kkk,判断循环是否能在有限次内结束,若能结束,则输出循环次数。
设循环次数为 xxx,(A+Cx) mod 2k=B(A + Cx)\bmod{2^k}=B(A+Cx)mod2k=B,这是同余方程 Cx=(B−A) mod 2kCx=(B - A)\bmod{2^k}Cx=(B

最低0.47元/天 解锁文章
702

被折叠的 条评论
为什么被折叠?



