数论学习笔记(一):同余相关

一、最大公约数

定义

不全为 0 的整数 a,b 的最大公约数是指能够同时整除 ab 的最大整数。

欧几里得算法(gcd)

gcd是用来求解两个整数的最大公约数

定理1.2.1

对于整数 a,b,m,n,若 cacb,则 c(ma+nb)

证:cacb

a=ceb=cf

ma+nb=mce+ncf=c(me+nf)

c(ma+nb)

定理1.2.2

a,b,c 是整数,则 gcd(a+cb,b)=gcd(a,b)

证:设 gcd(a,b)=d,根据定理1.2.1,d(a+cb)

da+cbb 的公约数。

ab 的公约数与 (a+cb)b 的公约数一一对应。

gcd(a,b)=gcd(a+cb,b)

反过来,设 gcd(a+cb,b)=e,根据定理1.2.1,e[(a+cb)cb]=a

eab 的公约数。

(a+cb)b 的公约数与 ab 的公约数一一对应。

gcd(a+cb,b)=gcd(a,b)

解法

令整数 r0=ar1=b 满足 ab>0,如果连续做带余除法得到 rj=rj+1qj+1+rj+2,且 rj+2=0,那么 gcd(a,b)=rj+1

正确性证明:通过连续的带余除法可以得到:

r0=r1q1+r2r1=r2q2+r3rj=rj+1qj+1+rj+2rn2=rn1qn1+rnrn1=rnqn

根据定理1.2.2,gcd(a,b)=gcd(r0,r1)=gcd(r1,r2)==(rn1,rn)=(rn,0),因此 gcd(a,b)=rn

裴蜀定理

定理1.3.1

对于两个不全为 0 的整数,gcd(a,b)a,b 的线性组合中最小的一个。

证:设 da,b 的线性组合中最小的一个,设 d=ma+nba=dq+r(0r<d)

r=adq=aq(ma+nb)=(1qm)aqnb

r 也是 a,b 的线性组合。

0r<dda,b 的线性组合中最小的一个。

r=0

da,同理可得 db

假设 a,b 还有公因数 c

ca,cb

cma+nb=d

dc

da,b 的最大公约数。

gcd(a,b)a,b 的线性组合中最小的一个。

内容

裴蜀定理是用来判断一个形如 ax+by=c 是否有整数解。

对于整数 a,b,设 gcd(a,b)=d,如果 dc,那么方程 ax+by=c 没有整数解,如果 dc,那么方程有无数多组形如 x=x0+(b/d)ny=y0(a/d)n 的整数解

证:若整数 x,y 满足 ax+by=c

da,db

根据定理1.2.1,有 d(ax+by)=c

如果 dc,那么原方程无解

假设 dc,根据定理1.3.1,存在整数 s,t 满足 d=as+bt

c=de,那么 c=de=(as+bt)e=a(se)+b(te)

x0=se,y0=te 就是原方程的一组特解。

x=x0+(b/d)n,y=y0(a/d)n

ax+by=ax0+a(b/d)n+by0b(a/d)n=ax0+by0=c

x=x0+(b/d)n,y=y0(a/d)n 是原方程的通解。

反过来,假设整数 x,y 满足 ax+by = c

ax0+by0=c

(ax+by)(ax0+by0)=0

a(xx0)b(yy0)=0

a(xx0)=b(y0y)

(a/d)(xx0)=(b/d)(y0y)

gcd(a,b)=d

gcd(a/d,b/d)=1

根据可除性前置一(见同余/同余的性质/可除性),(a/d)(y0y)

n(a/d)=y0y

y=y0(a/d)n,将这个 y 值代入原方程得:

a(xx0)=b(a/d)n

x=x0+(b/d)n

扩展欧几里得算法(exgcd)

ax+by=gcd(a,b) 的特解关键在于递归的思想

现在已知 gcd(a,b)=gcd(b,amodb)

因此 ax+by=bx+(amodb)y=bx+(ab×ab)y=ay+b(xaby)

x=y,y=xaby

先一层层递归,回溯时求解原方程的解。

exgcd代码:

int extend_gcd(int a, int b, int &x, int &y){
	if(b == 0){
		x = 1;
		y = 0;//递归边界
		return 0;
	}
	int d = extend_gcd(b, a % b, y, x);//递归
	y -= a / b * x;//回溯
	return d;
}

二、素数

定义

