『基础数论第三篇』

版权声明:随你转载,你开心就好(记得评论和注明出处哦) https://blog.csdn.net/Prasnip_/article/details/80954458

<前言>

整除
算术基本定理(唯一分解定理)
最大公约数和最小公倍数(gcd和lcm)
同余
威尔逊定理和费马小定理
欧拉函数以及求解
欧拉定理

<更新提示>

<第一次更新>这次基本上是最后一次数论更新啦,三篇博客的内容已经基本涵盖了普及组可能考到的所有内容,只有少数较难的内容可能会再次分析重提,基本知识点已经全啦。


<正文>

整除

定义

一个整数a能被另一个整数d整除,记作:d|a,意味着存在某个整数k,有a=kd。 0可被每个整数整除。若a>0且d|a,则|d|≤|a|。如果a|d,则我们称d是a的倍数,a是d的约数。

性质

对于整除,有如下几条重要的性质:
1 若d|a,则对于任意整数k有d|ka
2 若a|b且b|a,则有a=b ……对称性
3 若c|b,b|a,则c|a ……传递性
4 若c|a,d|b,则cd|ab
5 若c|a,c|b,则c|(ma+nb)
6 若n∈N*,则(a-b)|(an-bn)。
7 若n为奇数,则(a+b)|(an+bn);
8 若n为偶数,则(a+b)|(an-bn)
9 任意n个连续正整数的乘积必能被n!整除

关于性质,我尽量给出说明或证明。

说明(证明)

1 显然。
2 两数互为倍数,显然两数相等。
3 设a=kb,因为c|b,由1得c|kb成立,即c|a。
4 a有因子c,b有因子d,所以ab有因子cd,即cd|ab。
5 由1推得
6,7,8 因式分解的基本公式,此处不再赘述
9 由组合数公式可得,
n ( n + 1 ) ( n + 2 ) . . . ( n + m 1 ) n ! \frac{n(n+1)(n+2)...(n+m-1)}{n!}
即意为n选m的方案数,显然是个整数。如果需要严谨的证明,可以使用数学归纳法,尝试用分数拆分的方法证明n=k成立时,n=k+1仍然成立。

例题:分解整数

一个正整数有时可以分解成若干连续正整数之和,如15=1+2+3+4+5,有时这种分解方法不止一种,如15还可以分解成4+5+6和7+8两种,但有些正整数就不能分解,如16就不能分解。输入正整数N,求出一个它的所有分解。
数据规模:N≤109

分析:
设可以分解的是a,a+1,…,b,即n=a+(a+1)+…+b,则n=(a+b)(b-a+1)/2,即(a+b)和(b-a+1)是2×n的一对因子。我们枚举2×n的所有因子,再解得a,b,检查其是否合法即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,t,flag=0;
int main()
{
	cin>>n;
	t=n*2;
	for(int i=sqrt(t*1.0);i>=2;i--)
	{
		int x,y;
		if(t%i==0)
		{
			x=i,y=t/i;

			if((x+y-1)%2==0)
			{
				int b=(x+y-1)/2;
				int a=x-b;
				if(a<=0||b<=0)continue;
				flag=1;
				for(int j=a;j<b;j++)
				{
					cout<<j<<" "; 
				}
				cout<<b<<endl;
			}
		}
	}
	if(!flag)cout<<"NONE"<<endl;
	return 0;
}

算术基本定理(唯一分解定理)

定义

任何一个大于1的自然数N,N都可以唯一分解成有限个质数的乘积,我们将其表示为如下的形式:
N = p 1 a 1 p 2 a 2 p 3 a 3 . . . p k a k N=p_1^{a_1}*p_2^{a_2}*p_3^{a_3}*...*p_k^{a_k}
其中p1 < p2 < p3 < … < pk ,其诸指数ai 为正整数。我们称其为N的标准分解式。

证明

请原谅我证不来…
其存在性与唯一性的证明见此

公式

由算术基本定理引导出的有两个重要的公式如下:
1 N的正约数个数为:
( a 1 + 1 ) ( a 2 + 1 ) . . . ( a k + 1 ) (a_1+1)(a_2+1)...(a_k+1)

