8.12.21 ACM-ICPC数学 数论 剩余
定义
前置知识:模运算
剩余是数论中一个基本且重要的概念,通常与模运算相关。对于任意整数 𝑎a 和正整数 𝑚m,我们可以定义 𝑎mod 𝑚amodm 为 𝑎a 除以 𝑚m 后的余数。
形式化地,定义如下: 𝑎≡𝑏(mod𝑚)a≡b(modm) 表示 𝑎a 和 𝑏b 被 𝑚m 除后的余数相同,即存在整数 𝑘k 使得 𝑎−𝑏=𝑘𝑚a−b=km。
性质
同余的基本性质
-
自反性:对任意整数 𝑎a 和正整数 𝑚m,有 𝑎≡𝑎(mod𝑚)a≡a(modm)
-
对称性:如果 𝑎≡𝑏(mod𝑚)a≡b(modm),则 𝑏≡𝑎(mod𝑚)b≡a(modm)
-
传递性:如果 𝑎≡𝑏(mod𝑚)a≡b(modm) 且 𝑏≡𝑐(mod𝑚)b≡c(modm),则 𝑎≡𝑐(mod𝑚)a≡c(modm)
同余的运算性质
-
加法性质:如果 𝑎≡𝑏(mod𝑚)a≡b(modm) 且 𝑐≡𝑑(mod𝑚)c≡d(modm),则 𝑎+𝑐≡𝑏+𝑑(mod𝑚)a+c≡b+d(modm)
-
减法性质:如果 𝑎≡𝑏(mod𝑚)a≡b(modm) 且 𝑐≡𝑑(mod𝑚)c≡d(modm),则 𝑎−𝑐≡𝑏−𝑑(mod𝑚)a−c≡b−d(modm)
-
乘法性质:如果 𝑎≡𝑏(mod𝑚)a≡b(modm) 且 𝑐≡𝑑(mod𝑚)c≡d(modm),则 𝑎⋅𝑐≡𝑏⋅𝑑(mod𝑚)a⋅c≡b⋅d(modm)
-
乘方性质:如果 𝑎≡𝑏(mod𝑚)a≡b(modm),则对任意正整数 𝑘k 有 𝑎𝑘≡𝑏𝑘(mod𝑚)ak≡bk(modm)
应用
同余在密码学中的应用
同余关系在现代密码学中有着广泛的应用,特别是在公钥密码系统和数字签名算法中。同余的性质保证了在模数上的运算结果的可预测性和安全性。
同余在算法竞赛中的应用
在算法竞赛中,同余运算常用于解决涉及大数计算的问题。通过利用同余性质,可以有效地减少计算量,避免溢出问题。
示例
同余方程的解法
给定一个同余方程: 𝑎𝑥≡𝑏(mod𝑚)ax≡b(modm) 我们可以通过扩展欧几里得算法求解。若 gcd(𝑎,𝑚)∣𝑏gcd(a,m)∣b,则方程有解,否则无解。假设 gcd(𝑎,𝑚)=𝑑gcd(a,m)=d,则方程等价于: 𝑎𝑑𝑥≡𝑏𝑑(mod𝑚𝑑)dax≡db(moddm)
示例代码
以下是求解同余方程的 C++ 代码示例:
#include <iostream>
#include <tuple>
using namespace std;
// 扩展欧几里得算法
tuple<int, int, int> extended_gcd(int a, int b) {
if (b == 0) return make_tuple(a, 1, 0);
int d, x, y;
tie(d, x, y) = extended_gcd(b, a % b);
return make_tuple(d, y, x - (a / b) * y);
}
// 求解 ax ≡ b (mod m)
bool solve_congruence(int a, int b, int m, int &x) {
int d, x1, y1;
tie(d, x1, y1) = extended_gcd(a, m);
if (b % d != 0) return false;
x = (x1 * (b / d) % m + m) % m;
return true;
}
int main() {
int a, b, m;
cout << "Enter a, b, m: ";
cin >> a >> b >> m;
int x;
if (solve_congruence(a, b, m, x)) {
cout << "Solution: x = " << x << endl;
} else {
cout << "No solution" << endl;
}
return 0;
}
习题
- 求解 3𝑥≡6(mod9)3x≡6(mod9) 的解。
- 证明若 𝑎≡𝑏(mod𝑚)a≡b(modm) 且 𝑐≡𝑑(mod𝑚)c≡d(modm),则 𝑎+𝑐≡𝑏+𝑑(mod𝑚)a+c≡b+d(modm)。
- 编写一个函数,输入两个整数 𝑎a 和 𝑚m,返回 𝑎a 的模 𝑚m 的逆元(若存在)。
通过以上定义、性质、应用和示例代码的讲解,相信你对同余和剩余的概念有了更深入的理解。