每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数。

定义

质因数(或质因子)在数论里是指能整除给定正整数的质数。两个没有共同质因子的正整数称为互质。因为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的值,重复执行第一步。
01 #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 }

另外代码:

。我们用所有正整数试验一下,从2开始进行试除,逐步增加除数的值,去寻找一个可以整除n的数。在Eratosthenes筛法的讨论中,我们知道如果n是一个复合数,那么它就会有一个素数 。算法9.3所示的就是这种方法的伪代码。这个算法有两个偱环路径,外部的和内部的。外部循环求唯一因数,内部循环求一个因数的多个复本。例如, ,外部循环求出因数2和3。内部循环求出2是一个多因数。

01 void trial_divisio_fac(int n)
02 {
03     int a=2;
04     while(a*a<=n)
05     {
06         while(n%a==0)
07         {
08             cout<<a<<ends;
09             n=n/a;
10         }
11         a++;
12     }
13     if(n>1) cout<<n;//n没有因数
14 }

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

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

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

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

给定一个合数n(这里,n是待分解的整数),试除法看成是用小于等于的每个素数去试除待分解的整数。如果找到一个数能够整除除尽,这个数就是待分解整数的因子。

).

例9.29

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

1233=3^2*137.

参考:http://www.acmerblog.com/integer-factorization-5124.html

质因数分解及算法实现相关推荐

  1. 【Python】对大数质因数分解的算法问题

    [Python]对大数质因数分解的算法问题 发现问题 尝试分析 最后 我的代码(C1) 百科代码(C2) 发现问题   我是一个初学者,在编写一个分解质因数的代码时,学习到了 Miller-Rabin ...

  2. 室温固态量子计算机,我国学者在室温固态体系中实现基于单自旋体系的质因数分解量子算法...

    贤集网电子信息频道讯:从中国科学技术大学获悉,该校杜江峰院士课题组利用金刚石中的自旋作为量子处理器,近期在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法,向建造室温固态量子计算机迈进了重要 ...

  3. 输出递归因数分解php,[学习笔记] Miller-Rabin质数测试 Pollard-Rho质因数分解

    Miller-Rabin质数测试 & Pollard-Rho质因数分解 考试遇见卡质因数分解的题了...活久见...毒瘤lun 于是就学了一发qaq Pollard-Rho分解质因数的话需要依 ...

  4. scp量子计算机,室温固态体系中实验实现绝热量子质因数分解

    中国科学技术大学杜江峰课题组利用金刚石中的自旋作为量子处理器,首次在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法.研究成果发表在3月31日的<物理评论快报>上[Phys. R ...

  5. java质因数算法_Java实现的质因数分解操作示例【基于递归算法】

    本文实例讲述了Java实现的质因数分解操作.分享给大家供大家参考,具体如下: 这里演示java通过递归实现质因数分解,代码如下: import java.util.Scanner; public cl ...

  6. 常用简单算法-质因数分解

    对于质因数分解,在做题当中是很常用的,有时候还能用他创造奇迹呢. 好了,我们直接开始正题部分. 我们要学习质因数分解前,先了解一下基本知识,任何一个合数都可以由质数相乘获得,例如:4=2*2,6=2* ...

  7. 算法入门—质因数分解

    α. 质因数分解 每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,236可以写成三个质数相乘的数,这就是质因数分解. 236 = 2 * 2 * 59 β. 素数与素数筛 素数与 ...

  8. 素数、最大公约数、最下公倍数、质因数分解

    2013-08-18 11:20:43 素数.最大公约数.最下公倍数.质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解. 小结: 求1到n之间的素数的基本方法是通过遍历2到sqr ...

  9. C++实现质因数分解

    质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数):否则称为合数.根据算术基本定理,每一个比1大的整数,要 ...

最新文章

  1. 干货分享:自动驾驶核心技术进展之车用毫米波雷达
  2. 虚拟机克隆,并设置新的ip,配置hostname,配合hostname,hosts
  3. c++如何防止一个类被其他类继承?
  4. com 名字对象(3)使用IMoniker
  5. mac p配置android开发,Mac 下配置Android 环境变量
  6. 华山论“件”:Kafka、RabbitMQ、RocketMQ技能大比拼
  7. flex 左右布局_web前端学习:移动端开发常用布局—前端弹性布局总结
  8. 95-280-035-源码-资源管理-计算资源管理-TaskSlot
  9. jquery mobile常用的data-role类型
  10. 盘点那些不为大众所知,却暗地里很“牛逼”的软件
  11. 互联网行业数据安全建设实践方案
  12. 惠普主板f1怎么关闭_惠普台式机开机按F1怎样去除
  13. 成长篇-靡有不凡鲜克有终-02
  14. c语言中while(a)、if(a)、while(!a)、if(!a)、if(%a)是什么意思?
  15. 05,JavaScript脚本中cookie
  16. 指爱打字群添雨跟打器使用教程(指爱群新手教程)-by指爱群友
  17. 技术开发合同中的知识产权归属问题研究
  18. autopilot_donkey car
  19. 2022保密教育线上培训考试 06
  20. 用C语言判断三条边能不能形成三角形并计算出面积

热门文章

  1. XSHELL和XFTP官方免费下载
  2. 【sv】复制/拼接操作符
  3. 从月薪5000到月薪20000,自动化测试应该这样学...
  4. 会这点,你的网站会更加逼格
  5. Android 使用 mp4parser 做视频拼接合并
  6. jpa 跨表_JPA多表查询的解决办法
  7. 威客理论看维基经济学的三个漏洞
  8. 计算机基础知识ip地址,计算机网络基础:IP基础知识笔记
  9. 11 0在c语言为多少,C语言 11.0
  10. Arduino开发实例-MAX30100传感器模块连接问题解决