素数是大于 1 的正整数,并且除了 1 和它本身外不能被其他正整数所整除,素数又被称作质数。

大于 1 的不是素数的正整数称为合数。

筛法求素数

下面给出两种可以在线性时间内筛出 1n 之间的素数的方法。

埃拉托色尼斯筛法

首先,一个正整数的倍数一定是合数。

如果一个数是合数,那他一定能表示成比他小的数的倍数。

我们考虑用已经筛出的素数的倍数表示合数。

2 开始,如果这个数没有被标记过,那么将这个数标记为素数,他的倍数都标记为合数。

这个方法被称作埃拉托色尼斯筛法,简称埃氏筛,复杂度 O(nloglogn)

复杂度证明:设 π(n) 表示小于等于 n 的素数个数,pk 表示这 π(n) 个数中第 k 小的数。

1n 的数中,一个素数最多会筛出 npk 个合数,因此总复杂度为 O(k=1π(n)npk)=O(nk=1π(n)1pk)

n 的唯一分解是 i=1mpici

ω(n) 表示 n 本质不同的质因子个数,即 pP,pn[pn]

d(n) 表示 n 的因数个数,即 dn[dn],从唯一分解的角度考虑,枚举每个素数的个数,那么有 d(n)=i=1m(ci+1)

nk=1π(n)1pk=ni=1nω(i)

2ω(n) 表示每个素数只有选或不选两种状态下 n 的因子个数,而 d(i) 则表示每个素数可以选 [0,ci] 次的因子个数。

i=1n2ω(i)i=1nd(i)

将一个数唯一分解的复杂度是 O(logn)

i=1n2ω(i)O(nlogn)

中置知识:下凸函数

如果一个函数 f(x) 的一阶导单调递增,二阶导单调不下降,那么这个函数就是一个下凸函数,可以看作 f(x) 在增加,他的斜率也在增加,如图:

就是一个下凸函数。

f(x)=nx(n1)

f(x)=nx ln xf(2)(x)=nx ln n+1x,发现这两个函数均为增函数。

f(x)=nx 是下凸函数。

中置知识:琴生不等式

一般形式:若 f(x) 是下凸函数,则对于任何取值的 x1,x2,x3,,xn,都有

i=1nf(xi)nf(i=1nxin)

加权形式:若 f(x) 是下凸函数,a1,a2,a3,,an 是正数且 i=1nai,则对于任何取值的 x1,x2,x3,,xn,都有

i=1naif(xi)f(i=1naixi)

证:(加权形式)

考虑数学归纳法

n=1 时第一个式子是线性增加的,而第二个式子是非线性增加的,又因为 f(x) 是下凸函数,它的增长比线性快,又因为 ai1,乘 ai 后两式子减小,第一个减小得更慢,结论显然成立。

n1 时,f(i=1naixi)=f((1an)(i=1n1aixi1an1)+anxn)(1an)f(i=1n1aixi)+anf(xn)i=1naif(xi)

不等式成立。


f(x)=2x 是下凸函数。

i=1n2ω(i)n2i=1nω(i)n

n2i=1nω(i)nO(logn)

i=1nω(i)nO(loglogn)

i=1nω(i)O(loglogn)

埃氏筛的时间复杂度是 O(nloglogn)

完整代码:P3383 【模板】线性筛素数

#include<bits/stdc++.h>
using namespace std;
const int PP = 1e8 + 9;
int prime[PP], p_cnt;
bool isPrime[PP];
void getPrime(int n){
	for(int i = 2; i < n; ++i)
		isPrime[i] = true;
	for(int i = 2; i < n; ++i){
		if(isPrime[i]){//一个数没被标记过
			prime[++p_cnt] = i;//记录素数
			if(1ll * i * i < n)//防止越界
				for(int j = i * i; j <= n; j += i)//根据合数i的最小质因子小于等于sqrt(i),可以从i*i开始筛,优化常数
					isPrime[j] = false;//他的倍数标记为合数
		}	
	}
}
signed main(){
	int n, q;
	scanf("%d%d", &n, &q);
	getPrime(n);
	while(q--){
		int x;
		scanf("%d", &x);
		printf("%d\n", prime[x]);
	}
	return 0;
}

欧拉筛法

埃氏筛十分优秀,但每个数会被它的所有质因子都筛一遍,而使用欧拉筛可以使每个数只被它的最小质因子筛一遍,时间复杂度可以达到 O(n)

