[数学基础] 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\),则我们有

\[a^{\varphi(m)}\equiv 1(\mod m) \]

(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\)也可以通过扩展欧几里得算法求出。然后再来小小的证明下!

证明

  1. 首先证明\(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\)是方程组的一个解。

  1. 然后证明在模\(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;
}
posted @ 2022-05-10 00:08  跳岩  阅读(173)  评论(1编辑  收藏  举报