您的位置:首页 > 其它

分解质因素的算法

2016-05-08 13:52 447 查看
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数。


定义

质因数(或质因子)在数论里是指能整除给定正整数的质数。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数。


例子

1没有质因子。

5只有1个质因子,5本身。(5是质数。)

6的质因子是2和3。(6 = 2 × 3)

2、4、8、16等只有1个质因子:2(2是质数,4 = 2,8 = 2,如此类推。)

10有2个质因子:2和5。(10 = 2 × 5)

就是一个数的约数,并且是质数,比如8=2×2×2,2就是8的质因数。12=2×2×3,2和3就是12的质因数。把一个式子以12=2×2×3的形式表示,叫做分解质因数。16=2×2×2×2,2就是16的质因数,把一个合数写成几个质数相乘的形式表示,这也是分解质因数。[1]

分解质因数的方法是先用一个合数的最小质因数去除这个合数,得出的数若是一个质数,就写成这个合数相乘形式;若是一个合数就继续按原来的方法,直至最后是一个质数 。

分解质因数的有两种表示方法,除了大家最常用知道的“短除分解法”之外,还有一种方法就是“塔形分解法”。

分解质因数对解决一些自然数和乘积的问题有很大的帮助,同时又为求最大公约数和最小公倍数做了重要的铺垫。


计算方法

短除法

求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式的叫短除法,和除法的性质差不多,还可以用来求多个个数的公因式:

求最大公因数的一种方法,也可用来求最小公倍数。

求几个数最大公因数的方法,开始时用观察比较的方法,即:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。

例如:求12与18的最大公因数。

12的因数有:1、2、3、4、6、12。

18的因数有:1、2、3、6、9、18。

12与18的公因数有:1、2、3、6。

12与18的最大公因数是6。

这种方法对求两个以上数的最大公因数,特别是数目较大的数,显然是不方便的。于是又采用了给每个数分别分解质因数的方法。

12=2×2×3

18=2×3×3

12与18都可以分成几种形式不同的乘积,但分成质因数连乘积就只有以上一种,而且不能再分解了。所分出的质因数无疑都能整除原数,因此这些质因数也都是原数的约数。从分解的结果看,12与18都有公约数2和3,而它们的乘积2×3=6,就是
12与18的最大公约数。

采用分解质因数的方法,也是采用短除的形式,只不过是分别短除,然后再找公约数和最大公约数。如果把这两个数合在一起短除,则更容易找出公约数和最大公约数。

从短除中不难看出,12与18都有公约数2和3,它们的乘积2×3=6就是12与18的最大公约数。与前边分别分解质因数相比较,可以发现:不仅结果相同,而且短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数,就是这两个数的公共质因数的连乘积。

实际应用中,是把需要计算的两个或多个数放置在一起,进行短除。

在计算多个数的最小公倍数时,对其中任意两个数存在的约数都要算出,其它无此约数的数则原样落下。最后把所有约数和最终剩下无法约分的数连乘即得到最小公倍数。

只含有1个质因数的数一定是亏数。

(短除法详解:

短除符号就是除号倒过来。短除就是在除法中写除数的地方写两个数共有的质因数,然后落下两个数被公有质因数整除的商,之后再除,以此类推,直到结果互质为止(两个数互质)。
而在用短除计算多个数时,对其中任意两个数存在的因数都要算出,其它没有这个因数的数则原样落下。直到剩下每两个都是互质关系。
求最大公因数乘一边,求最小公倍数乘一圈。
(公约数:亦称“公因数”。是几个整数同时均能整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。)
在用短除计算多个数时,对其中任意两个数存在的因数都要算出,其它没有这个因数的数则原样落下。直到剩下每两个都是互质关系。求最大公约数遍乘左边所有数公共的因数,求最小公倍数遍乘一圈。这种方法对求两个以上数的最大公因数,特别是数目较大的数,显然是不方便的。于是又采用了给每个数分别分解质因数的方法


Pollard Rho因数分解

1975年,John M. Pollard提出了第二种因数分解的方法,Pollard Rho快速因数分解。该算法时间复杂度为O(n^(1/4))。

分解质因数代码:

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,

 重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

#include
"stdio.h"
02
#include
"conio.h"
03
main()
04
{
05
int
n,i;
06
printf
(
"\nplease
input a number:\n"
);
07
scanf
(
"%d"
,&n);
08
printf
(
"%d="
,n);
09
for
(i=2;i<=n;i++)
10
while
(n!=i)
11
{
12
if
(n%i==0)
13
{
14
printf
(
"%d*"
,i);
15
n=n/i;
16
}
17
else
18
break
;
19
}
20
printf
(
"%d"
,n);
21
getch();
22
}
另一种形式:

01
//返回质因数数组
02
Integer[]
decPrime(
int
n)
{
03
List<Integer>
list =
new
ArrayList<Integer>();
04
for
(
int
i=2;i
<= n;i++){
05
while
(n
!= i){
06
if
(n%i
!= 0){
07
break
;
//不能整除肯定不是因数,能够整除在这里一定是质数。因为所有的2,3,5,7
08
//都被除完之后。剩下的因数只能是奇数,且是质数。
09
}
10
list.add(Integer.valueOf(i));
11
n
= n/i;
12
}
13
}
14
list.add(Integer.valueOf(n));
15
return
list.toArray(
new
Integer[list.size()]);
16
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: