python 素因子分解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 素因子分解相关的知识,希望对你有一定的参考价值。
在使用python解决问题之前,我们先说一下,什么是素因子分解
所谓素因子分解就是,先找这个数的所有约数(约数即:a%b == 0,也就是a可以被b整除)
例如:20的约数集合为 [1, 2, 5, 10, 20]
那么素因子分解呢?
就是从最小的素数约数开始除,也就是这个除数要满足两个条件,一是约数,二是素数
那么这里20的最小的素约数是2,所以我们从2开始除,并且一直除到不能被整出为止:
num = 20
num = num / 2
num = 10(这里num依旧可以被2整除,所以再来一次)
num = num / 2
num = 5 (num很明显除以2不能整除)
所以接下来被除数需要向后走,即5(再取下一个数为除数之前,要先判断是否为素数,这里5为素数,如果不是素数比如4则需要继续向后取)
num = num / 5
num = 1
至此,运算结束。所以,我们得到20的素因子集合为:[2, 2, 5]
那么接下来就是使用python实现的部分了
通过之前的解析过程,我们可以看到我们需要这么两个小模块:
1. 判断数字是否是素数,如果数字本身是素数,那么直接返回1和它本身就可以了,因为素数不能被分解了,即 [1, num]
2. 我们需要获得这个数的所有约数,以便于我们进行作除法
下面是这两个部分的实现:
1 # 判断是否是素数 2 def isprime(num): 3 count = num / 2 4 while count > 1: 5 if num % count == 0: 6 return False 7 count -= 1 8 else: 9 return True
1 # 得到所有的约数 2 def getfactors(num): 3 return [x for x in range(1, num) if num % x == 0]
通过上面两个部分,我们就可以得到所有的基础了,接下来就是运算了
1 def primefactor(num): 2 if isprime(num): 3 return [1,num] 4 factors = getfactors(num) 5 retList = [] 6 consult = num 7 for i in range(1,len(factors)): 8 if consult == 1: 9 break 10 while True: 11 if consult % factors[i] != 0: 12 break 13 if isprime(factors[i]): 14 consult /= factors[i] 15 retList.append(factors[i]) 16 else: 17 break 18 return retList
ok,最后调用primefactor就可以得到结果了,注意返回的是个list对象哦
以上是关于python 素因子分解的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1236 - Pairs Forming LCM(素因子分解)
HDU 4344-Mark the Rope-大数素因子分解
LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子
[Introduction to programming in Java 笔记] 1.3.9 Factoring integers 素因子分解