数论入门
数论
模运算和同余
定义模运算(mod) :\(a\%b = a - [a/b] * b;(b > 0)\)
定义同余 :若 \(a \equiv b(mod\ m)则 m | (a-b)\)
(注:下文省略mod m)
自反性:\(a \equiv a\)
对称性:若 \(a \equiv b\) 则 \(b \equiv a\)
传递性:若 \(a \equiv b\) 且 \(a \equiv c\) 则 \(b \equiv c\);
可加性:若 \(a \equiv b\) 则 \(a+c \equiv b+c\);
更牛的可加性 :若 \(a \equiv b\) 并且 \(c \equiv d\) 则 \(a + c \equiv b + d\);
可乘性:若 \(a \equiv b\), 且 \(c \equiv d\),则 \(ac \equiv bd\)
可除性:若 \(a \equiv b\), 且 模数m与c同余,则 \(a/c \equiv b/c\)
最大公因数gcd求法(辗转相除法)
int gcd(int a, int b){
return !b ? a : gcd(b, a%b);
}
exgcd(用于解不定方程和求非质数意义下的逆元):
方程:ax + by = c (a,b,c均为整数,求x,y的整数解)
核心思路:在求gcd的末状态求出\(x_末,y_末\),又因为有个天才脑洞大开发现可以顺着gcd递归回去,于是可以求出一组x,y的特解,再找通解的表达。
具体做法:
当c 不是 gcd(a,b) 的倍数,时无x,y整数解
否则:ax + by = k * gcd,可先求出x/k,y/k
gcd末状态:
a = gcd, b = 0。此时\(x_末 = 1, y_末随机取\)
gcd的转移方法是:ax + by = gcd = bx' + (a - \({\lfloor a / b \rfloor}\) * b)*y';(gcd的递归转移)
整理一下:x = x' - \({\lfloor a / b \rfloor}\) * y', y = x'
递归回去可得一组x/k,y/k的整数解, 再乘上k就是一组x,y的特解
接下来就是求通解:
先令有解{x1,y1}{x2,y2}
\(ax_1 + by_1 = c\)
\(ax_2 + by_2 = c\)
\(∴a(x_1 - x_2) = b(y_2 - y_1)\)
\(两边同除gcd(a,b),得a'(x_1 - x_2) = b'(y_2 - y_1),此时a'与b'互质\)
\(∴(x_1 - x_2) = k * b', (y_2 - y_1) = k * a'\)
\(整理一下:x_1 = k * b' + x_2,y_1 = y_2 - k * a'(k为任意,
x_2,y_2为特解,x_1,y_1为通解)\)
代码:
void exgcd(long long a, long long b){
if(b == 0) {
x = 1;
y = 0;
gcd = a;
return ;
}
exgcd(b, a % b);
tmp = x, x = y, y = tmp - (a/b) * y;
}
用exgcd求逆元:ax = 1 (mod p) => ax = 1 + pk => ax - pk = 1,然后就可以开始解不定方程了。

浙公网安备 33010602011771号