每找到一个没被标记的数,就将它记为素数,无论他是不是素数,都将它与已求出的素数相乘并将他标记为合数。

当遇到一个素数能整除当前的数,证明当前的数已经被这个素数标记过了,他乘其它质数也已经被这个质数标记了,就可以退出循环了。

完整代码:P3383 【模板】线性筛素数

#include<bits/stdc++.h>
using namespace std;
const int PP = 1e8 + 9;
int prime[PP], p_cnt;
bool isPrime[PP];
void getPrime(int n){
	for(int i = 2; i < n; ++i)
		isPrime[i] = true;
	for(int i = 2; i < n; ++i){
		if(isPrime[i])
			prime[++p_cnt] = i;
		for(int j = 1; j <= p_cnt && i * prime[j] < n; ++j){
			isPrime[i * prime[j]] = false;//将prime[j]的第i倍标记为合数
			if(i % prime[j] == 0)//因为prime数组从小到大排列,因此prime[j]一定是i的最小质因子,i乘其它质数一定会被prime[j]先筛掉,因此不用往后再筛了
				break;
		}
	}
}
signed main(){
	int n, q;
	scanf("%d%d", &n, &q);
	getPrime(n);
	while(q--){
		int x;
		scanf("%d", &x);
		printf("%d\n", prime[x]);
	}
	return 0;
}

欧拉函数

有数学的地方就有欧拉——《公式之美》

前置知识:积性函数

若对于任意正整数 a,bgcd(a,b)=1,都有 f(ab)=f(a)f(b),则称 f 为积性函数。

若对于任意正整数 a,b,都有 f(ab)=f(a)f(b),则称 f 为完全积性函数。

定义

欧拉函数 φ(n) 表示不超过 n 且与 n 互质的数的个数,这 φ(n) 个数组成的集合也构成了 n既约剩余系

欧拉函数的性质

1.若 p 是素数,则 φ(p)=p1;反过来,若 φ(p)=p1,则 p 是素数。

证:若 p 是素数,那么任意小于 p 的素数都与 p 互质。因为有 p1 个这样的正整数,所以 φ(p)=p1

反过来,如果 p 不是素数,那么 p=1p 是合数。若 p=1,那么 φ(1)=10。若 p 是合数,那么一定存在正整数 d 使得 1<d<pdp,显然 pd 不互质,这说明 1p1 至少有一个数与 p 不互质,则 φ(p)n2。因此,如果 φ(p)=p1,那么 p 是素数。

2.对于素数 p,正整数 aφ(pa)=papa1

证:不超过 pa 且与 pa 不互质的数就是那些不超过 pa 且能被 p 整除的数:p,2p,3p,,(p1)p,p2,2p2,3p3(p1)pa1,pa,一共有 pa1 个,所以有 papa1 个不超过 p 数与 p 互质,因此 φ(pa)=papa1

3.(积性函数) 对于任意正整数 a,b,若 gcd(a,b)=1,那么 φ(ab)=φ(a)φ(b)

证:用下列方式列出不超过 ab 的正整数:

[1m+12m+1(n1)m+12m+22m+2(n1)m+23m+32m+3(n1)m+3rm+r2m+r(n1)m+rm2m3mnm]

假设 r 是不超过 m 的正整数且 gcd(r,m)=d1,那么第 r 行的数都可以写成 km+r 形式

dmdr

根据定理1.2.1,d(km+r)

r 行的所有数都与 mn 不互质。

我们现在只用考虑 gcd(m,r)=1 的这 φ(m) 行的数,这第 r 行的数分别是 r,m+r,2m+r,,(n1)m+r

gcd(r,m)=1

r 行的每个数都与 m 互质,可以发现,第 r 行所有数构成了模 n 的完全剩余系,所以恰好有 φ(n) 个数与 n 互质,它们又与 n 互质,因此它们与 mn 互质。

φ(m) 行每行都有 φ(n) 个数与 mn 互质。

φ(mn)=φ(m)φ(n)

4.(通项公式) 设 n 的唯一分解是 i=1mpici,那么 φ(n)=ni=1m(11pi)

证:根据性质3,φ 是积性函数。

φ(n)=i=1mφ(pici)

根据性质2,φ(pici)=picipici1=pici(11pi)

i=1mφ(pici)=i=1mpici(11pi)=i=1mpicij=1m(11pj)=ni=1m(11pi)

5.(欧拉反演) 若 n 为正整数,则 dnφ(d)=n

