每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数。
定义
质因数(或
质因子)在
数论里是指能整除给定正
整数的
质数。
两个没有共同质因子的正整数称为互质。因
为1没有质因子,1与任何正整数(包括1本身)都是互质。
正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数。
例子
就是一个数的
约数,并且是
质数,比如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的最大公因数是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的最大公约数。与前边分别分解质因数相比较,可以发现:不仅结果相同,而且
短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数,就是这两个数的公共质因数的连乘积。
实际应用中,是把需要计算的两个或多个数放置在一起,进行短除。
在计算多个数的最小公倍数时,对其中任意两个数存在的约数都要算出,其它无此约数的数则原样落下。最后把所有约数和最终剩下无法
约分的数连乘即得到最小公倍数。
(短除法详解:
短除符号就是除号倒过来。短除就是在除法中写
除数的地方写两个数共有的
质因数,然后落下两个数被公有质因数整除的商,之后再除,以此类推,直到结果
互质为止(两个数互质)。
而在用短除计算多个数时,对其中任意两个数存在的因数都要算出,其它没有这个因数的数则原样落下。直到剩下每两个都是
互质关系。
求最大公因数遍乘一边,求最小公倍数遍乘一圈。
(
公约数:亦称“公
因数”。是几个整数同时均能整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。)
在用短除计算多个数时,对其中任意两个数存在的因数都要算出,其它没有这个因数的数则原样落下。直到剩下每两个都是互质关系。
求最大公约数遍乘左边所有数公共的因数,求最小公倍数遍乘一圈。这种方法对求两个以上数的最大公因数,特别是数目较大的数,显然是不方便的。于是又采用了给每个数分别
分解质因数的方法
)
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的值,重复执行第一步。
06 |
printf ( "\nplease input a number:\n" );
|
另一种形式:
02 |
Integer[] decPrime( int n) {
|
03 |
List<Integer> list = new ArrayList<Integer>();
|
04 |
for ( int i=2;i <= n;i++){
|
10 |
list.add(Integer.valueOf(i));
|
14 |
list.add(Integer.valueOf(n));
|
15 |
return list.toArray( new Integer[list.size()]);
|
另外代码:
。我们用所有正整数试验一下,从2开始进行试除,逐步增加除数的值,去寻找一个可以整除n的数。在Eratosthenes筛法的讨论中,我们知道如果n是一个复合数,那么它就会有一个素数 。算法9.3所示的就是这种方法的伪代码。这个算法有两个偱环路径,外部的和内部的。外部循环求唯一因数,内部循环求一个因数的多个复本。例如, ,外部循环求出因数2和3。内部循环求出2是一个多因数。
01 |
void trial_divisio_fac( int n)
|
上面的代码解释比较清楚。为什么这种方法可以得到素数。
因为我们在内层循环中,已经把当前a的所有倍数都去除了。这跟埃斯托尼算法是一样的。
复杂度 如果 ,这种情况下试除法通常都是很有效的。但是如果用来分解更大的整数,试除法就变得非常低效甚至不可用了。这种算法的复杂度是随着n的增加呈指数级别增长的。
(
试除法是整数分解算法中最简单和最容易理解的算法。
给定一个合数n(这里,n是待分解的整数),试除法看成是用小于等于的每个素数去试除待分解的整数。如果找到一个数能够整除除尽,这个数就是待分解整数的因子。
).
例9.29
运用试除算法求1233的因数。
1233=3^2*137.
参考:http://www.acmerblog.com/integer-factorization-5124.html
相关推荐
c++实现质因数分解,主要是快速,因为分解用普通方法也可以,如何快速分解呢,答案是用筛选法先求出质数,然后分解质数就很快了
首先来看一个最简单的C语言实现质因数分解的列子: #include void main( ) { int data, i = 2; scanf("%d", &data); while(data > 1) { if(data % i == 0) { printf("%d ", i); data /= i; } else i++;...
在NOIP(全国青少年信息学奥林匹克联赛)2012年普及组复赛的第一题中,选手们可能被要求编写程序来实现这个功能,对给定的数字进行质因数分解,并处理10组不同的测试数据。 质因数分解的原理是通过不断地用最小的...
现代质因数分解算法主要分为两大类:确定性算法和随机化算法。确定性算法如Pollard's rho算法、Williams' p-1算法等,它们依赖于特定的数学构造来寻找因数。随机化算法,如Quadratic Sieve和General Number Field ...
在给定的"质因数分解器.exe"文件中,很可能是一个应用程序,它实现了以上提到的一种或多种算法,以帮助用户快速、准确地对7位数进行质因数分解。使用这样的工具,用户可以避免手动计算的繁琐,提高效率,并进一步...
PallardRho算法是由法国数学家François Palla于1996年提出的一种改进的因数分解算法,它是基于Carmichael的Lambda函数和Rho函数(ρ函数)的组合。Rho函数用于寻找可能的平方根,而Carmichael的Lambda函数则涉及...
这个程序使用了最简单的质因数分解算法,通过遍历所有小于或等于输入数平方根的质数来寻找因数。当输入的数较大时,可以考虑优化算法,比如使用更高效的筛法(如埃拉托斯特尼筛法)来提前找出一定范围内的所有质数,...
质因数分解算法例如90=2*3*3*5 java实现
Python中实现质因数分解通常使用循环结构,如for循环或while循环,配合条件判断来找出一个数的所有质因数。以下是一个简单的Python函数,用于实现质因数分解: ```python def prime_factors(n): factors = [] ...
这个“易语言分解质因数源码”文件应该包含了上述逻辑的实现,通过阅读和学习这个源码,初学者可以更好地理解易语言的基本语法和流程控制,同时也能掌握质因数分解这一基础的数学算法。这个过程对提升编程思维和问题...
6. **质因数分解算法**: - 首先,确保输入的数字是正整数。 - 从最小的质数2开始,用当前的质数去尝试除输入的数字,如果能整除,则质因数列表中加入该质数,并将原数除以这个质数,重复此过程,直到不能整除为止...
程序名称: C++ 程序设计质因数分解.exe 程序介绍: C++ 程序设计质因数分解.exe 是一个功能强大的工具,用于对给定的整数进行质因数分解。用户输入一个正整数,程序将自动计算并输出该整数的所有质因数及其对应的幂次...
Java实现正整数分解质因数的例子。如果数学好,相信这个代码不会难。在本例子中,输入90,打印出90=2*3*3*5。解题思路和方法:对n分解质因数,需要先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰...
其中,ECM算法因其在处理大整数质因数分解时的优越性能而受到广泛的关注。 #### 指数复杂度与亚指数复杂度 试除法的时间复杂度为\(O(\sqrt{n})\),这是因为只需要检查到\(\sqrt{n}\)即可。相比之下,Pollard's Rho...
一个简短的java质因数分解的小程序,算法不是很精巧,但是很容易懂
同时,理解质因数分解对于解决数论问题,如欧几里得算法(计算最大公约数)和扩展欧几里得算法(求逆元和模线性同余方程的解)也非常重要。 此外,质因数分解在数据结构和算法设计中也有应用,如哈希函数的设计、...
可以对超过64位最大整数(18446744073709551615,约1845亿亿,20位十进制数)的整数分解质因数。原创的全部源代码共享。 使用了.NET库的“大整数”类。界面为 Win Form 程序使用确定性算法。 做了尽可能多的优化...