数论基础总结

文章介绍了数论的基础概念,包括整除的定义、同余的概念及其性质,详细讲解了素数的判断方法,如暴力法、Miller-Rabin素性测试,以及素数筛法如埃氏筛和欧拉筛。此外,还涵盖了最大公约数(GCD)的计算和扩展欧几里得算法,以及乘法逆元和欧拉函数的相关知识。
摘要由CSDN通过智能技术生成

数论基础总结

数论基础

整除

定义: 两个数 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 ab 。并且, 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(ab) ,那么 m m m 为模数, a a a 同余于 b b b m m m 。记作 a ≡ b (   m o d   a\equiv b (\bmod ab(mod m ) m) m)

同余的性质:

  • 自反性: a ≡ a (   m o d   a\equiv a(\bmod aa(mod m ) m) m)
  • 对称性:如果 a ≡ b (   m o d   a\equiv b(\bmod ab(mod m ) m) m) ,则 b ≡ a (   m o d   b\equiv a(\bmod ba(mod m ) m) m)
  • 传递性:如果 a ≡ b (   m o d   a\equiv b(\bmod ab(mod m ) m) m) b ≡ c (   m o d   b\equiv c(\bmod bc(mod m ) m) m),则 a ≡ c (   m o d   a\equiv c(\bmod ac(mod m ) m) m)
  • 如果 k k k m m m 互质,且 a k ≡ b k (   m o d   ak\equiv bk(\bmod akbk(mod m ) m) m) ,则 a ≡ b (   m o d   a\equiv b(\bmod ab(mod m ) m) m)
  • 如果 a ≡ b (   m o d   a\equiv b(\bmod ab(mod m ) m) m) c ≡ d (   m o d   c\equiv d(\bmod cd(mod m ) m) m) ,则 a ± c ≡ b ± d (   m o d   a\pm c\equiv b\pm d(\bmod a±cb±d(mod m ) m) m) , a c ≡ b d (   m o d   ac\equiv bd(\bmod acbd(mod m ) m) m)
  • 如果 a ≡ b (   m o d   a\equiv b(\bmod ab(mod m ) m) m) ,则 a c ≡ b c (   m o d   ac\equiv bc(\bmod acbc(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(2p1<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 x21(mod p ) p) p) x x x 的取值有两种情况, x = 1 x=1 x=1 x = p − 1 x=p-1 x=p1

因为 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 x21 p p p ∣ \mid ( x + 1 ) ( x − 1 ) (x+1)(x-1) (x+1)(x1)

又因为 p p p 是素数且 x < p x<p x<p ,所以只可能是 p ∣ x − 1 p\mid x-1 px1 ( x = 1 ) (x=1) (x=1) p ∣ x − 1 p\mid x-1 px1 ( x = p − 1 ) (x=p-1) (x=p1)


接下来将费马小定理和二次探测定理结合,得到Miller-Rabin 素性测试的做法:

测试整数 n n n 是否为素数。

如果 n n n 是素数,根据费马定理, a n − 1 ≡ 1 (   m o d   a^{n-1} \equiv 1 (\bmod an11(mod n ) n) n)

d d d r r r ,满足 n − 1 = d × 2 r n-1=d\times2^r n1=d×2r d d d 为奇数,则 r r r n − 1 n-1 n1 2 2 2 的个数,式子变形为:

a n − 1 % n a^{n-1}\%n an1%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)2r1×(ad)2r1%n

根据上文所说的二次探测定理,则 ( a d ) 2 r − 1 (a^d)^{2^{r-1}} (ad)2r1% n = 1 n=1 n=1 ( a d ) 2 r − 1 (a^d)^{2^{r-1}} (ad)2r1% n = n − 1 n=n-1 n=n1

接下来分三种情况:

  • 如果 ( a d ) 2 r − 1 % n ≠ 1 (a^d)^{2^{r-1}}\%n\neq 1 (ad)2r1%n=1 ( a d ) 2 r − 1 % n ≠ n − 1 (a^d)^{2^{r-1}}\%n\neq n-1 (ad)2r1%n=n1 ,则 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)2r1%n=n1 ,则认为 n n n 是素数,返回 t r u e true true
  • 如果 ( a d ) 2 r − 1 % n = 1 (a^d)^{2^{r-1}}\%n=1 (ad)2r1%n=1 ,继续:根据二次探测定理, ( a d ) 2 r − 2 (a^d)^{2^{r-2}} (ad)2r2 的值可能为 1 1 1 n − 1 n-1 n1,以此类推。