证:将 1n 的整数构成的集合进行分类,如果整数 mn 的最大公因数为 d,那么 m 属于 Cd 集合。

gcd(m/d,n/d)=1

Cd 集合中所包含整数个数就是所有不超过 n/d 且与 n/d 互质的数的个数。

Cd 集合中所包含整数个数就是 φ(n/d)

现在我们将 1n 之间的整数划分成了若干个不相交的集合,且每个数只存在在一个集合中所以这些不同的集合所含整数的个数和就是 n

n=dnφ(n/d)

因为 d 遍历了所有 n 的因子,n/d 也便利了所有 n 的因子。

n=dnφ(n/d)=dnφ(d)

6.若 ab,则 φ(ab)=a×φ(b)

证:ab

a 对通项公式中 i=1m(11pi) 部分没有影响,因为 a 只改变了 ci,没改变 pi

a 的加入让前半部分 n 变大了 a 倍。

φ(ab)=a×φ(b)

线性筛欧拉函数

首先,对于一个素数 pφ(p)=p1

利用欧拉筛

  • 如果 prime[j]i,根据性质6,有 φ(i×prime[j])=φ(i)×prime[j]

  • 如果 prime[j]i,因为 [j] 为素数,因此 gcd(prime[j],i)=1,根据性质3,有 φ(i×prime[j])=φ(i)×φ(prime[j])

线筛代码:

const int N = 4e6 + 9;
int vis[N], prime[N], phi[N], sum[N], n;
void get_phi(){
	phi[1] = 1;
	int cnt = 0;
	for(int i = 2; i < N; i++){
		if(!vis[i]){
			vis[i] = i;
			prime[cnt++] = i;
			phi[i] = i - 1;//素数
		}
		for(int j = 0; j < cnt; j++){
			if(i * prime[j] > N)
				break;
			vis[i * prime[j]] = prime[j];
			if(i % prime[j] == 0){
				phi[i * prime[j]] = phi[i] * prime[j];//非素数情况1
				break;
			}
			phi[i * prime[j]] = phi[i] * phi[prime[j]];//非素数情况2
		}
	}
}

三、同余

定义

对于整数 a,b,正整数 m,若 m(ab),则称 abm 同余,正整数 m 成为同余的模,记作 ab(modm)

同余的性质

1.自反性: aa(modm)

证:m(aa)=0

等式成立

2.对称性:若 ab(modm),则 ba(modm)

证:ab(modm)

m(ab)

km=ab

(k)m=ba,即 m(ba)

ba(modm);

等式成立

3.传递性:若 ab(modm)bc(modm),则 ac(modm)

证:ab(modm)bc(modm)

m(ab)m(bc)

km=ablm=bc

ac=(ab)(bc)=kmlm=(kl)m,即 m(ac)

ac(modm)

等式成立

4.可加性:若 ab(modm)cd(modm),则 a+cb+d(modm) (自然两边同时减也是可以的)

证:ab(modm)cd(modm)

m(ab)m(cd)

km=ablm=cd

(a+c)(b+d)=(ab)+(cd)=km+lm=(k+l)m,即 m[(a+c)(b+d)]

a+cb+d(modm)

等式成立

5.可乘性:若 ab(modm)cd(modm),则 acbd(modm)

证:ab(modm)cd(modm)

m(ab)m(cd)

km=ablm=cd

acbd=acbc+bcbd=c(ab)+b(cd)=ckm+blm=m(ck+bl)

m(acbd),即 acbd(modm)

等式成立

6.可除性:若 acbc(modm),则 ab(modmgcd(m,c))

可除性前置一:若 a,b,m,n 为整数,且 cacb,则 c(ma+nb)

证:cacb

a=ce,b=cf(c,eZ)

ma+nb=mce+ncf=c(me+nf)

c(ma+nb)

可除性前置二:若 a,b,c 为正整数,且 gcd(a,b)=1abc,则ac

证:gcd(a,b)=1

可以构造出方程组 ax+by=1(x,yZ) (裴蜀定理)

两边同乘 c 得:acx+bcy=c

a(ac)a(bc)

根据可除性前置一,aacx+bcy

ac


证:acbc(modm)

m(acbc)=c(ab)

km=c(ab),两边同时除以 gcd(m,c),得:(c/gcd(m,c))(ab)=k(m/gcd(m,c))