i = 1 n ( a i + 1 ) \sum_{i=1}^n{(a_i+1)}
2 N的正约数和为:
( 1 + p 1 1 + p 1 2 + . . . + p 1 a 1 ) ( 1 + p 2 1 + p 2 2 + . . . + p 2 a 2 ) . . . ( 1 + p k 1 + p k 2 + . . . + p k a k ) (1+p_1^1+p_1^2+...+p_1^{a_1})(1+p_2^1+p_2^2+...+p_2^{a_2})...(1+p_k^1+p_k^2+...+p_k^{a_k})

i = 1 n ( j = 0 a i p i j ) \prod_{i=1}^n(\sum_{j=0}^{a_i}p_i^j)

说明(证明)

1,2 由乘法原理推得。

代码实现

1 求N的分解质因数式

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int s=0,n,t;
    int ans[10000]={};
    cin>>n;t=n;
    for (int i=2;i*i<=n;i++)//相当与1-sqrt(n)枚举,这么做可以处理复杂的精度误差
        if (n%i==0)
        {
            while (n%i==0)
            {
                ans[++s]=i;//储存分解质因子的答案
                n=n/i;//对n除以i,知道不能除为止 
            }   
        }   
    if (n>2)  ans[++s]=n;//若最后没有分解完
    if(s==1)cout<<t<<'='<<ans[1];
    else if(s==2)cout<<t<<'='<<ans[1]<<'*'<<ans[2];
    else for(int i=1;i<=s;i++)
            {
                if(i==1)cout<<t<<'='<<ans[1]<<'*';
                else if(i==s)cout<<ans[s];
                else cout<<ans[i]<<'*';
            } 
    //输出分解质因数的结果
    return 0; 
} 

2 求N的约数个数

int nums(int n)
{
int k, res, p;
 k=2; res=1;
 while (k*k<=a)
     {p=1; 
      while (n%k==0) {a/=k; p++; } 
      res*=p;
      k++;
     }
 if (a>1) res*=2; 
 return res;
} 

3 求N的约数和

int sum ( int n )
{
int k, res, tmp;
 k=2; res=1;
 while (k*k<=a)
    {tmp=1;
      while (n%k==0) {a/=k;tmp=tmp*k+1;}
      res*=tmp;
      k++;
    }
 if (a>1)  res*=(1+a);
 return res;
} 

最大公约数和最小公倍数(gcd和lcm)

定义

令a和b是不全为0的两个整数,能使d|a和d|b的最大整数称为a和b的最大公约数,用gcd(a,b)表示,或者记为(a,b)。
令a和b是不全为0的两个整数,能使a|d和b|d的最小整数称为a和b的最小公倍数,用lcm(a,b)表示,或者记为[a,b]

定理

1 ab = gcd(a,b) * lcm(a,b)
2,3
利用算术基本定理,设
a = p 1 a 1 p 2 a 2 . . . p k a k b = p 1 b 1 p 2 b 2 . . . p k b k a=p_1^{a_1}p_2^{a_2}...p_k^{a_k}\\b=p_1^{b_1}p_2^{b_2}...p_k^{b_k}
则有
g c d ( a , b ) = p 1 m i n ( a 1 , b 1 ) p 2 m i n ( a 2 , b 2 ) . . . p k m i n ( a k , b k ) l c m ( a , b ) = p 1 m a x ( a 1 , b 1 ) p 2 m a x ( a 2 , b 2 ) . . . p k m a x ( a k , b k ) gcd(a,b)=p_1^{min(a_1,b_1)}p_2^{min(a_2,b_2)}...p_k^{min(a_k,b_k)} \\ lcm(a,b)=p_1^{max(a_1,b_1)}p_2^{max(a_2,b_2)}...p_k^{max(a_k,b_k)}

证明(说明)

1 设两数的最大公因数=X
则:两数可以表示为:aX,bX,其中a,b互质
所以:aX,bX的最小公倍数=abX
而:X*(abX)=(aX)*(bX)
即:两个数的乘积等于最大公因数与最小公倍数的乘积

2,3 由定义得。

性质