代码模板:

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 da d ∣ b d\mid b db,则 r = a − b k r=a-bk r=abk 可转换为 r d = a d − b k d \frac{r}{d}=\frac{a}{d}-\frac{bk}{d} dr=dadbk,由此可知 r d \frac{r}{d} dr 为整数, d ∣ r d\mid r dr ,所以 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+bx2ba×by2=ay2+b(x2bay2)

因为 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=x2bay2
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×(yk×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/dk×a/d

乘法逆元

定义:对于一个数 a a a a − 1 a^{-1} a1 为它模 p p p 意义下的乘法逆元。满足 a × a − 1 ≡ 1 (   m o d     p ) a \times a ^ {-1} \equiv 1(\bmod \space p) a×a11(mod p)


求解乘法逆元

扩展欧几里得求解

用扩展欧几里得算法解线性同余方程: a x ≡ 1 (   m o d     p ) ax \equiv 1 (\bmod \space p) ax1(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) ap11(mod p),所以 a − 1 = a p − 2 a ^ {-1} = a ^ {p - 2} a1=ap2,前提是 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×11(mod p)

我们要求解 a a a 的逆元,即 a × a − 1 ≡ 1 (   m o d     p ) a \times a^{-1} \equiv 1(\bmod \space p) a×a11(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+r0(mod p)

左右两边同乘 a − 1 × r − 1 a^{-1} \times r^{-1} a1×r1 可得

( 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)×a1×r10(mod p)

k × r − 1 + a − 1 ≡ 0 (   m o d   p ) k\times r^{-1}+a^{-1} \equiv 0(\bmod p) k×r1+a10(modp)

a − 1 ≡ − k × r − 1 (   m o d   p ) a^{-1} \equiv -k\times r^{-1}(\bmod p) a1k×r1(modp)

a − 1 = − ⌊ p a ⌋ × ( p % a ) − 1 % p a^{-1} = -\lfloor \frac{p}{a} \rfloor\times (p \% a)^{-1} \% p a1=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 a1=(pap⌋)×(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×(1p11)×(1p21)×(1p31)××(1pn1)

p 1 , p 2 , p 3 … p n p_1,p_2,p_3…p_n p1,p2,p3pn 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)=pkpk1=(p1)pk1 因为除了 p p p的倍数外,其他数都跟 x x x互质。设 t ∗ p = p k t \ast p = p ^ k tp=pk,那么 t = p k − 1 t = p ^ {k - 1} t=pk1

欧拉函数的性质:

  • 欧拉函数是积性函数,若 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)=x1

欧拉函数证明:

因为在 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×(1pi1)
其他质因子同理,就得到了上述公式

代码模板:

  • 一般模板
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)×(p1)

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) ap1=1(mod p)

证明

考虑 1 a , 2 a , 3 a … , ( p − 1 ) a 1a,2a,3a \ldots,(p - 1)a 1a,2a,3a,(p1)a这些数

  1. 他们两两不同余 (   m o d     p ) (\bmod \space p) (mod p)
  2. 他们均与 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)××((p1)a)=1×2×3××(p1)(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××(p1),p)=1,所以 a p − 1 ≡ 1 (   m o d     p ) a ^ {p - 1} \equiv 1(\bmod \space p) ap11(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) (an1)1(modn)

证明:

因为n是质数,根据欧拉函数 ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ(n)=n1 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) an11(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×x3a×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)

得证

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值