分解正整数的质因数

首先,由 算术基本定理可知,任何一个大于1的正整数,都可以分解成若干个质数的乘积,并且这种乘积的形式是唯一的。

所以,对于整数分解,如果先从最小的质数n=2开始进行分解,如果能整除,就只取商,直到不能除时,n++,然后判断n是否大于现在的商。如果大于,结束程序。否则继续循环。

核心代码很短,只有10行左右。

void prim(unsigned long long m)
{
    unsigned long long n = 2;
    while(m >= n)
    {
        while(m % n) n++;
        std::cout << n << " ";
        m /= n;
    }
    endl(std::cout);
}

下面来证明一下算法的正确性。就是证明输出的所有数都是m的因子,且它们相乘等于m。 同时,它们都是质数。

由 算术基本定理可知,任何一个大于1的正整数,都可以分解成若干个质数的乘积,并且这种乘积的形式是唯一的。

首先,通过程序我们直接可知的是,对于输出的n,一定是m的因子。

其次,由于只有在m可以整除n的时候,才用m /= n; 故当所有的n输出后,所有的数字相乘 肯定等于m。

最后,这才是难点。证明所有输出的数字均为质数。

我们用反证法来证明。

假设在所有输出的因数中,至少存在一个合数 k。

一方面,由算法本身可知,在输出k时,不存在小于k的、且大于1的能被m整除的正整数。

另一方面,由合数的定义可知, 这个合数k可以分解成至少两个因数的乘积。这两个因数都是小于k且大于1。对于k的这些因数(至少为两个),我们随便取其中的一个p,我们可知p < k。因为m可以整除k,所以必有m可以整除p。即:存在小于k的、且大于1的正整数p,能被m整除。

矛盾!!故假设不成立。即:输出的所有因数中,没有合数。

也就是说,输出的所有因数全为质数。

OK!

算法的正确性证明完毕。

测试了一下运行时间

int main(void)
{
    prim(600851475143);
}

《分解正整数的质因数》

    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