对于整数而言:
定义
如果x没有1和自身自外的约数,则称x是一个质数,或称为素数(prime)。否则这个数称为合数。
定义上,1不是质数,也不是合数。有特别说明的时候,我们把1看做质数。
我们知道符号"
∣
|
∣"表示整除,现在用符号∤表示不整除。(这里是在整除符号上批了一个撇,事实上也有另一种写法是批一个捺)
那么一个数是素数等价于命题
∀
x
∈
[
2
,
n
−
1
]
,
x
∤
n
\forall x\in [2,n-1],x∤n
∀x∈[2,n−1],x∤n
那么x∤y等价于y
m
o
d
mod
mod x≠0
如果gcd(x,y)=1,即x、y并不含有任何除1以外的公约数,则称x与y互质。记作x⊥y。
试除法判断质数
首先根据上面的命题,我们可以暴力枚举每一个x,做检验:
bool is_prime(int n) {
for(int i=2; i<n; i++)
if(n%i==0)
return false;
return true;
}
时间复杂度O(n)
但事实上不需要如此,因为约数是成对出现的,如果存在
p
⋅
q
=
n
,
p
≤
n
p \cdot q=n,p\leq \sqrt n
p⋅q=n,p≤n,则必然有
q
≥
n
q\geq\sqrt n
q≥n,所以我们只需要枚举到
n
\sqrt n
n即可:
时间复杂度O(
n
\sqrt n
n)
唯一分解定理(算数基本定理)
质数的唯一一个质因子是它本身。
显然每一个合数都可以被拆分称其质因子乘积的形式。
因此每正整数都可以被拆分成若干质因子乘积的形式。
事实上,唯一分解定理(算数基本定理)表明,每一个正整数可以被唯一地分解成它的质因子的乘积。
我们说1可以被分解成1.
n的质因子分解可以表示为,设n的不同质因子分别为p1,p2…,…,含有这些质因子的次数分别为a1,a2,…:
n
=
∏
i
=
1
s
p
i
a
i
(
p
i
−
1
<
p
i
)
n=\prod_{i=1}^sp_i^{a_i}\;\;\;\;(p_{i-1}<p_i)
n=∏i=1spiai(pi−1<pi)
∏
\prod
∏表示连乘积,这种形式被称为n的标准分解式。
唯一分解定理可以证明一下:
假设存在两种分解形式,使得
n
=
∏
i
=
1
l
p
i
a
i
(
p
i
−
1
<
p
i
)
=
∏
i
=
1
r
q
i
b
i
(
q
i
−
1
<
q
i
)
n=\prod_{i=1}^lp_i^{a_i}(p_{i-1}<p_i)=\prod_{i=1}^rq_i^{b_i}(q_{i-1}<q_i)
n=∏i=1lpiai(pi−1<pi)=∏i=1rqibi(qi−1<qi)
假设n是不满足唯一分解定理的最小的正整数。因为
p
1
∣
n
p_1|n
p1∣n,所以
p
1
∣
∏
i
=
1
r
q
i
b
i
p_1|\prod_{i=1}^rq_i^{b_i}
p1∣∏i=1rqibi。
那么我们把左右两边同时除掉p1:
∏
i
=
1
l
p
i
a
i
p
1
=
∏
i
=
1
r
q
i
b
i
p
1
\frac{\prod_{i=1}^lp_i^{a_i}}{p_1}=\frac{\prod_{i=1}^rq_i^{b_i}}{p_1}
p1∏i=1lpiai=p1∏i=1rqibi,由于整除,这必定是正整数。
我们就发现了一个更小的不符合唯一分解定理的数。这与我们假设n的最小性矛盾。
QED.
分解质因数
那么我们可以对n分解质因数。
很显然,事实上n最多只含有一个>
n
\sqrt n
n的质因子。
因此我们可以把n所有<=
n
\sqrt n
n的质因子全都除掉,剩下的那一个数就是n的大于
n
\sqrt n
n的质因子。(如果剩下一个1,则n没有大于
n
\sqrt n
n的质因子):
a[i]表示n的标准分解式中,p[i]的指数。
时间复杂度O( n \sqrt n n)
后记
于是皆大欢喜。