在最新的CSP-J大纲中,简单数论主要考察整除、因数、倍数、指数、质 (素) 数、合数等内容。
大家好,我是李。
这里我将带着大家一起复习初赛中考察的数学知识之数论。
一、整除
整除的定义
设a,b∈Z,a≠0。如果∃q∈Z,使得b = aq,那么就说b可被a整除,记作 a|b;不被a整除记作。
整除的性质如下图所示👇
约数(因数)
若a|b,则称b是a的倍数,a是b的约数。
0是所有非0整数的倍数。对于整数b≠0,b的约数只有有限个。
二、余数
设a,b为两个给定的整数,a≠0。设d是一个给定的整数。那么,一定存在唯一的一对整数q和r,满足b=qa+r,d≤r<|a|+d
。
无论整数d取何值,r统称为余数。a|b等价于a|r
。
一般情况下,d取0,此时等式b=qa+r,0≤r<|a|
称为带余数除法(带余除法)。这里的余数r称为最小非负余数。
余数往往还有两种常见取法
**绝对最小余数:**d取 a的绝对值的一半的相反数。即:
**最小正余数:**d取1。即b=qa+r,1≤r<|a|+1
。
带余数除法的余数只有最小非负余数。如果没有特别说明,余数总是指最小非负余数。
余数的性质
任一整数被正整数a除后,余数一定是且仅是0到(a-1)这a个数中的一个。
相邻的a个整数被正整数a除后,恰好取到上述a个余数。特别地,一定有且仅有一个数被a整除。
三、素数与合数
设整数p≠0,±1
。如果p除了平凡约数外没有其他约数,那么称p为素数(不可约数)。
若整数a≠0
且a不是素数,则称a为合数。
p和-p总是同为素数或者同为合数。如果没有特别说明,素数总是指正的素数。
整数的因数是素数,则该素数称为该整数的素因数(素约数)。
素数与合数的简单性质
- 大于1的整数a是合数,等价于a可以表示为整数d和e(1<d,e<a)的乘积。
- 如果素数p有大于1的约数d,那么d=p。
- 大于1的整数a一定可以表示为素数的乘积。
- 对于合数a,一定存在素数p≤√a使得p|a。
- 素数有无穷多个。
- 所有大于3的素数都可以表示为6n±1的形式。
四、最大公约数和最小公倍数
最大公约数(gcd)
最大公约数定义:最大公约数即为Greatest Common Divisor,常缩写为gcd。
一组整数的公约数,是指同时是这组数中每一个数的约数的数。 是任意一组整数的公约数。一组整数的最大公约数,是指所有公约数里面最大的一个。
性质
- 对于任意几个数,这几个数同时成倍放大,他们的最大公约数也放大相同倍数。例如:(3,6)他们的最大公约数是3,如果放大3倍,即(9,18)= 9,即他们的最大公约数也放大了3倍
- 对于任意整数x,
(a1,a2)=(a1,a2+a1*x)
,即一个整数加上另一个整数的任意倍数,他们的最大公约数不变。例如9和24,(9,24)=(9,24-9)=(9,15)=(9,15-9)=(9,6)=(9-6,6)=(3,6)=(3,6-3)=(3,3)=(3-3,3)=(0,3)=3
注:(a,0) = (0,a) = a - 计算多元最大公约数,比如(12,18,21),先求出
(12,18)=6
,再把6带入,求出(6,21)=3
,可以将这种算法称为最大公约数的结合律
辗转相除法(欧几里得算法)
如果我们已知两个数a和b,如何求出二者的最大公约数呢?
不妨设 a>b,我们发现如果b是a的约数,那么b就是二者的最大公约数。下面讨论不能整除的情况,即a=b*q+r
,其中r<b
。
我们通过证明(常规课已经通过推论证明)可以得到gcd(a,b)=gcd(b,a mod b)
,代码实现如下:
int gcd(int a, int b) {
while (b != 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
如果两个数a和b满足gcd(a,b)=1,我们称a和b互质。
最小公倍数(LCM)
最小公倍数定义:一组整数的公倍数,是指同时是这组数中每一个数的倍数的数。0 是任意一组整数的公倍数。一组整数的最小公倍数,是指所有正的公倍数里面,最小的一个数。
性质
- 对于任意几个数,这几个数同时成倍放大,他们的最小公倍数也放大相同倍数。例如:[3,9]他们的最小公倍数是9,如果放大3倍,即[9,27]= 27,即他们的最小公倍数也放大了3倍。
- 计算多元最小公倍数,比如[3,6,9],先求出[3,6]=6,再把6带入,求出[6,9]=18,可以将这种算法称为最小公倍数的结合律
- 最大公约数*最小公倍数 = 原来两个数的乘积,比如
(16,10)*[16,10] = 80*2 = 160 = 16*10