分解质因数 | 求解最大质因数

前言

求解最大质因数\(\iff\)分解质因数时只返回最大质因数
本文只讲了短除法分解质因数,算法时间复杂度为 $ \sqrt n$。

还有一个算法时间复杂度为\(O(n^{\frac{1}{4}})\)的算法,看这里吧Pollard Rho快速因数分解

基础知识:

  1. 任何一个正整数都必然可以表示为许多个质数的乘积。
    根据算术基本定理,任何正整数皆有独一无二的质因子分解式

  2. 素数x素数=合数,素数x合数=合数,合数x合数=合数

  3. 如果一个合数n有比\(\sqrt n\) 大的质因数,那么这样的质数有且只有一个。
    如果有两个,那么这两个质数相乘就大于n了。

质因数:

每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。
只有一个质因子的正整数为质数。

比如12=2×2×3,2和3就是12的质因数。

短除法分解质因数

方法:
从最小的质数除起,一直除到结果为质数为止。

例如:
image

时间复杂度: $ \sqrt n$

需要注意的是:

  1. 因为一个合数的质因子一定在扫描到这个合数之前就从N中剔除掉了,所以无需验证 i 是否为质数
  2. 如果N没有被任何2~\(sqrt N\)的数整除,则N是质数。

求解最大质因数代码:

int getmaxprime(int n)
{
    for (int i = 2; i <= sqrt(1.0 * n); i++)//从2到根号n求其质因数
    {
        while (n % i == 0)
            n = n / i;
//此时输出i就是分解所有质因子
    }
    return n;
}

还可以更快一点

void getmaxprime(int n)
{
    for (int i = 2; i <= 1.0 * sqrt(n);)
    {
        int cnt = 0;
        while (n % i == 0)
            n = n / i;
        // 不需要每次只+1
        if (i == 2)  i++;
        else  i += 2;
    }
    return n;
}

短除法还可以用来求多个数的最大公因数和最小公倍数:

求几个数最大公因数的方法:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。

例如:求12与18的最大公因数。
给每个数分别分解质因数的方法。
12=2×2×3
18=2×3×3
所分出的质因数无疑都能整除原数,因此这些质因数也都是原数的约数。
从分解的结果看,12与18都有公约数2和3,而它们的乘积2×3=6,就是 12与18的最大公约数。

如果把这两个数合在一起短除,则更容易找出公约数和最大公约数。
例如:
image

短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数就是这两个数的公共质因数的连乘积。最小公倍数就是把所有约数和最终剩下无法约分的数连乘。

原文1(不太建议看原文,很多写错了)

posted @ 2022-07-21 20:49  kingwzun  阅读(1405)  评论(0编辑  收藏  举报