①已知(a,c)=1,若a | bc,则a | b;若a | b,c | b,则ac | b
②p为素数,若p | ab,则p | a或p | b
③[a,b]·(a,b)=ab
④(a,b)=(a,b-ac)=(a-bc,b)
⑤(n,n-1)=1 或 (n,n-p)≤p
⑥m(a,b)=(ma,mb)
⑦若(a,b)=d,则(a/d,b/d)=1
⑧若a | m,b | m,则[a,b] | m
⑨m[a,b]=[ma,mb]

证明(说明)

①由于a,c互质,所有它们间不含公共因子,那么a | bc时,a | b成立。第二条根据算术基本定理的标准分解式则显然成立。
②和①同理。
③上文已证。
④设(a,b)=d,a=kd,则b-ac=b-kdc,由于减去的仍为d的倍数,所以最大公因数不变。第二个括号同理。
⑤相邻两数互素。设(n,n-p)=d,则一定有d|(n-(n-p)),即一定有d|p,所有d < p。
⑥设m(a,b)=k,令a=ik,b=jk,则ma=mik,mb=mjk,mk=m(a,b)是ma,mb的一个公因数.
假设ma,mb的最大公因数为c,且c>mk,ma=cd,mb=ce
若c能被m整除,设c=lm,则有ma=lmd,mb=lme,a=ld,b=le,l是a,b的公约数,由假设c>mk,故lm>mk,l>k,与m(a,b)=k矛盾.
若c不能被m整除,则存在一个整数f,使得ma=cd=cmfg,mb=ce=cmfh,cmf是ma,mb的公因数,由题意cmf>c,c不是ma,mb的最大公约数,与假设矛盾.
故不存在假设的c,最大公因数(ma,mb)=最大公因数m(a,b)。
⑦由⑥,等式同乘1/d,再进括号即可。
⑧a,b为m因子,其最小公倍数显然也是m的因子。
⑨同⑥可证。

gcd的求解

1使用算术基本定理, 先分解素因数, 然后求最大公约数。由于这种方法不是很常用,时间复杂度又比较大,这里不再给出代码。
2利用公式gcd(a, b)=gcd(b, a mod b), 时间复杂度为O(logb)。
辗转相除法的证明见数论博客第一篇
代码实现如下:

inline int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
} 

3(二进制算法)
若a=b, gcd(a,b)=a, 否则
1)a和b均为偶数, gcd(a,b)=2*gcd(a/2,b/2)
2)a为偶数, b为奇数, gcd(a,b)=gcd(a/2,b)
3)如果a和b均为奇数, gcd(a,b)=gcd(a-b,b)
不需要除法, 适合大整数。
证明(说明):
1)a,b均有因子2,可以利用性质⑥缩小规模。
2)a,b没有因子2,可以直接缩小规模。
3)类似于辗转相除法。

代码实现如下:

#include<bits/stdc++.h>
using namespace std;
inline int gcd(int a,int b)
{
	if(a==0)return b;
	if(b==0)return a;
	if(!(a&1)&&!(b&1))return 2*gcd(a/2,b/2);
	else if(!(a&1))return gcd(a/2,b);
	else if(!(b&1))return gcd(b,a/2);
	else return gcd(abs(a-b),min(a,b));//避免负数 
} 
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<gcd(a,b)<<endl;
}

同余

定义

当且仅当m|(a-b)时,我们称a和b对模m同余,记作a≡b(mod m)(这里总设m>0)
本质上,m|(a-b)和a≡b(mod m)只不过是同一性质的不同表示法而已。
同余式的记号是高斯(Gauss)在1800年左右首创的,它看起来有点象等式的记号。事实上,我们以后会看到,同余式和等式有着许多共同的性质。

性质

①a≡a (mod m) ……自反性
②若a≡b (mod m),则b≡a (mod m)……对称性
③若a≡b (mod m),b≡c (mod m),则a≡c (mod m)……传递性
④若a≡b (mod m),c≡d (mod m),则a±c≡b±d (mod m),ac≡bd (mod m) ……同加、乘性
⑤若n|m,a≡b (mod m),则a≡b (mod n)
⑥若(m,n)=1,a≡b (mod m),a≡b (mod n),则a≡b (mod mn)
⑦若a≡b (mod m),n∈N*,则an≡bn (mod m) ……同幂性
⑧若ac≡bc (mod m),(c,m)=d,则a≡b (mod m/d )

