唯一分解定理
定义
每个大于$1$的自然数, 要么本身就是质数, 要么可写为$2$个或以上质数积, 且质因子排列顺序唯一
- $N = \prod_{i=1}^k p_i^{a_i}$ ($p_1< p_2 < …< p_k<N$且均为质数)
例, $6936=2^3317^2, 1200=2^435^2$
- 若 $N = \prod_{i=1}^k p_i^{a_i}$, 其因数有 $\prod_{i=1}^{k} (a_i+1)$ 个
证明
对于$p_1$部分来说, 分以下情况,
-
包含$0$个$p_1$时, $N$ 的因数$x_1 = p_2^{a_2}\cdots p_k^{a_k}$
-
包含$1$个$p_1$时, $N$ 的因数$x_2 = p_1^{1}p_2^{a_2}\cdots p_k^{a_k}$
$\cdots$
- 包含$a_1$个$p_1$时, $N$ 的因数$x_{a_1} = p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$
$p_1$部分总因数个数为$(a_1 + 1)$,
$p_2$部分总因数个数为$(a_2 + 1)$
$\cdots$
$p_i$部分总因数个数为$(a_i + 1)$
- $N$的因数个数为 $\prod_{i=1}^{k} (a_i + 1)$
例, $24 = 2 ^ 3 * 3 ^ 1$, 因数有$(3 + 1) * (1 + 1) = 8个$
求100!因数个数
#include<stdio.h>
typedef long long ll;
const int n = 100;
int main(void){
int b[101] = {0};
int x;
for (int i = 1; i <= n; i++) {
x = i;
for (int j = 2; j * j <= x; j++) {
// 当j是x的素因子时
while (x % j == 0) {
// m[j]表示素因子j的指数
b[j]++;
x /= j;
}
}
// 若x不为1说明其为素数
if (x != 1) {
b[x]++;
}
}
ll sum = 1;
for(int i = 1;i <= n ;i++){
if(b[i]){
sum *= b[i];
}
}
printf("%lld\n", sum);
return 0;
}
同余定理
正整数$m$, 若整数$a$, $b$满足$a-b$能够被$m$整除, 即$(a-b)/m$得到整数
则称整数$a$与$b$对模$m$同余, 记作
$a≡b(mod$ $m)$
对模$m$同余是整数的一个等价关系
$a≡b(mod$ $m)$ 等价 $a\%m = b\%m$
例如, $26≡2(mod 12)$
$a≡b(mod$ $m)$ 等价 $a^{p}≡b^{p} (mod$ $m)$
费马小定理定义
若 $p$ 为质数, 则$a^{p}≡a(mod$ $p)$, 即 $a^{p-1}≡1(mod$ $p)$
费马小定理通常用来检验一个数是否是素数, 是素数的必要非充分
条件
满足费马小定理检验的数未必是素数, 这种合数叫做卡迈克尔数($Carmichael Number$)
最小卡迈克尔数是$561$
对于质数 $p$
-
$n$ $mod$ $m = 0$, 则$\varphi(n \times p) = \varphi(n) \times p$
-
$n$ $mod$ $m \ne 0$, 则$\varphi(n \times p) = \varphi(n) \times (p-1)$