gcd(m/gcd(m,c)c/gcd(m,c))=1(m/gcd(m,c))(c/gcd(m,c))(ab),根据可除性前置二,得:(m/gcd(m,c))(ab)

ab(modmgcd(m,c))

可除性推论:若 a,b,c 是整数,m 是正整数,gcd(c,m)=1acbc(modm),则 ab(modm)

费马小定理

内容

对于质数 p,正整数 a,若 gcd(a,p)=1,则 ap11(modp)

费马小定理也通常被写作 apa(modp) (可乘性)

证明

证明:考虑数学归纳法

首先 1p11(modp) (显然成立)

假设对于正整数 x 满足 gcd(x,p)=1,有xp11(modp)

(x+1)pxp+1(modp) (证明Lucas定理时证过,详见组合数学学习笔记(一)(2024.7.3))

xp11(modp)

xp+1x×xp1+1x+1(modp)

(x+1)px+1(modp)

(x+1)p11(modp) (可除性)

符合数学归纳法,等式成立。

逆元

定义

由可除性可知,模意义下的除法受 ca,cb 限制。

这是我们可以将除 c 改为乘 c 的倒数,就可以用乘法完成。

c 的倒数就成为 c 在该模数意义下的逆元。

形式化的,若 ax1(modm),则称 xa 在模 m 意义下的逆元。

费马小定理求逆元

ap11(modm)

a×ap21(modm)

ap2a 在模 p 意义下的逆元

模板:

#include <bits/stdc++.h>
using namespace std;
int qpow(int x, int p, int m){
	int res = 1;
	while(p > 0){
		if (p % 2 == 1)
			res = res * x % m;
		p /= 2;
		x = x * x % m;
	}
	return res;
}
int n, p;
int main(){
	scanf("%d%d", &n, &p);
  	printf("%d", qpow(n, p - 2, p));
	return 0;
} 

扩展欧几里得算法求逆元

ax1(modm)

p(ax1)

(k)p=ax1

移项得:ax+kp=1

ap 已知,xk 未知,且 gcd(a,p)=1,可以用扩展欧几里得算法求出 xk

模板:

#include <bits/stdc++.h>
using namespace std;
int extend_gcd(int a, int b, int &x, int &y){
	if(b == 0){
		x = 1;
		y = 0;
		return 0;
	}
	int d = extend_gcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}
int mod_inverse(int a, int m){
	int x, y;
	extend_gcd(a, m, x, y);
	return (x % m + m) % m;
}
int n, p;
int main(){
    scanf("%d%d", &n, &p);
    printf("%d", mod_inverse(n, p));
	return 0;
} 

递推求逆元

当我们要求 [1n] 之间所有数在模 p 意义下的逆元,此时可以用递推求出。

首先,1 在模 p 意义下的逆元还是 1

对于 a1 的情况,设 k=pij=pmodi(i,j,kN+)

p=ki+j

ki+j0(modp)

两边同乘 i1×j1 (x1 表式 x 在模意义下的逆元),得:

ki×i1×j1+ji1×j10(modp) (可乘性)

kj1+i10(modp) (逆元的定义)

i1=kj1(modp) (可减性)

带入 k,j 的定义得:

i1=pi(pmodi)1(modp)

pmodii,且求到 i 在模 p 意义下的逆元时已经求出了 [1i1] 之间所有数在模 p 意义下的逆元,可以线性递推。

模板:P3811 【模板】模意义下的乘法逆元

#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 9;
int inv[N], n, p;
int main(){
	scanf("%d%d", &n, &p);
	inv[1] = 1;
	printf("1\n");
	for(int i = 2; i <= n; i++){
		inv[i] = (p - p / i) * inv[p % i] % p;
		printf("%d\n", inv[i]);
	}	
	return 0;
} 

欧拉定理(扩展费马小定理)

内容

对于正整数 a,p,若 gcd(a,p)=1,则 aφ(p)1(modp) (注意条件与费马小定理的区别)

证明

证:我们知道,φ(p) 表示小于 p 且与 p 互质的数的个数,设这 φ(p) 个数分别是 x1,x2,xφ(p)

把每个数乘 a 再对 p 取模,得 ax1modp,ax2modp,,axφ(p)modp

假设 ax1modp=ax2modp,即 ax1=ax2(modp)

gcd(a,p)=1,根据可除性推论,得:x1=x2,而因为这 φ(p) 个数构成了模 p 得即约剩余系

x1x2,矛盾

