分解质因数 | 求解最大质因数
前言
求解最大质因数\(\iff\)分解质因数时只返回最大质因数
本文只讲了短除法分解质因数,算法时间复杂度为 $ \sqrt n$。
还有一个算法时间复杂度为\(O(n^{\frac{1}{4}})\)的算法,看这里吧Pollard Rho快速因数分解
基础知识:
-
任何一个正整数都必然可以表示为许多个质数的乘积。
根据算术基本定理,任何正整数皆有独一无二的质因子分解式。 -
素数x素数=合数,素数x合数=合数,合数x合数=合数
-
如果一个合数n有比\(\sqrt n\) 大的质因数,那么这样的质数有且只有一个。
如果有两个,那么这两个质数相乘就大于n了。
质因数:
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。
只有一个质因子的正整数为质数。
比如12=2×2×3,2和3就是12的质因数。
短除法分解质因数
方法:
从最小的质数除起,一直除到结果为质数为止。
例如:
时间复杂度: $ \sqrt n$
需要注意的是:
- 因为一个合数的质因子一定在扫描到这个合数之前就从N中剔除掉了,所以无需验证 i 是否为质数
- 如果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的最大公约数。
如果把这两个数合在一起短除,则更容易找出公约数和最大公约数。
例如:
短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数就是这两个数的公共质因数的连乘积。最小公倍数就是把所有约数和最终剩下无法约分的数连乘。