素数定义:如 p ≥ 2 且p只能被1或自身整除,则p为素数。
断言7.1 令 p 是素数,如 p 整除乘积 ab,则 p 整除 a 或 p 整除 b。
证明如下:
如 p 整除 a,则命题成立;
如 p 不整除 a,则有 gcd(a, p) = 1;
根据第6章的定理,可得方程
ax + py = gcd(a, p) = 1;
abx + pby = b;
已知 p 可整除 ab、bp ,则 p 必整除 b;
即 a, b 中至少有一个可被 p 整除。证明完毕。
定理7.2 (素数整除性质):假设素数 p 整除乘积 a1 * a2 ……ar,则 p 整除 a1, a2, ……ar 中至少一个因数。
证明:
如 p 整除 a1,命题成立;
如 p 不整除 a1,由断言7.1 可知 p 整除
a2 * a3 …… * ar;
继续此过程,最终必有 p 整除某个 ai,即p 整除 a1, a2, ……ar 中至少一个因数。证明完毕。
定理7.3(算数基本定理):每个整数 n ≥ 2 可唯一分解为素数乘积
n = p1 * p2 …… pr。
证明如下:
现证明数n可以以某种方式分解成素数乘积。证明如下:
当n = 2, n = 3, n = 4 时,有
n = 2, n = 3, n = 4 = 2 * 2,命题成立;
设当 n ≤ N 时,命题成立;
当 n = N + 1 时,
如 N + 1 为素数,命题成立;
如 N + 1 为合数,有 N + 1 = n1 * n2,n1 ≤ N,n2 ≤ N;
则 n1, n2 可分解为素数乘积,
其积 N + 1 必可分解成素数乘积,命题成立;
现证明仅有一种这样的因数分解。证明如下:
设 n 有两种分解形式,即
n = p1 * p2* …… *pr, n = q1 * q2 *……*qs;
则有 p1 整除 n,,即 p1 整除 q1 * q2 *……*qs;
由定理7.2可知,p1 整除 qn 中的某因子,设该因子为 q1;
因为 q1 为素数,则 p1 = q1;
消去 p1, q1,得
p2 * p3* …… *pr = q2 * q3 *……*qs;
继续该过程,最终消去所有 pi 或 所有 qi;
此时等式两边为1,即 {pr} 与 {qs} 的元素个数相同;
又因为两数列元素两两相等,则 {pr} = {qs},即 n 的分解形式唯一。证明完毕。
void resolve(int n)
{
int cnt = 0, m = sqrt(n) + 2;
for (int i = 2; i <= m; i += 2)
{
if (n % i == 0)
{
while (n / i == 0)
{
factor[cnt]++;
n /= i;
}
cnt++;
}
if (i == 2)
i--;
}
if (n != 1)
factor[cnt++] = n;
}