50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > c语言素数筛法与分解素因数 质因数分解及代码:

c语言素数筛法与分解素因数 质因数分解及代码:

时间:2021-10-05 22:51:14

相关推荐

c语言素数筛法与分解素因数 质因数分解及代码:

计算方法

短除法

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

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

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

例如:求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"#include"conio.h"main()

{intn,i;

printf("please input a number:");

scanf("%d",&n);

printf("%d=",n);for(i=2;i<=n;i++)while(n!=i)

{if(n%i==0)

{

printf("%d*",i);

n=n/i;

}else

break;

}

printf("%d",n);

getch();

}

另一种形式:

//返回质因数数组

Integer[] decPrime(intn) {

List list = new ArrayList();for (int i=2;i <= n;i++){while(n !=i){if(n%i != 0){break;//不能整除肯定不是因数,能够整除在这里一定是质数。因为所有的2,3,5,7//都被除完之后。剩下的因数只能是奇数,且是质数。

}

list.add(Integer.valueOf(i));

n= n/i;

}

}

list.add(Integer.valueOf(n));return list.toArray(newInteger[list.size()]);

}

另外代码:

。我们用所有正整数试验一下,从2开始进行试除,逐步增加除数的值,去寻找一个可以整除n的数。在Eratosthenes筛法的讨论中,我们知道如果n是一个复合数,那么它就会有一个素数

。算法9.3所示的就是这种方法的伪代码。这个算法有两个偱环路径,外部的和内部的。外部循环求唯一因数,内部循环求一个因数的多个复本。例如,

,外部循环求出因数2和3。内部循环求出2是一个多因数。

void trial_divisio_fac(intn)

{int a=2;while(a*a<=n)

{while(n%a==0)

{

cout<

n=n/a;

}

a++;

}if(n>1) cout<

}

上面的代码解释比较清楚。为什么这种方法可以得到素数。

因为我们在内层循环中,已经把当前a的所有倍数都去除了。这跟埃斯托尼算法是一样的。

复杂度 如果,这种情况下试除法通常都是很有效的。但是如果用来分解更大的整数,试除法就变得非常低效甚至不可用了。这种算法的复杂度是随着n的增加呈指数级别增长的。

(

试除法是整数分解算法中最简单和最容易理解的算法。

给定一个合数n(这里,n是待分解的整数),试除法看成是用小于等于

的每个素数去试除待分解的整数。如果找到一个数能够整除除尽,这个数就是待分解整数的因子。

).

例9.29

运用试除算法求1233的因数。

1233=3^2*137.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。