Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

唯一分解定理初探

唯一分解定理,又叫算术基本定理

内容

她的内容是: 任何一个大于1的自然数N,如果N不为素数,那么,N就能被唯一的分解为有限个素数的乘积。

公式

N=p1a1×p2a2×p3a3××pnanN=p_1^{a_1}\times p_2^{a_2}\times p_3^{a_3}\times … \times p_n^{a_n},其中p1<p2<p3<<pnp_1 < p_2 < p_3 < … < p_n,且pip_i为素数,aia_i为正整数。

唯一分解定理证明

从唯一分解定理的内容中可以看出,其中值得证明的地方有两处,一处是,是否所有数都能被分解为素数的乘积,即存在性,第二处是,分解是否唯一,即唯一性。下面我们逐条证明。

存在性

此处使用反正法证明,假设n为不能被分解为质数乘积的自然数中的最小的一个。

因为如果n为素数,那么n显然只能被分解为n,所以假设n为大于1的合数。

既然n为合数,那么一定存在两个数a,b,且1<a,b<n1 < a, b < n,所以得到 n=a×bn=a\times b

下面对于a和b进行分析,显然当两个数都为素数的时候矛盾已经出现了,所以下面来讨论一下为合数的情况

如果a,b中有一个为合数,假设是a,那么由于n已经是最小的不能被分解为素数乘积的合数了,那么显然a是可以被分解为素数乘积的(因为如果不能被分解,那么N为最小的不能被分解的合数这个条件就出现了矛盾)。那么矛盾就出现了。同理当两个数都为合数的时候会得到相同的矛盾。

证毕

唯一性

有存在性作为基础,那么唯一性也就值得被证明了,这里我采用相同的方法来证明。假设n为最小的不能被唯一分解为一系列素数乘积的合数,那么我们不妨设n能被分解为一下两形式

Ⅰ.n=q1×q2××qnn=q_1\times q_2\times … \times q_n

Ⅱ.n=t1×t2××tnn=t_1\times t_2\times …\times t_n

其中qiq_itit_i均为素数,且都已经按升序排列好了,显然qitiq_i\neq t_i,因为如果相等,那么两式联立时会被约掉,那样的话我们能得到一个更小的素数组合。所以q1t1q1\neq t1,那么不妨设q1<t1q_1 < t_1,然后我们用q1q_1去替换Ⅱ中的t1t_1,从而得到一个比n更小的数m。

于是我们设X=nmX=n-m,那么她应该会有以下两种形式:

Ⅲ.X=q1×(q2××qnt1×t2××tn)X=q_1\times (q_2\times … \times q_n-t_1\times t_2\times …\times t_n)

Ⅳ.X=(t1q1)×(t1×t2××tn)X=(t_1-q_1)\times (t_1\times t_2\times …\times t_n)

由于X比n要小,由假设得,X是能被唯一分解为一系列素数的乘积的。由Ⅲ得,q1q_1为X的一个质因子,由于X的分解具有唯一性,那么q1q_1要么包含于q1t1q_1-t_1中,要么包含于t1×t2××tnt_1\times t_2\times …\times t_n中,下面我们来分别讨论

①.当q1q_1包含于t1×t2××tnt_1\times t_2\times …\times t_n中时,显然于假设中

显然qitiq_i\neq t_i,因为如果相等,那么两式联立时会被约掉,那样的话我们能得到一个更小的素数组合。

相矛盾。

②当q1q_1包含于q1t1q_1-t_1中,那么我们将得到一个这样的等式t1q1q1\frac {t_1-q_1}{q1}为整数,也就是t1q11{\frac {t_1}{q_1}}-1为整数,那么也就意味着t1q1\frac {t_1}{q_1}为整数,这与假设中的

其中qiq_itit_i均为素数

相矛盾。

证毕。

代码

由此我们证明了唯一分解定理的正确性,为我们之前提到的做了个补充,也为我们接下来的学习做了铺垫,当然证明方法不唯一,如果有更好的证明方法欢迎指出,下面给出代码实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<cstdio>
#include<vector>
using namespace std;
const int N = 1e6 + 5;
vector<int > v[N];
void init(){
int temp;
for(int i = 2; i < N; i ++){
if(v[i].size() == 0){
for(int j = i; j < N; j += i){
temp = j;
while(temp % i == 0){
v[j].push_back(i);
temp /= i;
}
}
}
}
}
int main(){
init();
}

参考链接

Ⅰ.唯一性

Ⅱ.存在性

评论