定义
设 ,。如果 ,使得 ,那么就说 可被 整除,记作 ;
不被 整除记作 。
整除的性质:
- 设 ,那么 。
- 设 ,那么 。
定义
若 ,则称 是 的 倍数, 是 的 约数。
是所有非 整数的倍数。对于整数 , 的约数只有有限个。
平凡约数(平凡因数):对于整数 ,、 是 的平凡约数。当 时, 只有两个平凡约数。
对于整数 , 的其他约数称为真约数(真因数、非平凡约数、非平凡因数)。
约数的性质:
- 设整数 。当 遍历 的全体约数的时候, 也遍历 的全体约数。
- 设整数 ,则当 遍历 的全体正约数的时候, 也遍历 的全体正约数。
解释
假设我们有整数 ,当我们遍历 的每一个约数 时, 也会是 的一个约数。这是因为:
- 如果 是 的约数,那么存在一个整数 ,使得 。反过来, 也是一个整除 的整数,因此也是 的约数。
- 当我们让 遍历 的所有约数时, 也会遍历所有约数。
举例:设 。 的约数有 。当我们让 遍历这些约数时:
- ,则 ;
- ,则 ;
- ,则 ;
- ,则 ;
- ,则 ;
- ,则 。
可以看出,当 遍历 的所有约数时, 也遍历了 的所有约数。
当 是正整数时,它的约数也是正数。如果我们让 遍历 的所有正约数, 也会是 的一个正约数。这是因为:
- 如果 是 的一个正约数,那么 也是 的一个正约数。
- 当 遍历 的所有正约数时, 也会遍历所有正约数。
举例:同样设 ,它的正约数是 。当 遍历这些正约数时, 也遍历了相同的正约数,如前面的例子所示。
总结: 当我们遍历一个整数 的所有约数(或正约数)时,约数的形式 也会覆盖同样的约数。这表明约数在这两个集合中是成对出现的:一个约数 和它对应的 会互为约数。
在具体问题中,如果没有特别说明,约数总是指正约数。
余数定义
设 为两个给定的整数,。设 是一个给定的整数。那么,一定存在唯一的一对整数 和 ,满足 。
无论整数 取何值, 统称为余数。 等价于 。
一般情况下, 取 ,此时等式 称为带余数除法(带余除法)。这里的余数 称为最小非负余数。
余数往往还有两种常见取法:
- 绝对最小余数: 取 的绝对值的一半的相反数。即 。
- 最小正余数: 取 。即 。
带余数除法的余数只有最小非负余数。如果没有特别说明,余数总是指最小非负余数。
余数的性质:
- 任一整数被正整数 除后,余数一定是且仅是 到 这 个数中的一个。
- 相邻的 个整数被正整数 除后,恰好取到上述 个余数。特别地,一定有且仅有一个数被 整除。
关于公约数、公倍数、最大公约数与最小公倍数,四个名词的定义,见 最大公约数。
注意
一些作者认为 和 的最大公约数无定义,其余作者一般将其视为 。C++ STL 的实现中采用后者,即认为 和 的最大公约数为 。
最大公约数有如下性质:
- ;
- ;
- 若 ,则 ;
- ;
- 。进而 ;
- 对不全为 的整数 和非零整数 ,;
- 对不全为 的整数 ,若 ,则 ;
- 。
最大公约数还有如下与互素相关的性质:
- 若 且 ,则 ;
- 若 、 且 ,则 ;
- 若 ,则 ;
- 若 ,则 。特别地,若 ,则 ;
- 对整数 ,若 ,且 ,则 。
最小公倍数有如下性质:
- ;
- ;
- 若 ,则 ;
- 若 ,则 ;
- 。进而 ;
- 若 ,则 ;
- ;
- ;
- 。
最大公约数和最小公倍数可以组合出很多奇妙的等式,如:
- ;
- ;
- 。
这些性质均可通过定义或 唯一分解定理 证明,其中使用唯一分解定理的证明更容易理解。
定义
若 ,则称 和 互素(既约)。 若 ,则称 互素(既约)。
多个整数互素,不一定两两互素。例如 、 和 互素,但是任意两个都不互素。
辗转相除法是一种算法,也称 Euclid 算法。见 最大公约数。
关于素数的算法见 素数。
定义
设整数 。如果 除了平凡约数外没有其他约数,那么称 为 素数(不可约数)。
若整数 且 不是素数,则称 为 合数。
和 总是同为素数或者同为合数。如果没有特别说明,素数总是指正的素数。
整数的因数是素数,则该素数称为该整数的素因数(素约数)。
素数与合数的简单性质:
- 大于 的整数 是合数,等价于 可以表示为整数 和 ()的乘积。
- 如果素数 有大于 的约数 ,那么 。
- 大于 的整数 一定可以表示为素数的乘积。
- 对于合数 ,一定存在素数 使得 。
- 素数有无穷多个。
- 所有大于 的素数都可以表示为 的形式[^ref1]。
算术基本引理
设 是素数,,那么 和 至少有一个成立。
算术基本引理是素数的本质属性,也是素数的真正定义。
算术基本定理(唯一分解定理)
设正整数 ,那么必有表示:
其中 是素数。并且在不计次序的意义下,该表示唯一。
标准素因数分解式
将上述表示中,相同的素数合并,可得:
称为正整数 的标准素因数分解式。
算术基本定理和算术基本引理,两个定理是等价的。
在 C/C++ 中,整数除法和取模运算,与数学上习惯的取模和除法不一致。
对于所有标准版本的 C/C++,规定在整数除法中:
- 当除数为 0 时,行为未定义;
- 否则
(a / b) * b + a % b
的运算结果与 a
相等。
也就是说,取模运算的符号取决于除法如何取整;而除法如何取整,这是实现定义的(由编译器决定)。
从 C99 和 C++11 标准版本起,规定 商向零取整(舍弃小数部分);取模的符号即与被除数相同。从此以下运算结果保证为真:
5 % 3 == 2;
5 % -3 == 2;
-5 % 3 == -2;
-5 % -3 == -2;