ax1modp,ax2modp,,axφ(p)modpφ(p) 个数互不相同

假设 gcd(ax1modp,p)=g(g1)

要么 ga,要么 gx1,且 gn

gcd(x1,n)=1

gx1gn 不能同时成立

gcd(a,n)=1

gagn 不能同时成立

假设不成立

gcd(ax1modp,p)=1

{ax1modp,ax2modp,,axφ(p)modp}={x1,x2,xφ(p)},都是 p 的既约剩余系

ax1×ax2××axφ(p)x1×x2××xφ(p)(modp)

aφ(p)1(modp) (两边同除 x1×x2××xφ(p))

威尔逊定理

内容

p 是素数,则 (p1)!1(modp)

定理3.5.1

对于整数 a,b,正整数 m,设 gcd(a,m)=d,若 db,则 axb(modm) 无解,若 db,则 axb(modm) 恰好有 d 个模 m 不同余的解。

证:axb(modm)

m(axb)

my=axb

移项得:axmy=b

整数 xaxb(modm) 的解当且仅当存在 y 使得 axmy=b,由裴蜀定理可得,若 db,则无解,而 db 时,axmy=b 有无穷多解:x=x0+(m/d)ty=y0+(a/d)t

其中 x=x0y=y0 是方程的特解,上述 x 的值是 axb(modm) 的解,有无穷多这样的解。

设两个解 x1=x0+(m/d)t1x2=x0+(m/d)t2,假设这两个解在模 m 意义下同余,则:x0+(m/d)t1x0+(m/d)t2(modm)

(m/d)t1(m/d)t2(modm)

gcd(m/d,d)=m/d

t1t2(modm)(可除性)

这表明 axb(modm) 在模 p 意义下不同余的解的完全集合可以通过 x=x0+(m/d)t(t[0,d)tZ) 给出。

axb(modm) 恰好有 d 个模 m 不同余的解。

推论:对于整数 a,b,正整数 m,若 gcd(a,m)=1,则 axb(modm) 有模 m 的唯一解。

定理3.5.2

对于素数 p,正整数 a 是其自身模 p 意义下的逆元当且仅当 a1(modp)a1(modp)

证:若 a1(modp)a1(modp),则 a21(modp),所以 a 是其自身在模 p 意义下的逆元。

反过来,若 a 是其自身在模 p 意义下的逆元,则 a21(modp)

p(a21)

a2=(a+1)(a1)

p(a+1)p(a1)

a1(modp)a1(modp)(a1(modp) 也可以写作 ap1(modp))

证明

证:当 p=2 时,(p1)!11(mod2)

p3 时,根据定理3.5.1推论可得,对于 a(a[1,p)aZ),存在 a1(a1[1,p)a1Z),使得 a1a1(modp)

根据定理3.5.2可得,在小于 p 的正整数中,在模 p 意义下的逆元是其本身的数只有 1p1

可以将 2p2 分成 (p3)/2 组整数对且每组整数对都是一对模 p 意义下的逆元

2×3××(p3)×(p2)1(modp)

将同余式两边同乘 1p1,得:(p1)!=1×2×3××(p3)×(p2)×(p1)1(modp)

威尔逊定理逆定理

内容

对于正整数 nn2,若 (n1)!1(modn),则 n 是素数。

定理3.5.3

对于整数 a,b,c,若 abbc,则 ac

证:abbc

b=aec=bf

c=bf=(ae)f=a(ef)

ac

证明

假设 n 是一个合数,且 (n1)!1(modn)

假设 n=ab(a,bZa,b(1,n))

a 是组成 (n1)!n1 个数中的一个

a(n1)!

(n1)!1(modn)

n((n1)!+1)

an

根据定理3.5.3可得:a(n1)!+1

a(n1)!a(n1)!+1

根据定理1.2.1可得:a((n1)!+1)(n1)!=1,与 a(1,n)矛盾,假设不成立。

n 是素数。

中国剩余定理

内容

中国剩余定理是用来求解以下方程:(m1,m2,,mn是两两互质数)

