[数学基础] 6 初等数论四大定理
初等数论四大定理
1. 威尔逊定理
(1) 结论
当且仅当\(p\)为素数时,\((p-1)!\equiv -1(\mod p)\)。
(2) 证明
充分性:若\(p\)不为素数,则\((p-1)!\not\equiv -1(\mod p)\)。
-
当\(p=4\)时,显然\((p-1)!\equiv 6\equiv 2(\mod p)\);
-
当\(p>4\)时
- \(p\)为完全平方数,则\(\exist k\),使得\(p=k^2\),由于\(p>4\),故\(k>2,2k<p\),\((p-1)!\equiv n(k\times2k)\equiv 2n\times k^2\equiv 0(\mod p)\)。
- \(p\)不是完全平方数,则\(\exist a,b,a\neq b\),使得\(ab=p\),则\((p-1)!\equiv nab\equiv 0(\mod p)\)。
必要性:若\(p\)为素数,则一定有\((p-1)!\equiv -1(\mod p)\)。
\(p=2\)时,结论显然成立。
若\(p\)为奇素数,取集合\(A=\{1,2,3,..,p-1\}\),\(A\)构成模\(p\)乘法的简化剩余系,即\(\forall i\in A,\exist j\in A\),使得\(i\times j\equiv 1(\mod p)\)。
证明:因为\(A\)构成模\(p\)乘法的取值的集合了(除了0),所以这个结论肯定成立。
那么,这\(p-1\)个数是不是两两配对的呢?首先,由同余的运算法则,可以得到一定没有\(ij\equiv ik(\mod p), j\neq k\)的情况,那么它一定是两个一对,或者单独一个的情况。考虑\(x^2\equiv 1(\mod p)\),解得\(x\equiv 1(\mod p)\),或者\(x\equiv p-1(\mod p)\),那么其余则两两配对。因此\((p-1)!\equiv 1\times (p-1)\equiv -1(\mod p)\),得证。
(5)例题
可以看下它的考察方式:UVA1434 YAPTCHA,主要就是欧拉筛+威尔逊定理+前缀和
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n, cnt;
const int N = 3e6 + 20;
bool st[N];
int p[N], pre[N];
void Euler(int n){
for (int i=2;i<=n;++i){
if (!st[i]) p[++cnt] = i;
for (int j=1;p[j]<=n/i;++j){
st[i * p[j]] = true;
if (i % p[j] == 0) break;
}
}
}
void init(){
Euler(N - 1);
for (int i=1;i<N;++i){
int x = 0;
if (i > 7 && (i - 7) % 3 == 0 && !st[i]){
x = 1;
}
pre[i] = pre[i - 1] + x;
}
}
int main(void){
init();
int t;
scanf("%d", &t);
while (t--){
scanf("%d", &n);
printf("%d\n", pre[n * 3 + 7]);
}
return 0;
}
2. 欧拉定理
(1) 结论
若\(m\)是一个大于1的整数,且满足条件\((a,m)=1\),则我们有
(2) 证明
引理1: 设\(m\)是一个大于1的整数,\(a\)是一个整数且满足\((a,m)=1\),如果\(B=\{b_1,b_2,..,b_{\varphi(m)}\}\)是模\(m\)的一个简化剩余系,则\(B'=\{ab_1,ab_2,..,ab_{\varphi(m)}\}\)也是模\(m\)的一个简化剩余系。
证明:由于从\(B\)中取出任何一个正整数\(b_i\),都有\((b_i,m)=1\)。又\((a,m)=1\),可以得到在\(B'\)中任意取出一个整数\(ab_i\),都有\((ab_i,m)=1\)。那么,现在利用反证法,假设在\(B'\)中存在两个整数\(ab_k,ab_{\lambda}\),\(1\leq k < \lambda \leq \varphi(m)\),使得:\(ab_k\equiv ab_{\lambda}(\mod m)\)成立。
又\((a,m)=1\),故\(b_k\equiv b_{\lambda}(\mod m)\),由于\(b_k,b_{\lambda}\)是简化剩余系的元素,因此不可能模\(m\)同余,所以同余等式不可能成立,得证。
下面正式的证明欧拉定理。
考虑模\(m\)的最小正缩系\(A\),即\(A=\{1,a_2,...,a_{\varphi(m)}\}\),是不大于\(m\)且和\(m\)互质的全体正整数,令\(r_1\)是一个整数,满足条件:$ a \times 1\equiv r_1(\mod m), r_1\in[0,m-1]$
令\(r_i\)(其中\(i=2,..,\varphi(m)\))是一个整数,满足条件:\(aa_i\equiv r_i(\mod m),r_i\in[0,m-1]\)。
则我们有\(a\equiv r_1(\mod m),aa_2\equiv r_2(\mod m),..,aa_{\varphi(m)}\equiv r_{\varphi(m)}(\mod m)\)
由于\(A\)是模\(m\)的一个简化剩余系,并且\((a,m)=1\),因此\(R=\{r_1,r_2,..,r_{\varphi(m)}\}\)也是一个简化剩余系,并且和\(A\)至少在次序上可能有不同,故得到\(\prod_{i=1}^{\varphi(m)}r_i=\prod_{i=1}^{\varphi(m)}a_i\)
因此\(\prod_{i=1}^{\varphi(m)}(a\times a_i) \equiv \prod_{i=1}^{\varphi(m)}a_i (\mod m)\)
即\(a^{\varphi(m)}\equiv 1(\mod m)\)。
(3) 推论
欧拉降幂:
- \(A^b\equiv A^{b\mod \varphi(m)} (\mod m)\)
证明:设\(b=k\times \varphi(m)+r\),则\(r=b\mod \varphi(m)\)。
\(A^b\equiv A^r\times (A^{\varphi(m)})^k\equiv A^r(\mod m)\),得证。
3. 费马小定理
(1) 结论
事实上,费马小定理就是欧拉定理的一种特殊情况。
如果\(p\)为质数,\(p\nmid a\),则我们有\(a^{p-1} \equiv 1 (\mod p)\)
(1) 证明
由于\(p\)为质数,因此\(\varphi(p)=p-1\),取欧拉定理中\(m=p\),即得到费马小定理。
需要注意的是,\(\exist m\in \N^+,a\in \Z\),使得\(m \nmid a\),这里\(m\)不是素数,使得\(a^{m-1}\equiv 1(\mod m)\),即费马小定理的逆定理不成立。比如,\(1024\equiv 1(\mod 341)\),\(2^{340}\equiv (2^{10})^{34}\equiv (1024)^{34}\equiv 1(\mod 341)\),而\(341=11\times 31\),不是素数。
(2) 推论
明显的,当\(p\)为质数,且\(p \nmid a\)时,\(a^{p-2}\equiv a^{-1} (\mod p)\),由此就可以求得在模\(p\)意义下的乘法逆元。
欧拉定理和费马定理很难单独考察,大部分都是作为解题的一个步骤出现。
4. 中国剩余定理
1) 中国剩余定理(crt)
定理:
有一元线性同余方程组\((S)\)如下。
\((S):\begin{cases} & x\equiv a_1~(\mod m_1) \\ & x\equiv a_2~(\mod m_2) \\ &... \\ & x\equiv a_n~(\mod m_n) \end{cases}\)
假设整数\(m_1,m_2,...,m_n\)两两互质,则对任意的整数\(a_1,a_2,...,a_n\),方程组\((S)\)有解,并且通解可以用如下方式构造得到:
设\(M=\prod \limits _{i=1} ^{n} m_i\),\(M_i=\frac{M}{m_i}\),设\(t_i=M_i^{-1}\),为\(M_i\)在模\(m_i\)意义下的\(M_i\)的模\(m_i\)乘法逆元。
方程组\((S)\)的通解形式为\(x=a_1t_1M_1+a_2t_2M_2+...+a_nt_nM_n+kM=kM+\sum\limits_{i=1}^na_it_iM_i, k\in \Z\)。
在模\(M\)的意义下,方程组\((S)\)只有一个解:\(x=(\sum\limits_{i=1}^na_it_iM_i)\mod M\)
namo 首先解的每一项,都是可以求出来的,\(t_i\)也可以通过扩展欧几里得算法求出。然后再来小小的证明下!
证明:
- 首先证明\(x\)是方程组\((S)\)的一个解。
对于解的每一项,可以看出\(a_it_iM_i\equiv a_i\times 1 \equiv a_i(\mod m_i~)\),
\(a_it_iM_i\equiv 0~(\mod m_j~)\),\(\forall j\in[1,n], j\neq i\)
因此,\(x\)满足\(x=a_it_iM_i+\sum\limits _{j\neq i}a_jt_jM_j \equiv a_i+\sum\limits _{j\neq i}0 \equiv a_i~(\mod m_i), ~~\forall i\in[1,n]\)
故\(x\)是方程组的一个解。
- 然后证明在模\(M\)的意义下,方程组\((S)\)只有一个解。
假设\(x_1,x_2\)都是方程组\((S)\)的解,那么\(x_1-x_2\equiv 0~(\mod m_i), \forall i\in [1,n]\)
而\(m_1,m_2,...,m_n\)两两互质,这说明\(M|(x_1-x_2)\),所以方程组\((S)\)的任何两个解之间必然相差\(M\)的整数倍,所以方程组所有的解的集合就是\(\{kM+\sum \limits _{i=1} ^n a_it_iM_i;k\in \Z\}\)
所以在模\(M\)的意义下,方程组\((S)\)只有一个解。
- 代码:
int n;
const int N = 10 + 5;
int A[N], B[N];
ll mod(ll a, ll b){
return (a % b + b) % b;
}
ll exgcd(ll a, ll b, ll &x, ll &y){
if (!b){
x = 1, y = 0; return a;
}
ll d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main(void){
scanf("%d", &n);
ll M = 1, res = 0, ti, y;
for (int i=1;i<=n;++i){
scanf("%d%d", &A[i], &B[i]);
M = M * A[i];
}
for (int i=1;i<=n;++i){
ll Mi = M / A[i];
exgcd(Mi, A[i], ti, y);
res = mod(res + Mi * ti * B[i], M);
}
printf("%lld\n", res);
return 0;
}
2) 扩展中国剩余定理(excrt)
(rxz的题解写的太好了,受益良多QAQ,他讲的东西真的都是清晰细致又简单 但是因为他用python所以不推mod 岂可修)
https://www.luogu.com.cn/blog/blue/kuo-zhan-zhong-guo-sheng-yu-ding-li
这里自己再重新推导一遍。
修改条件,使得\(m_1,m_2,...,m_n\)不再两两互质,此时应该如何求方程组的解?
\((S):\begin{cases} & x\equiv a_1~(\mod m_1) \\ & x\equiv a_2~(\mod m_2) \\ &... \\ & x\equiv a_n~(\mod m_n) \end{cases}\) \(x=\{kM+\sum \limits _{i=1} ^n a_it_iM_i;k\in \Z\}\)
互质条件不满足时,\(t_i\)不存在。(回忆逆元的定义,只有当\((b,m)=1\)时才存在\(b^{-1}(\mod m)\)),那么不能利用公式时,只能尝试去不断的合并方程,直到\(n\)个方程仅剩下一个,再使用扩展欧几里得算法求解唯一的同余方程。那么,如何将两个方程等价的变换为一个方程呢?考虑如下情况:
\(\begin{cases} & x\equiv a_1(\mod m_1) \\ & x\equiv a_2(\mod m_2)\end{cases}\)
此方程组等价于\(x = k_1m_1+a_1=k_2m_2+a_2\)
移项后,得\(k_1m_1-k_2m_2=a_2-a_1\)。
令\(a=m_1,b=m_2,m=a_2-a_1\),方程就变成了我们最熟悉的不定方程。那么,记\(d=(m_1,m_2)\),求是否有\(x,y\),满足\(ax+by=d\)。求解的步骤即是:先用裴蜀定理判断是否有解,再用扩展欧几里得算法求解(系)。则\(k_1=x\times \frac{a_2-a_1}{d},k_2=-y\times \frac{a_2-a_1}{d}\),这就是方程的一组特解。为了避免数据溢出,可以让\(k_1:=k_1 \mod \frac{m_2}{d}\)(具体证明见裴蜀定理),那么,\(x=a_1+k_1m_1\),就求出来了两个方程的特解。设这个特解为\(r\),那么它的通解就是\(\{r+k\times LCM, k\in \Z\}\),那么,就可以合并两个同余方程啦!
\(x\equiv r~(\mod LCM)\)
这样不断合并,直到只剩下一个方程,解出答案即可。注意,中间非常容易数据溢出!即使是long long!所以最好直接用一个mul函数,一边做乘法一边做模运算。
横线中的这段是rxz的证明,嘛嘛,就相当于方程\(ax+by=d\)两边\(\div d\),结果是一样的。
那么,记\(d=(m_1,m_2)\),\(p_1=\frac{m_1}{d}, p_2=\frac{m_2}{d}\),易得\((p_1,p_2)=1\)。
方程可被写为这样的形式:\(k_1p_1-k_2p_2=\frac{a_2-a_1}{d}\)
由于当\(d|(a_2-a_1)\)时,方程才有解,因此右边的式子为整数。接着按照exgcd的流程走,我们求这个方程的解
\(\lambda_1p_1+\lambda_2p_2=1\),则\(\begin{cases} & k_1=\frac{a_2-a_1}{d} \times \lambda_1\\ & k_2=\frac{a_2-a_1}{d} \times \lambda_2\end{cases}\)
将结果代入方程,得\(x=a_1+k_1m_1=a_1+\frac{a_2-a_1}{d}\lambda_1m_1\)。
这个\(x\)就是方程的一个特解。
那么,进一步的,如何求出整个解系呢?
定理:若有特解\(x'\),令\(LCM=lcm(m_1,m_2)\),则\(\begin{cases} & x\equiv a_1(\mod m_1) \\ & x\equiv a_2(\mod m_2)\end{cases}\) 的通解为\(x=\{k\times LCM+x';k\in \Z\}\)。
该定理的证明和CRT的证明完全相同。好累,我不想重抄一遍所以就这样吧
- 代码:
int n;
const int N = 1e5 + 10;
ll a1, m1, a[N], m[N], res;
ll mul(ll a, ll b, ll M){
ll res = 0;
while (b > 0){
if (b & 1) res = (res + a) % M;
a = (a + a) % M;
b >>= 1;
}
return res;
}
ll merge(ll a2, ll m2){
ll x, y, M, c = mod(a2 - a1, m2);
ll d = exgcd(m1, m2, x, y);
if (c % d){
return -1;
}
M = (m1 / d * m2);
ll k1 = mod(mul(x, c / d, m2 / d), m2 / d);
ll r = mod(k1 * m1 + a1, M);
a1 = r, m1 = M;
return r;
}
int main(void){
scanf("%d", &n);
scanf("%lld%lld", &m1, &a1);
if (n == 1){
printf("%lld\n", mod(a1, m1));
return 0;
}
for (int i=1;i<n;++i){
scanf("%lld%lld", &m[i], &a[i]);
}
for (int i=1;i<n;++i){
res = merge(a[i], m[i]);
if (res < 0) break;
}
printf("%lld\n", res);
return 0;
}