威尔逊定理和费马小定理定理

威尔逊定理

若p为素数,则(p-1)!≡-1 (mod p)。

威尔逊定理的逆定理也成立,即:若对某一正整数p,有(p-1)!≡-1 (mod p),则p一定为素数。

证明
充分性证明

证明其逆反命题:如果p是合数,则p不符合(p - 1)! ≡ -1 (mod p)。
当p小于等于4的时候,明显成立。
当p大于4时,如果p不是完全平方数,则p可以分解为ab,a, b ∈ {2, 3, …, p - 1},且a !=
则(p - 1)!必包含a, b,则(p - 1)! ≡ 0 (mod p)
如果p是完全平方数,则有p = k^2, 已知当k > 2时,有k, 2k ∈ {2, 3, …, p - 1},同上可得(p - 1)! ≡ 0 (mod p)

必要性证明

对于偶质数2显然成立,下面讨论奇质数:
对于质数p,我们建立其缩系B = {1, 2, 3, …, p - 1}中的每个元素都与p互质。
对于B的一个子集A = {2, 3, 4, …, p - 2},对每个a ∈ A,使C = {a, 2a, …, (p - 1)a},则对于任一个a,C也是p的一个缩系(即每个数对p不同余且不能整除)。
利用同余的性质证明C是缩系:
如果存在an, am同余,设n > m,则(an - am) ≡ 0 (mod p),则a(n - m) ≡ 0 (mod p),由于a(n - m)也属于C,不存在能整除的。
则对于任意a,在C中,必存在一个对应的ab,使得ab ≡ 1 (mod p):
证明b不属于{1, p - 1, a}:
如果b = 1,则a ≡ 1(mod p),由于a 属于A,不成立。
如果b = p - 1,则(p - 1)a ≡1(mod p),当且仅当a = p - 1时成立,但a属于A,不成立。
(解释:当a=p-1时,原方程为:(p - 1)2≡1(mod p),p2-2p+1≡1(mod p),p(p-1)≡0(mod p),方程显然成立)
如果b = a,若aa ≡ 1 (mod p),则aa - 1 ≡ 0 (mod p),即(a + 1)(a - 1) ≡ 0 (mod p),当且仅当a = 1或p - 1时成立,不成立。
证明如果a不相同,则b也不相同:
如果对于a,存在b1, b2,使得ab1 ≡ ab2 (mod p),则a(b1 - b2) ≡ 0 (mod p),a(b1 - b2)属于C中某项,不存在能整除的。

由上可知,则对于a,存在b ∈ A,a != b,使得ab ≡ 1 (mod p),则对于234*…(p - 2),由于:
2b ≡ 1 (mod p),3b’ ≡ 1(mod p),…,则2
34…*(p - 2) ≡ 1 (mod p),
且1 ≡ 1 (mod p),(p - 1) ≡ -1 (mod p),则(p - 1)! ≡ -1 (mod p)。

费马小定理

p是素数且(a,p)=1,则ap-1≡1 (mod p)

证明

数论博客第一篇

欧拉函数以及求解

定义

欧拉函数: 1~n中和n互素的元素个φ(n)

性质

如果n为某一素数p,则φ§=p-1
如果n为某一素数p的幂次pa,φ(pa)=(p-1)×pa-1
欧拉函数是积性函数,即当(m,n)=1时f(mn)=f(m)*f(n)
利用算术基本定理,分解
n = p 1 a 1 p 2 a 2 . . . p k a k n=p_1^{a_1}*p_2^{a_2}*...*p_k^{a_k}
则n的欧拉函数为:
ϕ ( n ) = p 1 a 1 1 p 2 a 2 1 . . . p k a k 1 ( p 1 1 ) ( p 2 1 ) . . . ( p k 1 ) \phi(n)=p_1^{a_1-1}*p_2^{a_2-1}*...*p_k^{a_k-1}*(p_1-1)*(p_2-1)*...*(p_k-1)
将乘式后半段每个括号提取pi,得:
ϕ ( n ) = n ( 1 1 p 1 ) ( 1 1 p 2 ) . . . ( 1 1 p k ) \phi(n)=n*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{p_k})

