初等数论入门笔记
常见记号:
\(gcd(a,b)\) a与b的最大公约(因)数;
\(lcm(a,b)\) a与b的最小公倍数;
常见性质:
\(lcm(a,b) = a * b / gcd(a,b)\)
同余的性质
求gcd
1. 欧几里得算法
点击查看代码
inline int gcd( int a , int b ) {
return b == 0 ? a : gcd( b , a % b );
}
2. stein算法(不需除法,适合高精)
线性同余方程
一元线性同余方程(扩展欧几里得算法;exgcd)
前置知识:
同余的性质、欧几里得算法
求解:
解任意同余方程 \(ax ≡ c \ (mod\ \ m)\),即求\(ax - c ≡ 0 \ (\ mod\ \ m)\)的解。
此时\(m|(ax-c)\),也就是说此时存在\(y \in Z\),\(m·y = ax - c\);
※ 因此解同余方程\(ax ≡ c \ (mod\ \ m)\)和解形如\(ax + by = c\)的不定方程(\(a,b,c,x,y\) 为整数)等价。
\(->\)问题转化为解形如\(ax + by = c\)的不定方程(\(a,b,c,x,y\) 为整数)(又叫做丢番图方程)
裴蜀定理:
-
表述:不定方程 \(ax + by = c\)(\(a,b,c,x,y\) 为整数)有解,当且仅当 \(c\ \ mod\ \ gcd(a,b) = 0\)
-
简易证明: \(a\)为\(gcd(a,b)\)的倍数, \(b\)也为\(gcd(a,b)\)的倍数
∴\(ax+by\)一定为\(gcd(a,b)\)的倍数(\(x,y\)为整数)
又∵\(ax + by = c\)有解
∴ \(c\)为\(gcd(a,b)\)的倍数(必要性略) -
推论:\(a,b\)互质的充分必要条件是存在整数\(x,y\)使\(ax+by=1\) ( \(因为此时gcd(a,b)=1\) )
扩展欧几里得算法(求解不定方程 \(ax + by = c\)(\(a,b,c,x,y\) 为整数))
Q: 为什么叫“扩展欧几里得算法”呢?
A: 因为这个算法在求出\(gcd(a,b)\)的同时,可以求出一组整数\(x,y\),使得不定方程 \(ax + by = c\)(\(c\)为整数)成立。
由裴蜀定理可得:
若\(aX + bY = c\)有解,则\(ax + by = gcd(a,b)\)有解,
记\(c = k·gcd(a,b)\),有:\(X=kx,Y=ky\);
因而先考虑求解\(ax + by = gcd(a,b)\);
又由裴蜀定理知,此时存在\(x',y'\),\(ax+by=gcd(a,b) 且 bx'+ (a-b\lfloor \frac{a}{b} \rfloor)y'=gcd(b, a-b\lfloor \frac{a}{b} \rfloor)\);
由欧几里得算法知\(gcd(a,b)=gcd(b, a-b\lfloor \frac{a}{b} \rfloor)\);
所以可联立上方两个式子:
\(ax+by=bx'+ (a-b\lfloor \frac{a}{b} \rfloor)y'\);
整理,得:
\(a(x-y')+b(y-(x'-\lfloor \frac{a}{b} \rfloor y'))=0\);
要使上述式子恒成立,则\(x=y',y=x'-\lfloor \frac{a}{b} \rfloor y'\);①
可以递归求解\(x',y'\),因此求解规模相较原方程大幅减小。
递归边界和\(gcd\)求解是一致的,当\(b = 0时,gcd(a,b)=gcd(a,0),方程变为a·x_n = gcd(a,0) = a\),
解,得:当\(b = 0时,x_n=1,y_n=0\),递归中回代(注意临时存储\(x'\))①即可求出原方程解。
点击查看代码
inline ll exgcd( ll a , ll b ) {
if( b == 0 ) {
x = 1;
y = 0;
return a;//递归边界同gcd一致,此时ax = gcd(a,0) = a , x = 1
}
else {
exgcd( b , a % b );
ll t = x;//储存x'
x = y;
y = t - ( a / b ) * y;
}
}
注意事项:大部分题目要求解出非负解,所以\(exgcd\)后要对\(x\)进行处理
推广应用(exgcd求乘法逆元)
逆元是什么,为什么要求逆元呢?
有些时候,在计数题中,我们要对有理数取模(取余)
例如计算\(\frac{b}{a} \ \ mod \ \ c\)的值(\(a,b,c\)均为整数)时,
由分式的性质易得:
这也就是说,如果\(a^{-1}\)为整数,那么我们就可以把分数取余问题转化为整数取余。
\(a^{-1}\)怎样才能为整数呢?问题的关键是在模意义下考虑问题。
--未完待续