数学专题笔记
数学专题
注:因为笔者太懒目的在于记录所学所用知识点,且暂时没写完,所以大部分定理缺
乏证明,请读者自行思考或去别处了解。
1 数论
1.1 欧几里得定理
\(\gcd(a,b) = \gcd(b,a \bmod b)\)
1.2 裴蜀定理
\(\forall\ a,b \in Z, ab\neq 0,\forall\ x,y \in Z,\gcd(a,b) \mid ax+by\)
$ \forall\ a,b \in Z,\exist\ x,y\in Z\ \tt such\ that$ \(ax+by=\gcd(a,b)\)
1.3 扩展欧几里得
扩展欧几里得 (exgcd) 用于求解 \(ax+by=\gcd(a,b)\) 的一组可行解。
过程:
设:
\(ax_1+by_1=\gcd(a,b)\)
\(bx_2+(a\bmod b)y_2=\gcd(b,a\bmod b)\)
根据欧几里得定理:\(\gcd(a,b)=\gcd(b,a \bmod b)\)
所以 \(ax_1+by_1=bx_2+(a \bmod b)y_2\)
又因为 \(a \bmod b=a-(\lfloor\dfrac{a}{b}\rfloor\times b)\)
所以 \(ax_1+by_1=bx_2+(a-(\lfloor\dfrac{a}{b}\rfloor\times b))y_2\)
\(ax_1+by_1=ay_2+bx_2-\lfloor\dfrac{a}{b}\rfloor\times by_2=ay_2+b(x_2-\lfloor\dfrac{a}{b}\rfloor y_2)\)
所以 \(x_1=y_2,y_1=x_2-\lfloor\dfrac{a}{b}\rfloor y_2\)
将 \(x_2,y_2\) 不断代入递归求解直至 \(b\) 为 \(0\) 递归 \(x=1,y=0\) 回去求解。
代码如下:
int x,y;
int exgcd(int a,int b){
if(b==0){x=1,y=0;return a;}
int d=exgcd(b,a%b);
int t=x;
x=y;
y=t-a/b*y;
return d;
}
时间复杂度为 \(O(\log \min(a,b))\)
1.4 费马小定理
设 \(p\) 素数,对于任意整数 \(a\) 满足 \(p \nmid a\),\(a^{p-1}\equiv 1\pmod{p}\)。
1.5 逆元
对于非零整数 \(a,m\),如果存在 \(ab \equiv 1\pmod{m}\),则称 \(b\) 是 \(a\) 在模 \(m\) 意义下的逆元。
逆元也被记作 \(a^{-1} \bmod m\),或者简单记作 \(a^{-1}\)
当且仅当 \(\gcd(a,m)=1\) 时存在逆元,当 \(m\) 为素数时满足所有非其倍数的正整数均存在逆元。
可以转化为线性方程通过扩展欧几里得求解。
当且仅当 \(\gcd(a,m)=1\) 时存在逆元。
\(ab \equiv 1\pmod{m}\)
即 \(\exist\ x,ab = mx + 1\)
\(ab - mx = 1\)
又因为 \(\gcd(a,m) = 1\)
\(ab - mx = \gcd(a,m)\)
通过扩展欧几里得可以求出逆元 \(b\) 的值。
也可以通过费马小定理求解。
\(a \cdot a^{m-2} = a^{m-1} \equiv 1\pmod{m}\)
此时 \(a^{m-2}\) 为逆元。
线性递推求逆元:
对于 \(1 \lt i \lt p\) 的正整数 \(i\) 考虑带余除法:
\(p = \lfloor\dfrac{i}{p}\rfloor \times i + (p\bmod i)\)
\(0 \equiv \lfloor\dfrac{i}{p}\rfloor \times i + (p\bmod i )\pmod{p}\)
两边同时乘以 \(i^{-1} (p\bmod i)\)
\(i^{-1}\equiv-\lfloor\dfrac{i}{p}\rfloor (p\bmod i)^{-1}\pmod{p}\)
可以通过递推求解。
代码:
inv[1]=1;
for(int i=2;i<p;i++){
inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}
1.6 卢卡斯定理
卢卡斯定理 (Lucas) 用于求解数据规模较大时 \(\dbinom{n}{k} \bmod p\) 的值。
当 \(p\) 为素数时,有卢卡斯定理:
\(\dbinom{n}{k} \equiv \dbinom{\lfloor n/p\rfloor}{\lfloor k/p\rfloor}\dbinom{n \bmod p}{k \bmod p}\pmod{p}\)
1.7 中国剩余定理
中国剩余定理 (CRT) 用于求解如下形式线性同余方程组(满足 \(b_1,b_2,\dots b_n\) 两两互质):
\(\begin {cases}x\equiv a_1\pmod{b_1}\\ x\equiv a_2\pmod{b_2}\\x\equiv a_3\pmod{b_3}\\ \ \ \ \ \dots \\ x\equiv a_n\pmod{b_n}\end{cases}\)
求出所有模数乘积 \(B = \prod_{i=1}^{n} b_i\)。
对于第 \(i\) 个方程,计算 \(m_i = \dfrac{B}{b_i}\)
计算 \(m_i\) 在模 \(b_i\) 意义下的乘法逆元 \(m_i^{-1}\)。
计算 \(c_i=m_im_i^{-1}\) (不取模)
方程组模 \(B\) 意义下唯一解即为 \(x = \sum_{i=1}^{k} a_ic_i \pmod {B}\)
证明如下:
-
证明方程组在模 \(B\) 意义下唯一
若 \(x_1, x_2\) 都是解,则
\(b_i \mid (x_1 - x_2)\) 对每个 \(i\) 成立。
\(b_i\) 两两互素 \(\Rightarrow\) 乘积 $B \mid (x_1 - x_2) \Rightarrow x_1 \equiv x_2 \pmod{B} $。
-
证明 \(x = \sum_{i=1}^{k} a_ic_i \pmod {B}\) 满足方程组
对于任意 \(i\),\(j \ne i\) 时 \(m_j \equiv 0\pmod{b_i}\),只剩 \(a_im_i^{-1}m_i\equiv a_i\pmod{b_i}\),满足方程组。
综上 \(x\) 为方程组在模 \(B\) 意义下的的唯一解。
1.8 扩展中国剩余定理
扩展中国剩余定理 (exCRT) 用于解决中国剩余定理但不满足模数两两互质的情况。
考虑将两个同余方程合并为同一个同余方程。
设两个方程为 \(x \equiv a_1\pmod {b_1}\)、\(x\equiv a_2\pmod{b_2}\)
转化为不定方程,\(x=b_1p+a_1=b_2q+a_2\),其中 \(p,q\in Z\)
转化为线性二元一次方程:\(b_1p-b_2q=a_2-a_1\)
由于裴蜀定理,如若 \(a_2-a_1\) 不能被 \(\gcd(b_2,b_1)\) 整除时,无解。
若有解,通过扩展欧几里得算法解出一组可行解 \((p,q)\)
则两方程合并为同一方程 \(x\equiv b_1p+a_1\pmod{\operatorname{lcm}(b_1,b_2)}\)。
对于多个方程,两两合并即可。
1.9 扩展卢卡斯定理
扩展卢卡斯定理 (exLucas) 用于求解数据规模较大时 \(\dbinom{n}{k} \bmod p\) 且 \(p\) 不为素数的值。
将 \(p\) 分解质因数得到 \(p=p_1^{r_1}p_2^{r_2}...\)
这样子,我们只需要找出对于每一个 \(i\), \(\dbinom{n}{k} \bmod p_i^{r_i}\) 的值,显然所有的 \(p_i^{r_i}\) 两两互质,所以用中国剩余定理即可得到答案。
问题转化成如何求出组合数对质数幂的模数。
\(\dbinom{n}{k} \bmod P^k\\=\dfrac{n!}{m!(n-m)!}\bmod P^k\)
不一定能够求出 \(m!\) 与 \((n-m)!\) 的逆元,显然不一定互质。
转化成:
\(\dfrac{\dfrac{n!}{P^{g(n)}}}{\dfrac{m!}{P^{g(m)}}\dfrac{(n-m)!}{P^{g(n-m)}}}P^{g(n)-g(m)-g(n-m)} \bmod P^k\)
此处 \(g(x)\) 表示 \(n!\) 中 \(P\) 因子的个数。
然后问题转化成 \(\dfrac{x!}{P^{g(x)}} \bmod P^k\) ,显然对于分母来说除去所有 \(P\) 因子后已与 \(P^k\) 互质,可以求逆元。
\(n!=1 \times 2 \times 3 \times \dots \times n\\=(P \times 2P \times 3P \times \dots \times \lfloor\dfrac{n}{P}\rfloor P )(1 \times 2 \times \dots)\\=P^{\lfloor\frac{n}{P}\rfloor}(\lfloor\dfrac{n}{P}\rfloor)! \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)
这里的 \(P^{\lfloor\frac{n}{P}\rfloor}\) 要除掉,但是 \((\dfrac{n}{P})!\) 里面还有因子 \(P\) 也要除掉。
令 \(f(x)=\dfrac{x!}{P^{g(x)}}\)
根据上面的公式,\(f(n)=f(\lfloor\dfrac{n}{P}\rfloor) \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)
我们要求的是 \(f(n) \bmod P^{k}\) 的值,显然这个值在 $ \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i$ 内部是有循环节的。
\(f(n) \equiv f(\lfloor\dfrac{n}{P}\rfloor)(\prod\limits_{i=1,i\not\equiv 0\pmod P}^{P^k})^{\lfloor\frac{n}{P^k}\rfloor}(\prod\limits_{i=P^k\lfloor\frac{n}{P^k}\rfloor,i\not\equiv 0 \pmod P}^{n} i)\pmod {P^k}\)
这样就可以递归 \(O(\log _P n)\) 求出 \(f(n)\) 了,边界 \(f(0) =1\)。
原式变为 \(\dfrac{f(n)}{f(n-m)f(m)}P^{g(n)-g(m)-g(n-m)} \pmod {P^k}\)
\(f(m)\) 与 \(f(n-m)\) 与 \(P^k\) 互质,通过扩展欧几里得求逆元。
然后就是求 \(g(x)\),既 \(x!\) 中因子 \(P\) 的数量。
还是这么拆:
\(n!=1 \times 2 \times 3 \times \dots \times n\\=(P \times 2P \times 3P \times \dots \times \lfloor\dfrac{n}{P}\rfloor P )(1 \times 2 \times \dots)\\=P^{\lfloor\frac{n}{P}\rfloor}(\lfloor\dfrac{n}{P}\rfloor)! \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)
\(P^{\lfloor\frac{n}{P}\rfloor}\) 中有 \(\lfloor\dfrac{n}{P}\rfloor\) 个 \(P\) 因子,\((\lfloor\dfrac{n}{P}\rfloor)!\) 内部也有 \(P\) 因子数量,\(\prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\) 显然不含 \(P\) 因子。
得出 \(g(n)=g(\lfloor\dfrac{n}{P}\rfloor)+\dfrac{n}{P}\)
也能递归 \(O(\log _P n)\) 求出,边界 \(\forall\ i \lt P,g(i)=0\)。
于是对每一个 \(p_i^{r_i}\),有答案:
\(\dbinom{n}{m}\equiv \dfrac{f(n)}{f(m)f(n-m)}P^{g(n)-g(m)-g(n-m)} \pmod {p_i^{r_i}}\)
再用中国剩余定理合并即可得到答案。
代码:
int A[maxn],B[maxn];
void exgcd(int a,int b,int &x,int &y){
if(b==0){x=1,y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
int inv(int a,int p){
int x,y;exgcd(a,p,x,y);
return (x+p)%p;
}
int qpow(int a,int b,int p){
int res=1;
while(b){
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
int F(int n,int p,int pk){
if(n==0)return 1;
int res=1,rem=1;
for(int i=1;i<=pk;i++)if(i%p)res=res*i%pk;
res=qpow(res,n/pk,pk);
for(int i=n/pk*pk;i<=n;i++)if(i%p)rem=rem*(i%pk)%pk;
return F(n/p,p,pk)*res%pk*rem%pk;
}
int G(int n,int p){
if(n<p)return 0;
return G(n/p,p)+(n/p);
}
int C(int n,int m,int p,int pk){
int f=F(n,p,pk),f2=inv(F(n-m,p,pk),pk),f3=inv(F(m,p,pk),pk);
int mt=qpow(p,G(n,p)-G(n-m,p)-G(m,p),pk);
return f*f2%pk*f3%pk*mt%pk;
}
int exLucas(int n,int m,int p){
int tot=0,tmp=p;
for(int i=2;i*i<=p;i++){
if(tmp%i==0){
int pk=1;
while(tmp%i==0){
tmp/=i;
pk*=i;
}
A[++tot]=pk;
B[tot]=C(n,m,i,pk);
}
}
if(tmp!=1){
A[++tot]=tmp;
B[tot]=C(n,m,tmp,tmp);
}
int ans=0;
for(int i=1;i<=tot;i++){
int M=p/A[i],Mt=inv(M,A[i]);
ans=(ans+M*Mt%p*B[i]%p)%p;
}
return ans;
}

浙公网安备 33010602011771号