[数论]数论基础
\(1.\)基础数论
\((1).\) 带余除法
在小学三年级我们学习了带余除法,他的一般形式是
也就是\(x\times z+w=y\),于是我们引入同余方程
同余方程有以下性质
假设我们有\(x \equiv p \pmod y ,t\equiv q \pmod y\)
\((\text i).\)\(x+k\times y \equiv p\pmod y\)
\((\text{ii}).\)\(x+k\times t\equiv p+k\times q\pmod y\)
\((\text{iii}).\)\(x\times t\equiv p\times q \pmod y\)
\((\text{iv}).\)\(x^n\equiv p^n\pmod y\)
\((\text V).\)若\(ac\equiv bc \pmod y\)则\(a\equiv b\pmod {\frac{y}{gcd(y,c)}}\)
\((2).\)算数基本定理
其中\({p_1,p_2...p_i...}\)为全部的质数,\({\forall i\in \mathbb N+,\alpha_i\in \mathbb N}\)
\((3).\)剩余系
\((\text i)\).完全剩余系:若集合\(A={a_1,a_2...a_m}\)满足\(\forall i\neq j,a[i]\not\equiv a[j]\pmod m\)则称\(A\)为模\(m\)意义下的一个完系
\((\text{ii})\)设 \(m\) 为正整数。若一组整数 \(a_1, a_2, \dots, a_s\) 满足以下三个条件,则称它们为模 \(m\) 的一个简化剩余系(缩系):
①\(.\forall i\in[1,s],gcd(a_i,m)=1\)
②\(.\forall i\neq j,a[i]\not\equiv a[j]\pmod m\)
③\(. \forall x\in \mathbb Z,gcd(x,m)=1,\exists! i,a[i]\equiv x\pmod m\)
\((4).\)裴蜀定理(贝祖定理)
证明: 考虑构造集合\(A=\{ax+by\mid x,y\in\mathbb Z,ax+by>0\}\)
\(\because ab\neq 0\)
\(\therefore A\neq\)∅
取其中最小元素设为\(m,\therefore m=ax_0+by_0\)
记\(a=qm+r,a=q(ax_0+by_0)+r\therefore r=a(1-qx_0)-by_0\)
若\(r\neq 0\Rightarrow r \in A\)
\(\therefore r=0\Rightarrow m\mid a\)同理可得\(m\mid b\)
\(\therefore m\le d\)
\(d>0,\forall x,y,d\mid ax+by\therefore d\mid m\Rightarrow d\ge m\)
所以有\(d=m,x_0,y_0\) 即所求解
\((5).exgcd\)
\((\text i).\)目的:解决不定方程\(ax+by=c\) 的解
\((\text{ii})\).因为裴蜀定理,若\(c\)不是\(gcd(a,b)\)的倍数,则必然无解
引理:\(gcd(a,b)=gcd(b,a\%b)\)
证明: \(a=qb+r \forall d,d|a,d|b\Rightarrow d|(a-qb)\Rightarrow d|r\) 所以我们有:\(a,b\)的任意公约数都是\(b,r\)的公约数
\(\forall d_1|r,d_1|b,\Rightarrow d_1|qb+r\Rightarrow d_1|a\)所以我们有:\(b,r\)的任意公约数都是\(a,b\)的公约数,所以\(gcd(a,b)=gcd(b,a\%b)\)
\((\text{iii})\).假如在递归的某一层,我们知道了下一层的解 \(x_1,y_1\)
则有\(ay_1+b(x_1-\lfloor \frac ab\rfloor y_1)=c\)所以有:
\(\begin{cases}
x = y_1 \\
y = x_1 - \lfloor a / b \rfloor \cdot y_1
\end{cases}\)
$Code$
void exgcd(int a,int b,int &x,int &y){
if(b==0){x=1,y=0;return ;}
int w=0,z=0;
exgcd(b,a%b,w,z);
x=z;y=(w-(a/b)*z);
return ;
}
\((6).\)中国剩余定理\((CRT)\)
\(\begin{cases} x\equiv a_1\pmod {m_1} \\ x\equiv a_2\pmod {m_2} \\ ......\\ x\equiv a_k\pmod {m_k} \end{cases}\)一定存在\(x\)使上述方程组成立,且在模\(m_1\times m_2\cdots \times m_k\)的意义下唯一
\((7).\) 欧拉函数
\((\text i).\)定义:\(n\)的缩系中元素的个数,或如下
\((\text{ii}).\)性质:
①\(.\)若\(p\)为质数,则\(\varphi(p)=p-1\),且\(\forall k\in N_*,\varphi(p^k)=p^k-p^{k-1}\)
证明: 对于任意质数\(p\)有\(\forall x<p,x\in N_*,gcd(p,x)=1(gcd(1,p)=1)\)所以有\(\varphi(p)=p-1\)
对于\(p^k\),\(p^k\)显然只有一个质因子\(p\)(由算术基本定理得),所以与\(p^k\)不互质的数有\(p,2p\dots p^k\)共\(p^{k-1}\)个,所以
②\(.\)若\(gcd(a,b)=1\)则\(\varphi(ab)=\varphi(a)\times\varphi(b)\)
证明:
该引理的正确性显然
该引理即中国剩余定理的特殊形式
构造映射\(f(\alpha,\beta)\),表示在\(a\)的缩系中的元素\(\alpha\)与\(b\)的缩系中元素\(\beta\)对应\(ab\)的缩系中的一个元素\(f(\alpha,\beta)\)
因为引理1,该元素\(f(\alpha,\beta)\)一定存在,因为引理2,该映射\(f\)是一个一一映射,所以得证
③\(.\)计算公式:若\(n=\prod_{i=1}^k p_i^{\alpha_i}\)其中\(p_i\)为素数,则
证明:\(\varphi(n)=n\times\prod_{i=1}^k(1-\frac1 {p_i})=\prod_{i=1}^kp_i^{\alpha_i-1}(p_i-1)\)显然有\(\forall p_1,p_2,k_1,k_2,gcd(p_1^{k_1},p_2^{k_2})=1\)
由性质2可得\(\varphi(n)=\prod_{i=1}^k\varphi(p_i^{\alpha_i})\)由性质1可得\(\varphi(n)=\prod_{i=1}^kp_i^{\alpha_i-1}(p_i-1)\)得证
\(\text{(iii).Code}\)
int phi(int x){
int res=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
while(x%i==0) x/=i;
res-=(res/i);
}
}if(x>1) res-=(res/x);
return res;
}
\((8).\)欧拉定理
证明: 设\(k_1,k_2,\dots k_{\varphi(m)}\)为\(m\)的一个缩系,由于\(gcd(a,m)=1\)
\(ak_1,ak_2\dots ak_{\varphi(m)}\)也为\(m\)的一个缩系,所以有
因为\(gcd(\prod_{i=1}^{\varphi(m)} k_i,m)=1\),所以\(a^{\varphi(m)}\equiv 1 \pmod m\)
证毕
\((9).\) 扩展欧拉定理
证明:
引理\(1.2\)证明:
我们记两个集合\(A,B,C\)分别表示\(a,b,c\)的素因子集,则\(A\cap B=\varnothing,A,B\in C\Rightarrow A\cup B\in C\)所以\(a,b\)的所有素因子均为\(c\)的素因子且有\(c\)上每个素因子次数均大于\(a,b\)上的,自然也大于\(ab\)上的所以\(ab\mid c\)
引理\(1.1\)证明
我们显然有\(\forall i\le n,p_i^{\alpha_i}\mid(x-k)\)于是依据引理\(1.2\),\(\prod p_i^{\alpha_i}\mid (x-k)\Rightarrow x\equiv k\pmod{\prod_{i=1}^np_i^{\alpha_i}}\)
假设\(m=\prod p_i^{\alpha_i}\),依据引理\(1.1\)我们只需证\(\forall i,a^b\equiv a^{b\mod \varphi(m)+\varphi(m)}\pmod{p_i^{\alpha_i}
}\)
\(Case1:gcd(a,p_i^{\alpha_i})=1\)
此时有\(a^{\varphi(p_i^{\alpha_i})}\equiv 1\pmod {p_i^{\alpha_i}}\)而且\(\varphi(p_i^{\alpha_i})\mid \varphi(m)\)(欧拉函数的积性)\(\Rightarrow a^{\varphi(m)}\equiv 1\pmod{p_i^{\alpha_i}}\)易证原式
\(Case2:\)此时有\(p_i\mid a,\Rightarrow a=kp_i\)依据欧拉函数的积性\(\varphi(m)\ge\varphi(p_i^{\alpha_i})=p_i^{\alpha_i}-p_i^{\alpha_i-1}\ge\alpha_i\)(求导可得)
所以我们有\(b>\varphi(m)\ge\varphi(p_i^{\alpha_i})\ge\alpha_i\)
\(\therefore a^b=k^bp_i^b\because b>\alpha_i\therefore p_i^{\alpha_i}\mid a^b\Rightarrow a^b\equiv 0\pmod {p_i^{\alpha_i}}\)
\(b\mod\varphi(m)+\varphi(m)\ge\varphi(p_i^{\alpha_i})>\alpha_i,a^{b\mod \varphi(p_i^{\alpha_i})+\varphi(p_i^{\alpha_i})}\equiv 0\pmod {p_i^{\alpha_i}}\)
原同余式得证
综上所述,\(\forall i\le n\)有\(m=p_i^{\alpha_i}\)成立,依据中国剩余定理及算数基本定理,扩展欧拉定理成立
证毕
\((10).\)卢卡斯定理\((\text{Lucas})\)
当\(p\)为素数时,
证明: 略
应用:
int C(int n,int m,int p){
if(m>n) return 0;
return (fac[n]*inv[m]%p)*inv[n-m]%p;
}
int Lucas(int n,int m,int p){
if(m==0) return 1;
return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
\((11).\)积性函数的求法
网上有很多人把这个叫“欧拉筛求积性函数”,我觉得其实这是很有误导性的叫法,其本质是基于算术基本定理及其定义可得
\((1).\)积性函数的定义:对于一个定义域在\(Z\)上的函数\(f\),满足\(\forall x,y\in Z,gcd(x,y)=1\Rightarrow f(xy)=f(x)\times f(y)\),则称其为积性函数
特别的,若\(\forall x,y\in Z,f(xy)=f(x)\times f(y)\),则称其为完全积性函数
\((2).\)一个积性函数可以使用算数基本定理进行求解,需要满足如下条件
\(\text{(i)}.\forall p,p\)是一个质数,\(f(p)\)是独立的
这里的独立是指\(f(p)\)的取值不能由某一个合数的\(f\)值推出
\(\text{(ii)}.\)对于每一个质数\(p\),其取值可以\(O(1)\)的时间内求出或进行预处理
\((3).\)求解过程是显然的
int p[N],tot,f[N];
void initprime(int n){
......
}
int f(x){
int res=1;
for(int i=1;i<=tot;i++){
if(p[i]>x) return res;
while(x%p[i]==0) res*=f[p[i]];
}return res;
}
\((4).\)时间复杂度
\(x=\prod p_i^{\alpha_i}\),时间复杂度为\(O(\sum \alpha_i)\),最坏情况\(O(\log_2 x)\),实际上远小于这个值,如果\(x\)是随机的,期望复杂度大概是\(O(\log\log x)\)
\(2.\)素数筛
超级简单的小算法,其实并不需要知道原理,背板子即可
\((1).\)埃氏筛
思想核心:素数的倍数是合数、
实现方式:引入数组\(notprime[i]\),当考虑新数\(x\) 时,若\(notprime[x]=0\) 则\(x\)为素数,后将\(x\)的所有倍数标记为合数
正确性证明:\(\forall x\in N,x=\ p_i^{\alpha_i}\)其中\(p_i\)为质数,\(\alpha_i\ge 0,\alpha_i \in N\)且\(\forall\alpha_i\neq 0,p_i\le x\)所以如果\(x\)是合数,则它一定在之前被标记过,所以如果\(notprime[x]=0,x\)为质数
bool p[100000017]; int b[1000017],cnt;
void prime(int n){
for(int i=2;i<=n;i++){
if(!p[i]) cnt++,b[cnt]=i;
for(int j=1;j<=cnt;j++){
if(i*b[j]>n) break;
p[i*b[j]]=1;
if(b[j]%i==0) break;
}
}
}
时间复杂度:\(O(n\ln\ln n)\)
证明:我们实际在将素数的所有倍数标记,对于任意素数\(p\)我们进行\(\frac n p\)次操作,所以时间复杂度为\(\sum \frac n p=n\sum \frac1 p\)依据梅滕斯第二定理,有\(\sum \frac 1 p=\ln \ln n+M+O(\frac 1 {\ln n})\)
\((2).\)线性筛
即使埃氏筛的时间复杂度已经被优化到\(\ln\ln n\)但在\(n\)极大时(如\(10^8\)),效率仍然低下,于是我们考虑优化,注意到埃氏筛的某一个数可能被多次标记,所以线性筛的原理就是使每一个数只被筛一遍
原理:每一个合数只被其最小质因子筛一遍
const int N=100000017;
bitset<N> p; int b[N],cnt;
void prime(int n){
for(int i=2;i<=n;i++){
if(!p[i])cnt++,b[cnt]=i;
for(int j=1;j<=cnt;j++){
if(i*b[j]>n) break;
p[i*b[j]]=1;
if(i%b[j]==0) break;
}
}
}
\((3).\)线性筛分解质因数
int p[N],b[N],pest[N],tot;
void Prime(int n){
for(int i=2;i<=n;i++){
if(!b[i]) p[++tot]=i,pest[i]=tot;
for(int j=1;j<=tot;j++){
b[i*p[j]]=1;
pest[i*p[j]]=j;
if(i%p[j]==0) break;
}
}
}
void devide(int x){
while(x>1){
int k=p[pest[x]];
while(p[pest[x]]==k) x/=k;
}
}
时间复杂度:预处理\(O(n)\),实际分解最劣\(O(\log n)\),期望\(O(\log\log n)\)
posted on 2026-06-29 14:57 Underthetwilight 阅读(22) 评论(0) 收藏 举报
浙公网安备 33010602011771号