唯一分解定理初探
唯一分解定理,又叫算术基本定理
内容
她的内容是: 任何一个大于1的自然数N,如果N不为素数,那么,N就能被唯一的分解为有限个素数的乘积。
公式
N=p1a1×p2a2×p3a3×…×pnan,其中p1<p2<p3<…<pn,且pi为素数,ai为正整数。
唯一分解定理证明
从唯一分解定理的内容中可以看出,其中值得证明的地方有两处,一处是,是否所有数都能被分解为素数的乘积,即存在性,第二处是,分解是否唯一,即唯一性。下面我们逐条证明。
存在性
此处使用反正法证明,假设n为不能被分解为质数乘积的自然数中的最小的一个。
因为如果n为素数,那么n显然只能被分解为n,所以假设n为大于1的合数。
既然n为合数,那么一定存在两个数a,b,且1<a,b<n,所以得到 n=a×b。
下面对于a和b进行分析,显然当两个数都为素数的时候矛盾已经出现了,所以下面来讨论一下为合数的情况
如果a,b中有一个为合数,假设是a,那么由于n已经是最小的不能被分解为素数乘积的合数了,那么显然a是可以被分解为素数乘积的(因为如果不能被分解,那么N为最小的不能被分解的合数这个条件就出现了矛盾)。那么矛盾就出现了。同理当两个数都为合数的时候会得到相同的矛盾。
证毕
唯一性
有存在性作为基础,那么唯一性也就值得被证明了,这里我采用相同的方法来证明。假设n为最小的不能被唯一分解为一系列素数乘积的合数,那么我们不妨设n能被分解为一下两形式
Ⅰ.n=q1×q2×…×qn
Ⅱ.n=t1×t2×…×tn
其中qi和ti均为素数,且都已经按升序排列好了,显然qi=ti,因为如果相等,那么两式联立时会被约掉,那样的话我们能得到一个更小的素数组合。所以q1=t1,那么不妨设q1<t1,然后我们用q1去替换Ⅱ中的t1,从而得到一个比n更小的数m。
于是我们设X=n−m,那么她应该会有以下两种形式:
Ⅲ.X=q1×(q2×…×qn−t1×t2×…×tn)
Ⅳ.X=(t1−q1)×(t1×t2×…×tn)
由于X比n要小,由假设得,X是能被唯一分解为一系列素数的乘积的。由Ⅲ得,q1为X的一个质因子,由于X的分解具有唯一性,那么q1要么包含于q1−t1中,要么包含于t1×t2×…×tn中,下面我们来分别讨论
①.当q1包含于t1×t2×…×tn中时,显然于假设中
显然qi=ti,因为如果相等,那么两式联立时会被约掉,那样的话我们能得到一个更小的素数组合。
相矛盾。
②当q1包含于q1−t1中,那么我们将得到一个这样的等式q1t1−q1为整数,也就是q1t1−1为整数,那么也就意味着q1t1为整数,这与假设中的
其中qi和ti均为素数
相矛盾。
证毕。
代码
由此我们证明了唯一分解定理的正确性,为我们之前提到的做了个补充,也为我们接下来的学习做了铺垫,当然证明方法不唯一,如果有更好的证明方法欢迎指出,下面给出代码实现。
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(); }
|
参考链接
Ⅰ.唯一性
Ⅱ.存在性