数论——约数

对于一个整数(a),若(b|a)则称(b)(a)的因数。

正因数求法

1、试除法

对于一个数(n),其正因数必定不会超过(n),所以只用枚举一下(1-n)的所有数看看它是不是(n)的因数即可。复杂度(O(n))

因为因数必定成对出现,所以只用枚举到(sqrt{n})即可。复杂度(O(sqrt{n}))

这样求([1,n])中所有数的约数集合的时间复杂度为(O(nsqrt{n}))

for (int i = 1; i <= n; i++) {
	for (int j = 1; j * j <= i; j++) {
		if (i % j)  continue;
		fac[i].push_back(j);
		if (j * j != i) fac[i].push_back(i / j);
	}
}

2、倍数法

用来快速求([1,n])中所有数的约数集合。

思想类似埃式筛法,用(i)去更新(i)的倍数。

for (int i = 1; i <= n; i++) {
	for (int j = i; j <= n; j += i) {
		fac[j].push_back(i);
	}
}

时间复杂度为调和级数:(O(nln{n})),同时说明([1,n])的约数个数大约为(nln{n})

约数个数与约数和

(n)质因数分解(n=Pi_{i=1}^{m} p_i^{c_i})可以得到(n)的约数集合(Pi_{i=1}^{m} p_i^{a_i}, a_i in [0,c_i])

即可得到约数和为(sigma(n)=Pi_{i=1}^{m}sum_{j=0}^{c_i}p_i^{j})

约数个数为(d(n)=Pi_{i=1}^{m} (c_i+1))

最大公约数

对于两个数(a,b),如果(d|a 且 d|b)则称其为公约数,其中最大的称为最大公约数记作(gcd(a,b))((a,b))

最大公约数的性质:

1、(gcd(a,b)=gcd(b,a))

2、(a|b)等价于(gcd(a,b)=a)

3、(gcd(a,1)=1, gcd(a,0)=a)

4、辗转相减法:(gcd(a,b)=gcd(a,b-a)=gcd(a,a-b))

5、(gcd(ca, cb)=c imes gcd(a,b))

6、(gcd(a+cb, b)=gcd(a,b))

7、若(gcd(a,c)=1)(gcd(a,bc)=gcd(a,b))

8、(gcd(a,b,c)=gcd(gcd(a,b),c))

9、若(gcd(a,b)=1)(gcd(ab,c)=gcd(a,c) imes gcd(b,c))

10、若(d)(a,b)的公约数,则(gcd(a/d,b/d)=gcd(a,b)/d)

证明:

1、显然。

2、最大公约数不会超过两者中较小的一个(0是特例),得证。

3、一式由2即得证,二试所有数都是0的"约数"即得证。

4、设(d=gcd(a,b),a=dm,b=dn),有(gcd(m,n)=1),又有(gcd(m,m-n)=1)即得证。(gcd(m,m-n)=1)可由反证法得出。

5、显然。

6、由辗转相减法得证。

7、将a,b,c质因数分解即可得证。

8、设(d=gcd(a,b,c),a=dr,b=ds,c=dt,gcd(r,s,t)=1)(d|gcd(a,b)),可得(gcd(a,b))(c)的最大公约数即为(d)

9、同7的方法。

10、类似5

欧几里得算法:(gcd(a,b)=gcd(b,a\%b))

证明:由辗转相减法得证。

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

最小公倍数

如果一个数(c)满足(a|c且b|c),则称(c)(a,b)的公倍数,最小的(c)称为最小公倍数。

性质:

1、(lcm(a,b)=lcm(b,a))

2、(lcm(a,1)=a, lcm(a,0)=0)

3、(a|b)->(lcm(a,b)=b)

4、(lcm(a,b,c)=lcm(lcm(a,b),c))

5、(lcm(ac,bc)=c imes lcm(a,b))

6、(d|a且d|b)(lcm(d/a,d/b)=lcm(a,b)/d)

7、(gcd(a,b) imes lcm(a,b)=a imes b)

主要证明性质7(也是主要用来求lcm的方法)。

(d=gcd(a,b)),则(a=dm,b=dn),则(lcm)得是(m,n,d)的倍数又((m,n)=1)所以(lcm(a,b)=dmn)

最大公因数与最小公倍数的唯一分解:

(a=Pi_{i=1}^{m} p_i^{a_i},b=Pi_{i=1}^{m} p_i^{b_i})(没有的话指数就是0)。

(gcd(a,b)=Pi_{i=1}^{m} p_i^{min(a_i,b_i)},lcm(a,b)=Pi_{i=1}^{m} p_i^{max(a_i,b_i)})

习题:hankson的趣味题

欧拉函数

([1,n])中与(n)互质的数的个数为(phi(n)),即为欧拉函数。

求欧拉函数的公式:(n imes Pi_{i=1}^{m} frac{p_i-1}{p_i})

用简单的容斥即可得证。

欧拉函数的性质:

(gcd(a,b)=1 -> phi(ab)=phi(a) imes phi(b))(积性函数的性质)

1~n中与(n)互质的数的和为(phi(n) imes frac{n}{2})

对于质数(p)如果(n\%p==0且n\%p^2!=0)(phi(n)=phi(frac{n}{p}) imes (p-1))(由积性函数的性质得证)

对于质数(p)如果(n\%p==0且n\%p^2==0)(phi(n)=phi(frac{n}{p}) imes p)(展开即可得证)

对于质数(p)(sum_{i=0}^n phi(p^i)=p^n)

证明:

(sum_{d|n} phi(d) = n)

有关欧拉函数的应用:这篇博客写得不错

原文地址:https://www.cnblogs.com/zcr-blog/p/13198253.html