欧拉函数的求解
求解φ(n)

根据算术基本定理分解n,并利用第二个公式求解即可。
代码如下:

int eular(int n)
{
	int k,res;
	k=2; res=n;
	while (k*k<=n)
	{
		 if (n%k==0)
         {
		      res=res*(k-1)/k;
	          while (n%k==0) n/=k;
         } 
      k++;
    }
 if (n>1) res=res*(n-1)/n;
 return res;
} 

求解φ(i),i=1~n

对于求解1~n间所有的欧拉函数,我们需要用到欧拉函数的三条性质,并在欧拉筛法的过程中对其进行求解。
1)如果n为某一素数p,则φ§=p-1
2)对于某一素数p,有i%p=0时,φ(i*p)=φ(i)*p。
3)欧拉函数是积性函数,即当(m,n)=1时f(mn)=f(m)*f(n)
好吧,既然写出来了,本蒟蒻就来证一下(辣鸡数学一本通,上面的证明漏洞百出)

证明

1)显然。
2)先证明一个引理:对于n,i不互质,i,n+i仍不互质。
设b=gcd(n,i),n=pb,i=qb.
n+i=(p+q)b,所以n+i与i不互质。
[1,i]中与i不互质的整数共i-φ(i)个,这里,我们引入和引理中意义相同的n,分别使n=[1,i]中与n不互质的数,由于引理,n+i与i不互质,所以可以得出:[i+1,i+i]中与i不互质的整数至少有i-φ(i)个,只需证明若整数n与i互质,n+i与i仍互质,就能说明[i+1,i+i]中与i不互质的整数一定只有i-φ(i)个。
下面给出证明:
假设n+i与i不互质。
设b=gcd(n+i,i),则设n+i=qb,i=pb,且q,p属于Z,有pb+n=qb,所以n=b(q-p),而i=pb,它们就有了公约数b,与n,i互质矛盾,假设不成立。
好了,现在已经说明(i,i+i]中与i不互质的整数一定只有i-φ(i)个。那么以此类推,( ki , (k+1)i ]中与i不互质的整数也一定只有i-φ(i)个,即i mod p=0时,它们没有不同的因数,[i,pi]中与i不互质的整数一个有pi-pφ(i)个。而这个数字又恰好可以表示为ip-φ(i*p),即:
p i p ϕ ( i ) = i p ϕ ( i p ) ϕ ( i p ) = p ϕ ( i ) p*i-p*\phi(i)=i*p-\phi(i*p)\\ \phi(i*p)=p*\phi(i)
证毕。
3)不会(原谅蒟蒻智商低)。

呕心沥血证完了这条伟大的公式,代码在欧拉线性筛的基础上,就简单极了。

void eular(int n)
{
	for(int i=2;i<=n;i++)
    {
		if (!IsPrime[i])
        {prime[++cnt]=i;phi[i]=i-1;}//1
	    for(int j=1;j<=cnt;j++)
        { 
			if(prime[j]*i>n) break;
       		isprime[prime[j]*i]=1;
      	    if(i%prime[j]==0)
            {phi[i*prime[j]]=phi[i]*prime[j];break;}//2
      	    else phi[i*prime[j]]=phi[i]*(prime[j]-1); //3
        }
	 }
} 

欧拉定理

gcd(a,n)=1时,aφ(n)≡1(mod n)

意义:

当b很大时,ab≡ab mod φ(n),让质数一直比较小。
可见费马小定理是欧拉定理的特例。

结论

对于任意的a,b,n,当b>φ(n)时,有ab≡aφ(n)+b mod φ(n)(mod n)


<后记>
welson定理的证明来自这里,博主写的很棒,自认为是全网唯一我看得懂的证明,只是好像有一些笔误之处,我做了修改,解释和编辑的工作。


<废话>

猜你喜欢

转载自blog.csdn.net/Prasnip_/article/details/80954458
今日推荐