数论基础总结
数论基础
整除
定义: 两个数 a , b a,b a,b ,满足 a ≠ 0 a\neq 0 a=0 。如果有一个数 q q q ,使 a q = b aq=b aq=b ,我们称作 b b b 可以被 a a a 整除,记作 a ∣ b a\mid b a∣b 。并且, b b b 是 a a a 的倍数, a a a 是 b b b 的约数。
同余
定义: 整数 m ≠ 0 m\neq 0 m=0 ,如果 m ∣ ( a − b ) m\mid (a-b) m∣(a−b) ,那么 m m m 为模数, a a a 同余于 b b b 模 m m m 。记作 a ≡ b ( m o d a\equiv b (\bmod a≡b(mod m ) m) m)。
同余的性质:
- 自反性: a ≡ a ( m o d a\equiv a(\bmod a≡a(mod m ) m) m)
- 对称性:如果 a ≡ b ( m o d a\equiv b(\bmod a≡b(mod m ) m) m) ,则 b ≡ a ( m o d b\equiv a(\bmod b≡a(mod m ) m) m)
- 传递性:如果 a ≡ b ( m o d a\equiv b(\bmod a≡b(mod m ) m) m) , b ≡ c ( m o d b\equiv c(\bmod b≡c(mod m ) m) m),则 a ≡ c ( m o d a\equiv c(\bmod a≡c(mod m ) m) m)
- 如果 k k k 与 m m m 互质,且 a k ≡ b k ( m o d ak\equiv bk(\bmod ak≡bk(mod m ) m) m) ,则 a ≡ b ( m o d a\equiv b(\bmod a≡b(mod m ) m) m)
- 如果 a ≡ b ( m o d a\equiv b(\bmod a≡b(mod m ) m) m) , c ≡ d ( m o d c\equiv d(\bmod c≡d(mod m ) m) m) ,则 a ± c ≡ b ± d ( m o d a\pm c\equiv b\pm d(\bmod a±c≡b±d(mod m ) m) m) , a c ≡ b d ( m o d ac\equiv bd(\bmod ac≡bd(mod m ) m) m)
- 如果 a ≡ b ( m o d a\equiv b(\bmod a≡b(mod m ) m) m) ,则 a c ≡ b c ( m o d ac\equiv bc(\bmod ac≡bc(mod m ) m) m) ( c > 0 ) (c>0) (c>0)
素数
定义:
素数: 因数只有 1 1 1 和它本身
合数: 素数以外的数都是合数
特别的, 1 1 1 既不是质数,也不是合数
互质:
两个数的公因数只有1,成为这两个数互质
插播:整数唯一分解定理:
a = p 1 c 1 p 2 c 2 p 3 c 3 p 4 c 4 . . . p r c r ( 2 ≤ p 1 < p 2 < p 3 < ⋯ < p r ) a = p ^ {c_1} _ {1}p ^ {c_2} _ {2}p ^ {c_3} _ {3}p ^ {c_4} _ {4} ... p ^ {c_r} _ {r}(2 \le p _ 1 \lt p _ 2 \lt p _ 3 \lt \cdots \lt p_r) a=p1c1p2c2p3c3p4c4...prcr(2≤p1<p2<p3<⋯<pr)
素数判断:
暴力做法
枚举 x x x 的约数,如果有除 1 1 1 和它本身的约数, x x x 为合数,否则为素数
代码模板:
bool isPrime(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
Miller-Rabin 素性测试
适用于较大数的判定
费马小定理和二次探测定理
费马小定理参考后文
二次探测定理
如果 p p p 是素数, x x x 是小于 p p p 的正整数,且 x 2 ≡ 1 ( m o d x^2\equiv 1 (\bmod x2≡1(mod p ) p) p), x x x 的取值有两种情况, x = 1 x=1 x=1 或 x = p − 1 x=p-1 x=p−1。
因为 x 2 x^2 x2 m o d \bmod mod p = 1 p=1 p=1 ,即 p p p ∣ \mid ∣ x 2 − 1 x^2-1 x2−1 , p p p ∣ \mid ∣ ( x + 1 ) ( x − 1 ) (x+1)(x-1) (x+1)(x−1) 。
又因为 p p p 是素数且 x < p x<p x<p ,所以只可能是 p ∣ x − 1 p\mid x-1 p∣x−1 ( x = 1 ) (x=1) (x=1) 或 p ∣ x − 1 p\mid x-1 p∣x−1 ( x = p − 1 ) (x=p-1) (x=p−1) 。
接下来将费马小定理和二次探测定理结合,得到Miller-Rabin 素性测试的做法:
测试整数 n n n 是否为素数。
如果 n n n 是素数,根据费马定理, a n − 1 ≡ 1 ( m o d a^{n-1} \equiv 1 (\bmod an−1≡1(mod n ) n) n) 。
设 d d d 和 r r r ,满足 n − 1 = d × 2 r n-1=d\times2^r n−1=d×2r , d d d 为奇数,则 r r r 为 n − 1 n-1 n−1 中 2 2 2 的个数,式子变形为:
a n − 1 % n a^{n-1}\%n an−1%n = = = ( a d ) 2 r (a^d)^{2^r} (ad)2r = = = ( a d ) 2 r − 1 × ( a d ) 2 r − 1 % n (a^d)^{2^{r-1}}\times (a^d)^{2^{r-1}}\%n (ad)2r−1×(ad)2r−1%n
根据上文所说的二次探测定理,则 ( a d ) 2 r − 1 (a^d)^{2^{r-1}} (ad)2r−1% n = 1 n=1 n=1 或 ( a d ) 2 r − 1 (a^d)^{2^{r-1}} (ad)2r−1% n = n − 1 n=n-1 n=n−1
接下来分三种情况:
- 如果 ( a d ) 2 r − 1 % n ≠ 1 (a^d)^{2^{r-1}}\%n\neq 1 (ad)2r−1%n=1 且 ( a d ) 2 r − 1 % n ≠ n − 1 (a^d)^{2^{r-1}}\%n\neq n-1 (ad)2r−1%n=n−1 ,则 n n n 一定不是素数,返回 f a l s e false false;
- 如果 ( a d ) 2 r − 1 % n = n − 1 (a^d)^{2^{r-1}}\%n=n-1 (ad)2r−1%n=n−1 ,则认为 n n n 是素数,返回 t r u e true true;
- 如果 ( a d ) 2 r − 1 % n = 1 (a^d)^{2^{r-1}}\%n=1 (ad)2r−1%n=1 ,继续:根据二次探测定理, ( a d ) 2 r − 2 (a^d)^{2^{r-2}} (ad)2r−2 的值可能为 1 1 1 或 n − 1 n-1 n−1,以此类推。
代码模板:
bool Miller_Rabin(ll n){
if(n==2)return true;
if(n<2||!(n&1))return false;
int t=2,r=0;
ll m=n-1;
while(m%2==0){
r++;
m>>=1;
}
srand(100);
while(t--){
ll a=rand()%(n-1)+1;
ll x=q_pow(a,m,n),tmp=0;
for(int i=0;i<r;i++){
tmp=q_mul(x,x,n);
if(tmp==1&&x!=1&&x!=n-1)return false;
x=tmp;
}
if(tmp!=1)return false;
}
return true;
}
注: Miller-Rabin是一种不确定的算法,随机选择一个底数 a a a 进行测试,准确率是 75 % 75\% 75%。但是不用担心,多次用不同的底数 a a a 测试,准确率非常高。
果巨说:
- 2 32 2^{32} 232 范围以内的数,只需要测试 2 , 3 , 61 2,3,61 2,3,61即可;
- 2 64 2^{64} 264 范围以内的数,只需要测试 2 , 3 , 5 , 7 , 11 2,3,5,7,11 2,3,5,7,11即可;
- n n n特别大时,随机选一个 a a a进行测试,合数通过测试的概率低于 1 4 \frac 1 4 41,合数通过 c c c轮测试的概率低于 1 4 c \frac 1 {4 ^ c} 4c1,适当设定测试次数即可。
素数筛法:
上面介绍的是素数判断,如果要用到大量素数,筛法更合适。
埃氏筛
要筛出 x x x 范围以内所有的素数
埃氏筛的基本思想:
从2开始,将每个素数的倍数都标记为合数,以此来筛选素数。
因为每一个合数都可以分解为质因数相乘且都小于它自身,所以保证每一个 x x x 范围以内的合数都会被筛掉,且如果筛到了某个数而未被标记,这个数一定是素数。
代码模板:
void e(int x){
f[0]=f[1]=false;//排除0和1
for(int i=2;i<=x;i++){//最开始将x以内的大于1的数都标记为质数
f[i]=true;
}
for(int i=2;i*i<=x;i++){
if(f[i]){//如果筛到了且未被标记,则是质数,接下来筛掉这个质数的倍数
for(int sum=i*i;sum<=x;sum+=i){
f[sum]=false;//标记为合数
}
}
}
return ;
}
最后, f i f_i fi 为真,则 i i i 为质数,为假则为合数。
时间复杂度 O ( n × log ( log n ) ) O(n\times \log(\log n)) O(n×log(logn))
欧拉筛
原理同埃氏筛,增加了一个标记最小质因子的过程。
欧拉筛的基本思想:
在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,不重复筛选同一个合数。
代码模板:
void o(int x){
v[0]=v[1]=false;
for(int i=2;i<=x;i++){
v[i]=true;
}
for(int i=2;i<=x;++i){
if(v[i]){//之前没有被筛掉就是素数,加入到素数数组里
prime[++cnt]=i;//cnt就是素数的个数
}
for(int j=1;j<=cnt;++j){//筛掉i的素数倍,即i的prime[j]倍
if(i*prime[j]>x){//防止溢出
break;
}
v[i*prime[j]]=false;//把倍数标记为合数
if(i%prime[j]==0){//最重要的一句话,下文解释
break;
}
}
}
return ;
}
欧拉筛正确性的证明:
假设我们要筛掉数
a
a
a ,且
a
a
a 的最小质因数为
p
p
p ,让
a
=
p
b
a=pb
a=pb。显然
b
<
a
b<a
b<a ,所以
b
b
b 先被外层循环找到,要筛掉它的倍数。因为
p
p
p 是
a
a
a 的最小质因数,所以
b
b
b 的最小质因数必大于等于
p
p
p ,这样就保证
b
b
b 筛掉
a
a
a 前不会在if(i%prime[j]==0) break;
处跳出循环。即使
b
b
b 的最小质因数等于
p
p
p ,也会先筛掉
a
a
a 后再跳出循环。同理,所有合数都会被筛掉。
欧拉筛时间复杂度的证明:
欧拉筛的时间复杂度为 O ( n ) O(n) O(n) ,是线性的。
那么,每个合数就只会被筛一次,设一个合数 a a a ,就是 v [ a ] v[a] v[a] 只会被筛一次。
首先,对于 a = p b a=pb a=pb ,前面已经证明 b b b 只会筛掉 a a a 一次。那么会不会有别的数再次筛 a a a 呢?假设 a a a 又被 c c c 筛了一次,设 a = q c a=qc a=qc , q q q 就是 c c c 筛掉 a a a 的素数。
- 如果 c > b c>b c>b,则 q < p q<p q<p,但这与 a a a 的最小质因数为 p p p 相矛盾,排除;
- 如果 c < b c<b c<b,则 q > p q>p q>p,说明 p p p 是 c c c 的质因数。当 c c c 从小到大筛掉它的素数倍数时,在筛到 c p cp cp 时就停止循环了,所以轮不到 a a a 。
自此得证。
最大公约数-GCD
定义: 指一些整数所共同拥有的最大的约数。
最大公约数即为Greatest Common Divisor
,常缩写为gcd
。
求解一些整数的最大公约数
暴力解法
暴力解法很简单,求
a
a
a 和
b
b
b 的最大公约数,假定
a
<
b
a<b
a<b ,则从
a
a
a 开始枚举,到
1
1
1 结束,如果出现一个数
i
i
i 满足a%i==0&&b%i==0
,跳出循环就可以了。
太简单,没有代码。
欧几里得算法
求出 a a a 和 b b b 的最大公约数。
-
假定 a > b a>b a>b ,如果 b b b 是 a a a 的约数, b b b 就是它们的最大公约数。
-
当 b b b 不是 a a a 的约数时,我们设 a = b k + r ( r < b ) a=bk+r(r<b) a=bk+r(r<b)。
-
又设 d ∣ a d\mid a d∣a 且 d ∣ b d\mid b d∣b,则 r = a − b k r=a-bk r=a−bk 可转换为 r d = a d − b k d \frac{r}{d}=\frac{a}{d}-\frac{bk}{d} dr=da−dbk,由此可知 r d \frac{r}{d} dr 为整数, d ∣ r d\mid r d∣r ,所以 gcd ( a , b ) = gcd ( b , a % b ) \gcd(a,b)=\gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)。
代码模板:
int gcd(int a,int b){
if(b==0){
return a;
}
return gcd(b,a%b);
}
扩展欧几里得算法
定义: 扩展欧几里德定理 ( E x t e n d e d E u c l i d e a n a l g o r i t h m , E X G C D ) (Extended \space Euclidean \space algorithm, EXGCD) (Extended Euclidean algorithm,EXGCD),常用于求 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的一组可行解。
证明:
设 a x 1 + b y 1 = gcd ( a , b ) a x_1 + b y_1 = \gcd ( a , b ) ax1+by1=gcd(a,b)
b x 2 + ( a % b ) y 2 = gcd ( b , a % b ) bx_2+(a\% b)y_2=\gcd(b,a\% b) bx2+(a%b)y2=gcd(b,a%b)
由欧几里得定理可知: gcd ( a , b ) = gcd ( b , a % b ) \gcd(a,b)=\gcd(b,a\% b) gcd(a,b)=gcd(b,a%b)
所以 a x 1 + b y 1 = b x 2 + ( a m o d b ) y 2 ax_1+by_1=bx_2+(a\bmod b)y_2 ax1+by1=bx2+(amodb)y2
又因为 a % b = a − ( ⌊ a b ⌋ × b ) a\% b=a-(\lfloor\frac{a}{b}\rfloor\times b) a%b=a−(⌊ba⌋×b)
所以 a x 1 + b y 1 = b x 2 + ( a − ( ⌊ a b ⌋ × b ) ) y 2 ax_1+ by_1 = bx_2+ (a-(\lfloor\frac{a}{b}\rfloor\times b))y_2 ax1+by1=bx2+(a−(⌊ba⌋×b))y2
a x 1 + b y 1 = a y 2 + b x 2 − ⌊ a b ⌋ × b y 2 = a y 2 + b ( x 2 − ⌊ a b ⌋ y 2 ) ax_1+by_1=ay_2+bx_2-\lfloor\frac{a}{b}\rfloor\times by_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2) ax1+by1=ay2+bx2−⌊ba⌋×by2=ay2+b(x2−⌊ba⌋y2)
因为 a = a , b = b a=a,b=b a=a,b=b,所以 x 1 = y 2 , y 1 = x 2 − ⌊ a b ⌋ y 2 x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2 x1=y2,y1=x2−⌊ba⌋y2
将 x 2 , y 2 x_2,y_2 x2,y2 不断代入递归求解直至GCD为 0 0 0 递归 x = 1 , y = 0 x=1,y=0 x=1,y=0 回去求解。得证
代码模板:
int exgcd(int a,int b) {
if(!b){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b);
int k=x;
x=y;
y=k-(a/b)*y;
return d;
}
关于扩展欧几里得算法解的讨论
有无解
设 d d d 为一整数,若 a % d = 0 a\%d=0 a%d=0 且 b % d = 0 b\%d=0 b%d=0 ,则 ( a x + b y ) % d = 0 (ax+by)\%d=0 (ax+by)%d=0
对于不定方程 a x + b y = c ax+by=c ax+by=c,设 g c d ( a , b ) = d gcd(a,b)=d gcd(a,b)=d
根据上述结论,如果 a x + b y = c ax+by=c ax+by=c 有解,则 c % d = 0 c\%d=0 c%d=0 。
所以如果 c % d ≠ 0 c\%d\neq 0 c%d=0 ,那么 a x + b y = c ax+by=c ax+by=c 一定无解。
通解
方程原来得出的解为 x = x ′ × c / d , y = y ′ × c / d x=x'\times c/d,y=y'\times c/d x=x′×c/d,y=y′×c/d
原方程的解有无数组,且满足:
a × ( x + k × b ) + b × ( y − k × a ) = c a \times (x+k\times b)+b \times (y-k\times a)=c a×(x+k×b)+b×(y−k×a)=c
于是得到原方程的通解:
x = x ′ × c / d + k × b / d x=x'\times c/d+k\times b/d x=x′×c/d+k×b/d
y = y ′ × c / d − k × a / d y=y'\times c/d-k\times a/d y=y′×c/d−k×a/d
乘法逆元
定义:对于一个数 a a a , a − 1 a^{-1} a−1 为它模 p p p 意义下的乘法逆元。满足 a × a − 1 ≡ 1 ( m o d p ) a \times a ^ {-1} \equiv 1(\bmod \space p) a×a−1≡1(mod p)。
求解乘法逆元
扩展欧几里得求解
用扩展欧几里得算法解线性同余方程: a x ≡ 1 ( m o d p ) ax \equiv 1 (\bmod \space p) ax≡1(mod p)。
代码模板:
int inv(int a,int n){
int x,y;
if(exgcd(a,n,x,y)==1){
return (x+n)%n;
}
else{
return -1;
}
}
费马小定理求解
同样,费马小定理参考下文
因为 a p − 1 ≡ 1 ( m o d p ) a ^ {p - 1} \equiv 1 (\bmod \space p) ap−1≡1(mod p),所以 a − 1 = a p − 2 a ^ {-1} = a ^ {p - 2} a−1=ap−2,前提是 p p p 是质数且 a a a 和 p p p 互质。
上文介绍的是单个逆元求解,连续逆元可以线性求解
线性求逆元
1 1 1 的逆元是 1 1 1 , 1 × 1 ≡ 1 ( m o d p ) 1\times 1\equiv 1 (\bmod \space p) 1×1≡1(mod p)
我们要求解 a a a 的逆元,即 a × a − 1 ≡ 1 ( m o d p ) a \times a^{-1} \equiv 1(\bmod \space p) a×a−1≡1(mod p),且 1 < a < p 1<a<p 1<a<p
设 p = k a + r p=ka+r p=ka+r ,且 0 < r < a 0<r<a 0<r<a
可得 k a + r ≡ 0 ( m o d p ) ka+r \equiv 0(\bmod \space p) ka+r≡0(mod p)
左右两边同乘 a − 1 × r − 1 a^{-1} \times r^{-1} a−1×r−1 可得
( k a + r ) × a − 1 × r − 1 ≡ 0 ( m o d p ) (ka+r)\times a^{-1} \times r^{-1} \equiv 0(\bmod \space p) (ka+r)×a−1×r−1≡0(mod p)
k × r − 1 + a − 1 ≡ 0 ( m o d p ) k\times r^{-1}+a^{-1} \equiv 0(\bmod p) k×r−1+a−1≡0(modp)
a − 1 ≡ − k × r − 1 ( m o d p ) a^{-1} \equiv -k\times r^{-1}(\bmod p) a−1≡−k×r−1(modp)
a − 1 = − ⌊ p a ⌋ × ( p % a ) − 1 % p a^{-1} = -\lfloor \frac{p}{a} \rfloor\times (p \% a)^{-1} \% p a−1=−⌊ap⌋×(p%a)−1%p
a − 1 = ( p − ⌊ p a ⌋ ) × ( p % a ) − 1 % p a^{-1} = (p-\lfloor \frac{p}{a} \rfloor)\times (p \% a)^{-1} \% p a−1=(p−⌊ap⌋)×(p%a)−1%p
代码模板:
inv[0]=inv[1]=1;
for(int i=2;i<=n;i++){
inv[i]=(p-p/i)*inv[p%i]%p;
}
时间复杂度 O ( n ) O(n) O(n)
欧拉函数
定义: 对正整数 n n n,欧拉函数是少于或等于 n n n 的数中与 n n n 互质的数的数目,用 ϕ ( x ) \phi(x) ϕ(x)来表示 x x x 的欧拉函数值。
特别的, ϕ ( 1 ) \phi(1) ϕ(1) 被定义为1,但是没有实质意义。
欧拉函数通式1:
ϕ ( x ) = x × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) × ( 1 − 1 p 3 ) × … × ( 1 − 1 p n ) \phi(x)=x \times (1-\frac{1}{p1}) \times (1-\frac{1}{p2})\times (1-\frac{1}{p3}) \times … \times (1-\frac{1}{pn}) ϕ(x)=x×(1−p11)×(1−p21)×(1−p31)×…×(1−pn1)
p 1 , p 2 , p 3 … p n p_1,p_2,p_3…p_n p1,p2,p3…pn为 x x x 的所有质因数
欧拉函数通式2:
若 x x x是质数 p p p的 k k k次幂,即 x = p k x = p ^ k x=pk,有 ϕ ( x ) = p k − p k − 1 = ( p − 1 ) ∗ p k − 1 \phi (x) = p ^ k - p ^ {k - 1} = (p - 1) \ast p ^ {k - 1} ϕ(x)=pk−pk−1=(p−1)∗pk−1 因为除了 p p p的倍数外,其他数都跟 x x x互质。设 t ∗ p = p k t \ast p = p ^ k t∗p=pk,那么 t = p k − 1 t = p ^ {k - 1} t=pk−1
欧拉函数的性质:
- 欧拉函数是积性函数,若 x , y x,y x,y 互质,那么 ϕ ( x × y ) = ϕ ( x ) × ϕ ( y ) \phi(x\times y)=\phi(x)\times \phi(y) ϕ(x×y)=ϕ(x)×ϕ(y)
- 若 x x x 是质数 ϕ ( x ) = x − 1 \phi(x)=x-1 ϕ(x)=x−1
欧拉函数证明:
因为在
1
1
1 到
n
n
n 中
p
i
p_i
pi (也就是质因子) 的倍数是均匀分布的,那么去掉这些质因子的倍数(占
1
p
i
\frac{1}{p_i}
pi1)就是
x
×
(
1
−
1
p
i
)
x \times (1 - \frac{1}{p_i})
x×(1−pi1)
其他质因子同理,就得到了上述公式
代码模板:
- 一般模板
int euler(int n){
int ans=n,a=n;
for(int i=2;i*i<=a;i++){//i*i<=a ,因为在分解的时候a也变小,所以范围也跟着变小
while(a%i==0){//因为1-1/p=(p-1)/p .
ans=ans/i*(i-1);//先进行除法是为了防止中间数据的溢出
a/=i;
}
}
if(a>1){
ans=ans/a*(a-1);
}
return ans;
}
- 结合埃氏筛的模板
void euler(int n){
for(int i=2;i<=n;i++){
if (!phi[i]){
for(int j=i;j<=n;j+=i){
if (!phi[j]){
phi[j]=j;
}
phi[j]=phi[j]/i*(i-1);
}
}
}
}
}
- 欧拉筛做法
如果 p p p 为质数
如果 i m o d p = 0 i \bmod p =0 imodp=0,那么 ϕ ( i × p ) = ϕ ( i ) × p \phi(i\times p)=\phi(i)\times p ϕ(i×p)=ϕ(i)×p;
如果 i m o d p ≠ 0 i \bmod p \neq0 imodp=0,那么 ϕ ( i × p ) = ϕ ( i ) × ( p − 1 ) \phi(i\times p)=\phi(i)\times (p-1) ϕ(i×p)=ϕ(i)×(p−1)。
void phi(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]>n){
break;
vis[i*prime[j]]=true;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
费马小定理&欧拉定理
万众瞩目的费马小定理,它来了!!!
费马小定理
定义:如果 p p p 是质数,并且 a a a 和 p p p 互质,那么就有 a p − 1 = 1 ( m o d p ) a^{p-1} = 1(\bmod\space p) ap−1=1(mod p)
证明
考虑 1 a , 2 a , 3 a … , ( p − 1 ) a 1a,2a,3a \ldots,(p - 1)a 1a,2a,3a…,(p−1)a这些数
- 他们两两不同余 ( m o d p ) (\bmod \space p) (mod p)
- 他们均与 p p p互质
因此可以得到 ( 1 a ) × ( 2 a ) × ( 3 a ) × … × ( ( p − 1 ) a ) = 1 × 2 × 3 × … × ( p − 1 ) ( m o d p ) (1a) \times (2a) \times (3a) \times \ldots \times ((p - 1)a) = 1 \times 2 \times 3 \times \ldots \times (p - 1)(\bmod \space p) (1a)×(2a)×(3a)×…×((p−1)a)=1×2×3×…×(p−1)(mod p)
又因为 g c d ( 1 × 2 × 3 × … × ( p − 1 ) , p ) = 1 gcd (1 \times 2 \times 3 \times \ldots \times (p - 1),p) = 1 gcd(1×2×3×…×(p−1),p)=1,所以 a p − 1 ≡ 1 ( m o d p ) a ^ {p - 1} \equiv 1(\bmod \space p) ap−1≡1(mod p)
得证
欧拉定理
定义: 若 a , n a,n a,n为正整数,且 a , n a,n a,n互质(即 g c d ( a , n ) = 1 gcd (a,n) = 1 gcd(a,n)=1),则有 a ϕ ( n ) ≡ 1 ( m o d n ) a ^ {\phi (n)} \equiv 1 (\bmod \space n) aϕ(n)≡1(mod n)
用欧拉定理证明费马小定理
如果 n n n 是素数,且 a a a 与 n n n 互质,那么 ( a n − 1 ) ≡ 1 ( m o d n ) (a^{n-1} ) \equiv 1 (\bmod n) (an−1)≡1(modn)
证明:
因为n是质数,根据欧拉函数 ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ(n)=n−1, a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)}\equiv 1 (\bmod n) aϕ(n)≡1(modn)可转换为 a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1 (\bmod n) an−1≡1(modn)
得证
证明欧拉函数
设小于 n n n且与 n n n互质的数为: x 1 , x 2 , x 3 , ⋯ , x ϕ ( n ) x_1,x_2,x_3,\cdots,x_{\phi (n)} x1,x2,x3,⋯,xϕ(n)
考虑这些数 a × x 1 , a × x 2 , a × x 3 … a × x ϕ ( n ) a \times x _ 1,a \times x _ 2,a \times x _ 3 \ldots a \times x_{\phi (n)} a×x1,a×x2,a×x3…a×xϕ(n)
它们两两不同余 ( m o d n ) (\bmod \space n) (mod n)且他们均与 n n n互质
因此可以得到 ( a × x 1 ) × ( a × x 2 ) × ( a × x 3 ) × … × ( a × ϕ ( n ) ) = x 1 × x 2 × x 3 × … × x ϕ ( n ) ( m o d p ) (a \times x _ 1) \times (a \times x _ 2) \times (a \times x _ 3) \times \ldots \times (a \times {\phi (n)}) = x _ 1 \times x _ 2 \times x _ 3 \times \ldots \times x _ {\phi (n)} (\bmod \space p) (a×x1)×(a×x2)×(a×x3)×…×(a×ϕ(n))=x1×x2×x3×…×xϕ(n)(mod p)
又因为 g c d ( x 1 × x 2 × x 3 × x 4 × … × x ϕ ( n ) , n ) = 1 gcd (x _ 1 \times x _ 2 \times x _ 3 \times x _ 4 \times \ldots \times x_{\phi (n)},n) = 1 gcd(x1×x2×x3×x4×…×xϕ(n),n)=1,所以 a ϕ ( n ) ≡ 1 ( m o d n ) a ^ {\phi (n)} \equiv 1 (\bmod \space n) aϕ(n)≡1(mod n)
得证