数论,顾名思义,是对整数进行研究的理论。是数学学科的一个重要分支,也是ACM竞赛题型中饶有趣味的一个部分。
数论,有人戏称为“素论”。可见对于素数的研究在数论中比重之大。当然,也有不是对素数操作的算法,在这里我们也将其划归为数论。
1、整除:
1.1. 定义:
若a%b==0,则称a能被b整除或b能整除a,记作b | a.
1.2. 整除的性质:
(1)0可以被任何非0数整除
(2)若b | a,则b | a
(3)传递性:a | b && b | c <=> a | c.
(4)如果a、b都能被c整除,那么(a+b)或(a-b)也可以被c整除
(5)几个数相乘,如果其中有一个因数能被某一个整除相除,那么它们的积也能被这 个数整除。
还有几个略实用的性质:
(1)能被2整除的数,个位上的数都能被2整除
(2)能被4整除的数,个位和十位所组成的两位数能被4整除
(3)能被8整除的数,百位、十位和个位所组成的三位数能被8整除
(4)能被5整除的数,末尾是0或5
(5)能被25整除的数,十位和个位所组成的两位数能被25整除
(6)能被125整除的数,百位、十位和个位所组成的三位数能被125整除
(7)能被3整除的数,各个数位上的数字之和能被3整除
(8)能被9整除的数,各个数位上的数字和能被 9 整除
(9)如果一个数既能被 2 整除又能被 3 整除,那么这个数能被 6 整除
(10)如果一个数既能被 2 整除又能被 5 整除,那么这个数能被 10 整除(即个位为
0)
(11)能被 11 整除的数,奇数位(从左往右数)上的数字和与偶数位上的数字和的差
(大数减小数)能被 11 整除
2、最大公约数&&最小公倍数
2.1.GCD
2.1.1.方法:
两数各自分解质因数,然后取出相同项相乘。
欧几里得算法(辗转相除法)
设a = qb + r,其中a,b,q,r都是整数,则:
gcd( a , b ) = gcd( b , r )
即
gcd( a , b ) = gcd( b , a%b)
2.2.LCM
2.3.小数的GCD
eps控制精度,fmod是C++的库函数,运算浮点数的mod运算。
2.4.扩展欧几里得
2.4.1.描述
设a和b不全为0,整数x、y,使得:
d = ————————–> 贝祖等式
扩展欧几里得算法根据已知的a和b,求解出一组x和y(解一定存在),并且求出d 值。
2.4.2.算法
理解了求解gcd的欧几里得算法,扩展欧几里得算法就好理解了,相比于欧几里 得算法,扩展gcd只是在欧几里得算法中多了一个求解x和y的步骤。
2.4.3.作用 (此部分在后续会详细讲解)
(1)求解不定方程:
所谓不定方程,即未知数的个数多于方程个数,且未知数受到某些限制(如
要求是有理数、整数或正整数等等)的方程或方程组。
如,方程只有一个,但是解却可以有多个。
求解不定方程的一组解,或者判断不定方程是否有解,扩展欧几里得就可以
派上用场了。
(2)求解模线性方程(线性同余方程):
求解,未知数x的最小解。
(3)求解模的逆元:
同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
PS:关于逆元,有一个蛮有用的性质。
设p为素数,,这样就可以将除法处理为乘法
3、素数
3.1.定义
素数是大于1的正整数,并且除了1和其本身不能被其他的正整数整除。
非素数称为合数。
3.2.素数的 eratosthenes 筛法
筛法是数论中一个比较重要的算法,在O(sqrt(N))的时间内获得N以内所有的素 数。
所谓筛法,就是每次筛去一部分数。如图,起始所有的数都标记为素数,遇到2 时,将所有2的倍数标记为合数,以此类推下去,剩下的都是素数了。
该算法适用于较小的MAXN,对于较大的MAXN,内存无法开如此大的空间。
3.3.区间素数
获得[L , U]区间的素数,L和U很大,但是U-L不是很大。
首先线性筛出1到之间所有的素数(2147483647是啥?自个儿猜去 ~),然后再通过已经晒好素数筛出给定区间的素数。
算是模板吧,此处不贴代码~
3.4.素数判定
3.4.1.试除法
就是大家都会的简单算法,用小于该数的所有素数去试除,若都无法整除,则为 素数,复杂度O(sqrt(N)).
3.4.2.Miller-Robin随机素性测试
关于Miller-Robin算法,可以另劈一章进行讲解,因而此处只做简略介绍。
Miller-Rober 带有随机性,可能测出伪素数,概率为,一般 s 为 20 左右,
因而失误概率很低,适用于大数素性判断。
关于Miller-Robin的时间复杂度,最坏为。Miller- Rabin算法的 性能是很好的。在实际应用中,Miller-Rabin的实际执行速度也很快。
3.5.唯一分解理论
简单却很有用的一个理论
自然数N皆可以表示为素数之积
比如:
由此可见,自然数的基本单位是素数。
唯一分解理论的用处很广,简直说不过来,在数论题目中平凡出现,一般与素数挂 钩的数论题,十有八九会用到这个理论。
例如:
(1) N的约数个数,为(x1+1)*(x2+1)*……*(xm+1)
(2)设
则
3.6.分解质因子
3.6.1.普通的分解质因数
对n进行分解质因子,将分解的因子存入数组facs中,长度为cnt。
先找一个最小的质数k;
若该质数等于n,则分解质因子的过程已经结束;
若n>k,且k|n,则记录k,n/=k,然后继续寻找;
若n不能被k整除,k+=2,继续寻找。
3.6.2.Pollard_rho 因数分解
适用于大数的分解质因子,返回的质因子无序。
3.7.素数的扩充知识
3.7.1.梅森素数
形如的一类数,p为素数,称为梅森数。若梅森数是素数,则称为梅 森素数,记作Mp。
例如当p=2、3、5、7时,Mp为素数,其实能使Mp称为素数的p少之又少。是 否有无穷多个梅森素数是数论中未解决的难题之一。
3.7.2.高斯素数
高斯素数是不能表现为1、i或本身除外的两个复整数的乘积的复整数。
高斯素数是素数在复数范围内的拓展。
(1+2i)是高斯素数,5+sqrt(-2)不是高斯素数,因为
5+sqrt(-2)=(1-sqrt(-2))*(1+2sqrt(-2))
有的数在实数范围内是素数,但是在素数范围内不是素数,例如
13 = ( 3 – 2i ) * ( 3 + 2i )
关于高斯素数的判定,a+bi是素数当且仅当
(1)a、b中有一个是0,另一个是形为4n+3或-(4n+3)的素数
(2)a、b均不为0,为素数
关于此定理的证明,需要了解费马平方和定理,即奇质数能表示为两个平方
数之和的充分必要条件是该素数被4除余1。证明大家自行学习,此处不再赘
述。
4、欧拉函数
4.1.定义
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目,记作
例如,因为1、3、5、7均和8互质。
4.2.通式
,Pi是x的所有质因子,x!=0
φ(1)=1(唯一和 1 互质的数就是 1 本身)
求 φ(x)的时候,先将式子转化一下,以避免用 double:
1-1 / pn =(pn-1)/ pn
4.3.性质
欧拉函数式积性函数,即满足
4.4.指数循环节问题
对于,我们可以用快速幂轻松解决,但是对于
,快速幂就显得苍白无力了,因为幂实在太大,对此我
们就需要对其进行降幂处理,有如下公式
这样,幂数降下来了,就可以妥妥的用快速幂求解了。
关于此公式的证明,参见http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9
指数循环节,可以解决迭代幂的问题,所谓迭代幂,就是求解
利用递归就出最上层的幂所需要模的欧拉函数,然后在回溯的过程中运用降幂公式求
解。
5、中国剩余定理
5.1.引入
有题曰:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几 何?
化简一下:简化一下:已知 x%3=2, x%5=3, x%7=2, 求 x
根据题意:
x≡r1(mod 3)
x≡r2(mod 5)
x≡r3(mod 7)
另一方面
70=(5×7)x2≡1(mod 3)、70≡0(mod 5)及70≡0(mod 7)
21=(3×7)x1≡1(mod 5)、21≡0(mod 3)及21≡0(mod 7)
15=(3×5)x1≡1(mod 7)、15≡0(mod 3)及15≡0(mod 5)
由同余的特性,有
70r1≡r1(mod 3)、70r1≡0(mod 5)及70r1≡0(mod 7)
21r2≡0(mod 3)、 21r2≡r2(mod 5)及21r2≡0(mod 7)
15r3≡0(mod 3)、 15r3≡0(mod 5)及15r3≡r3(mod 7)
因此
70r1+21r2+15r3≡r1(mod 3)
70r1+21r2+15r3≡r2(mod 5)
70r1+21r2+15r3≡r3(mod 7)
所以
x≡70r1+21r2+15r3+3m
x≡70r1+21r2+15r3+5n
x≡70r1+21r2+15r3+7p
最后,得到结果,x≡(70r1+21r2+15r3)(mod 105),而105正便是3,5,7的最小公 偣数。所以其实在很多数字可以满足这几个余数条件的,要找到最小值才要减105。
5.2.中国剩余定理
问题简单来说就是 a = ai (mod ni) 求未知数 a。
中国余数定理:
设 n=n1*n2…nk, 其中因子两两互质.有: a—–(a1,a2,…,ak),
其中 ai = a mod ni, 则 a和(a1,a2,…,ak)关系是一一对应的.就是说可以由 a 求出
(a1,a2,…,ak), 也可以由(a1,a2,…,ak)求出 a
推论 1:
对于 a=ai (mod ni) 的同余方程,有唯一解
下面说说由(a1, a2, …, ak)求 a 的方法:
定义 mi = n1*n2*…nk / ni; ci = mi(mf mod ni); 其中 mi*mf mod ni = 1;
则 a = (a1*c1+a2*c2+…+ak*ck) (mod n) (注:由此等式可求a%n, 当 n 很大时)
中国剩余定理关键是 mf 的求法,如果理解了扩展欧几里得 ax+by=d, 就可以想到:
mi*mf mod ni = 1 => mi*mf+ni*y=1;
5.3.非互质的中国剩余定理(中国剩余定理的一般情况)
采用两两合并的思想:
X ≡ r1 ( mod a1 )
X ≡ r2 ( mod a2 )
推得:
X = k1 * a1 + r1
X = k2 * a2 + r2
所以:
k1 * a1 + r1 = k2 * a2 + r2
推得:
k1 * a1 ≡ ( r2 – r1 ) ( mod a2 )
解模线性方程求得最小的 k1
然后得到:
X = k1 * a1 + r1
令:
r = x 、a = lcm ( a1 , a2 )
然后就可以组成另一个式子:
X ≡ r ( mod a )
将这个式子与下一个式子继续像上述一样合并,一直到最后一个并完,r 就是答案。