<前言>
<更新提示>
<第一次更新>这次基本上是最后一次数论更新啦,三篇博客的内容已经基本涵盖了普及组可能考到的所有内容,只有少数较难的内容可能会再次分析重提,基本知识点已经全啦。
<正文>
一个整数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!n(n+1)(n+2)...(n+m−1)
即意为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
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
任何一个大于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} N=p1a1∗p2a2∗p3a3∗...∗pkak
其中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) (a1+1)(a2+1)...(ak+1)
即
∑ i = 1 n ( a i + 1 ) \sum_{i=1}^n{(a_i+1)} i=1∑n(ai+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}) (1+p11+p12+...+p1a1)(1+p21+p22+...+p2a2)...(1+pk1+pk2+...+pkak)
即
∏ i = 1 n ( ∑ j = 0 a i p i j ) \prod_{i=1}^n(\sum_{j=0}^{a_i}p_i^j) i=1∏n(j=0∑aipij)
1,2 由乘法原理推得。
1 求N的分解质因数式
#include
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<
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;
}
令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} a=p1a1p2a2...pkakb=p1b1p2b2...pkbk
则有
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)} gcd(a,b)=p1min(a1,b1)p2min(a2,b2)...pkmin(ak,bk)lcm(a,b)=p1max(a1,b1)p2max(a2,b2)...pkmax(ak,bk)
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的因子。
⑨同⑥可证。
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
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<
当且仅当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),…,则234…*(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=p1a1∗p2a2∗...∗pkak
则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) ϕ(n)=p1a1−1∗p2a2−1∗...∗pkak−1∗(p1−1)∗(p2−1)∗...∗(pk−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∗(1−p11)∗(1−p21)∗...∗(1−pk1)
根据算术基本定理分解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;
}
对于求解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) p∗i−p∗ϕ(i)=i∗p−ϕ(i∗p)ϕ(i∗p)=p∗ϕ(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定理的证明来自这里,博主写的很棒,自认为是全网唯一我看得懂的证明,只是好像有一些笔误之处,我做了修改,解释和编辑的工作。
<废话>