{xa1(modm1)xa2(modm2)xan(modmn)

定理3.6.1

对于整数 a,b,c,若 gcd(a,b)=1c(a+b),则 gcd(a,c)=gcd(b,c)=1

证:

解法

解:令 M=p1×p2××pnMi=Mmi

根据定理3.6.1可得:gcd(Mi,mi)=1

根据定理3.5.1推论,Mi 存在唯一一个在模 mi 意义下的逆元 Mi1,令 x=aiMiMi1,带回原方程,可得

{x0(modm1)x0(modm2)xai(modmi)x0(modmn)

可以发现此时 xi 的取值只影响第 i 个同余方程,于是我们可以求出原方程得一组特解 x=a1M1M11+a2M2M21++anMnMn1=i=1naiMiMi1

通解 x=i=1naiMiMi1+kM(kZ)

四、原根

前置知识:阶

定义

对于整数 a(a0),正整数 ngcd(a,n)=1,使得 ax1(modn) 成立的最小正整数 x 称为 an 的阶,记为 indna

阶的性质

1.对于整数 a(a0),正整数 ngcd(a,n)=1,那么正整数 x 是同余方程 ax1(modn) 的一个解当且仅当 indnax

证:若 indnax,则 x=kindnax(kN+)

ax=akindna=(aindna)k1(modn)

反过来,若 ax1(modn),设 x=qindna+r(0r<indna)

ax=aqindna+r=(aindna)qarar(modn)

ar1(modn)

根据阶的定义以及 0r<indnar=0

x=qindna

indnax

2.对于整数 a(a0),正整数 ngcd(a,n)=1,那么 aiaj(modn)(i,jN) 当且仅当 ij(modindna)

证:若 ij(modindna)0ji,设 i=j+kindna(kN+)

ai=aj+kindna=aj(aindna)kaj(modn)

反过来,若 aiaj(modn)ij

gcd(a,n)=1

gcd(aj,n)=1

ajaiajaij(modn)

根据可除性推论,aij1(modn)

根据阶的性质1,indna(ij)

ij(modindna)

原根

定义

对于整数 a(a0),正整数 ngcd(a,n)=1,当 indna=ϕ(n) 时,称 a 是模 n 的原根或者 n 的原根,并且我们称 n 有一原根。

定理4.2.1

对于整数 a,b,正整数 k,m,若 ab(modm),则 akbk(modm)

证:ab(modm)

m(ab)

akbk=(ab)(ak1+ak2b++abk2+bk1)

(ab)(akbk)

根据定理3.5.3,m(akbk)

akbk(modm)

原根的存在性

1.设 p 是一个素数且 dp1 的一个正因子,那么模 p 的阶为 d 且不同余的整数的个数为 φ(d)

证:设 F(d) 表示小于 p 且模 p 的阶为 d 的正整数的个数。

一个不能被 p 整除的整数模 p 的阶整除 p1

p1=d(p1)F(d)

根据欧拉函数性质5,有 p1=d(p1)φ(d)

根据阶的性质1,当 d(p1) 时有 F(d)φ(d)

F(d)=φ(d),即对于 p1 的每一个正因子 d,有 F(d)=φ(d)

p 的阶为 d 且不同余的整数的个数为 φ(d)

原根的存在性1推论:每个素数都有原根

2(扩展).如果正整数 n 不是一个素数的幂或者不是一个素数的幂的两倍(幂可以为 0),那么 n 不存在原根。

证:设 n 的唯一分解是 i=1mpici,假设 n 有一个原根 r,即存在一个正整数 r 使得 gcd(r,n)=1indnr=φ(n)

gcd(r,pici)=1

根据欧拉定理,rφ(pici)1(modpici)

U=lcm(φ(p1c1),φ(p2c2),,φ(pmcm))

φ(pici)U

rU1(modpici)

根据定理4.2.1,有 rU1(modn)

indnr=φ(n)U

根据欧拉函数性质3,有 φ(n)=φ(p1c1,p2c2,,pmcm)=φ(p1c1)φ(p2c2)φ(pmcm)

φ(p1c1)φ(p2c2)φ(pmcm)lcm(φ(p1c1),φ(p2c2),,φ(pmcm))

一组数的乘积等于它的最大公倍数当且仅当这一组数两两互质。

φ(p1c1),φ(p2c2),,φ(pmcm) 两两互质。

根据欧拉函数性质2,有 φ(pici)=pici1(pi1)

φ(piti) 是偶数只有在 p 是奇数或 p=2t2 时成立除去 m=n1 这两种素数的幂情况,以及 m=2n=2pici 这两种情况,φ(p1c1),φ(p2c2),,φ(pmcm) 两两不互质.

如果正整数 n 不是一个素数的幂或者不是一个素数的幂的两倍(幂可以为 0),那么 n 不存在原根。

定理4.2.2

对于正整数 u,若 indna=t,则 indn(au)=t/gcd(t,u)

证:设 s=indn(au),v=gcd(t,u),t=t1v,u=u1v

gcd(t,u)=v

gcd(t1,u1)=v

(au)t1=(au1v)(t/v)=(at)u11(modn)

根据阶的性质1,st1

(au)s=aus1(modn)

根据阶的性质1,tus

t1uu1vs

t1u1s

gcd(t1,u1)=1

根据可除性前置二,t1s

st1t1s

s=t1=t/u=t/gcd(t,u)

定理4.2.2推论:若 rn(n>1) 的原根,则 run 的原根当且仅当 gcd(u,φ(n))=1

定理4.2.3

对于正整数 r,ngcd(n,r)=1,若 rn 的一个原根,则 r,r2,,rφ(n) 构成了模 n 的既约剩余系。

证:gcd(r,n)=1

gcd(rk,n)=1(kN+)

这些幂都与 n 互质。

假设有 rirj(modn)

根据阶的性质2,ij(modindnr)

rn 的原根。

indnr=φ(n)

1i,jφ(n)

i=j

没有两个数的指数是相同的。

每个数都不模 n 同余。

这些数构成了模 n 的既约剩余系。

原根的个数

对于正整数 n,若它有一个原根,那它一共有 φ(φ(n)) 个不同余的原根。

证:rn 的原根。

根据定理4.2.4,r,r2,,rφ(n) 构成了模 n 的既约剩余系。

根据定理4.2.2推论,run 的原根当且仅当 gcd(u,φ(n))=1

满足条件的 uφ(φ(n)) 个。

n 一共有 φ(φ(n)) 个不同余的原根。

定理4.2.4(拉格朗日定理)

假设 f(x)=i=0naixi 是一个次数为 n 且首项系数 anp 的整系数多项式,n1,那么 f(x) 至多有 n 个模 p(pP) 不同余的根。

证:考虑数学归纳法。

n=1 时,f(x)=a1x+a0pa1

f(x)p 的一个根就是同余方程 a1xa0(modp) 的解。

gcd(a1,p)=1

根据定理3.5.1,同余方程 a1xa0(modp) 恰有一个解。

f(x)p 也恰有一根,定理成立。

n>1 时,假设定理对 n1 次多项式成立,设 f(x) 是一个次数为 n 且首项系数不被 p 整除的多项式,g(x) ,假设这个多项式 f(x)n+1 个模 p 不同余的根,记为 c0,c1,c2,,cn

f(x)f(c0)=i=1nai(xic0i)=an(xc0)(xn1+xn2c0++xc0n2+c0n1)+an1(xc0)(xn2+xn3c0++xc0n3+c0n2)++a1(xc0)=(xc0)g(x)

k 是一个整数且 1kn

f(ck)f(c0)0(modp)

f(ck)f(c0)=(ckc0)g(ck)0(modp)

c0ck 是不同的根。

ckc00

g(ck)0(modp)

ckg(x)p 的一个根。

一个次数为 n1 且首项系数不能被 p 的多项式 g(x)n 个模 p 不同余的根,与数学归纳法的假设相矛盾,不成立。

f(x) 至多有 n 个模 p(pP) 不同余的根。

定理4.2.5

对于素数 pdp1 的因子,那么多项式 f(x)=xd1 恰有 d 个模 p 不同余的根。

证:设 p1=de

xp11=(xd1)(xd(e1)+xd(e2)++xd+1)=(xd1)g(x)

根据费马小定理,xp1p1 个模 p 不同余的根,这些根就是 xd1p 不同余的根与 g(x)p 不同余的根的并集

根据拉格朗日定理,g(x)p 不同余的根至多有 d(e1)=p1d

多项式 f(x)=xd1 的根至少有 (p1)(p1d) 个模 p 不同余的根。

根据拉格朗日定理,f(x)=xd1 至多有 d 个模 p 不同余的根。

xd1 恰好有 d 个模 p 不同余的根。

原根的应用

观察定理4.2.5的式子,它的形式和单位根完全一样。

由于形如 pt 的数都是原根,所以原根可以通过乘法递推,将原根带入 x 后,可以发现原根的所有幂都满足该方程,且模 p 不同余的数恰好有 p 个,因此,解决模意义下的多项式乘法可以用原根替代单位根

参考资料

posted @   JPGOJCZX  阅读(33)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示