我正在研究需要对整数进行因子分解的Euler项目。我可以列出所有给定数字的质数的列表。算术基本定理意味着我可以使用此列表来得出数字的 每个 因子。
我当前的计划是将基本质数列表中的每个数字取整并提高其幂,直到找到每个质数的最大指数不再是整数因子为止。然后,我将乘以素数对的所有可能组合。
例如,对于180:
Given: prime factors of 180: [2, 3, 5] Find maximum exponent of each factor: 180 / 2^1 = 90 180 / 2^2 = 45 180 / 2^3 = 22.5 - not an integer, so 2 is the maximum exponent of 2. 180 / 3^1 = 60 180 / 3^2 = 20 180 / 3^3 = 6.6 - not an integer, so 2 is the maximum exponent of 3. 180 / 5^1 = 36 180 / 5^2 = 7.2 - not an integer, so 1 is the maximum exponent of 5.
接下来,对所有这些组合进行最大幂运算以得到因子:
2^0 * 3^0 * 5^0 = 1 2^1 * 3^0 * 5^0 = 2 2^2 * 3^0 * 5^0 = 4 2^0 * 3^1 * 5^0 = 3 2^1 * 3^1 * 5^0 = 6 2^2 * 3^1 * 5^0 = 12 2^0 * 3^2 * 5^0 = 9 2^1 * 3^2 * 5^0 = 18 2^2 * 3^2 * 5^0 = 36 2^0 * 3^0 * 5^1 = 5 2^1 * 3^0 * 5^1 = 10 2^2 * 3^0 * 5^1 = 20 2^0 * 3^1 * 5^1 = 15 2^1 * 3^1 * 5^1 = 30 2^2 * 3^1 * 5^1 = 60 2^0 * 3^2 * 5^1 = 45 2^1 * 3^2 * 5^1 = 90 2^2 * 3^2 * 5^1 = 180
因此,因子列表= [1、2、3、4、5、6、9、10、12、15、18、20、30、36、45、60、90、180]
这是我到目前为止的代码。有两个问题:首先,我认为这完全不是Python语言。我想解决这个问题。其次,我 真的 没有Python方式可以完成第二步。出于耻辱,我使您摆脱了荒谬的循环。
n是我们要分解的数字。listOfAllPrimes是不超过1000万个素数的预先计算的列表。
def getListOfFactors(n, listOfAllPrimes): maxFactor = int(math.sqrt(n)) + 1 eligiblePrimes = filter(lambda x: x <= maxFactor, listOfAllPrimes) listOfBasePrimes = filter(lambda x: n % x ==0, eligiblePrimes) listOfExponents = [] #(do I have to do this?) for x in listOfBasePrimes: y = 1 while (x**(y+1)) % n == 0: y += 1 listOfExponents.append(y)
相反,指数清单,考虑简单地 重复 利用的次数每一个素因子它 是 一个因素。然后,处理生成primefactors的带有重复的列表,itertools.combinations即可满足您的需要- 您只需要将长度2 len(primefactors) - 1的组合包含在所包含的项目中(只有一个的组合是主要因素,所有其中一个将是原始编号- 如果您也想要这些编号,请使用range(1, len(primefactors) + 1)而不是range(2, len(primefactors))我的主要建议所使用的编号)。
primefactors
len(primefactors) - 1
range(1, len(primefactors) + 1)
range(2, len(primefactors))
结果中将存在重复(例如,6将出现的结果是的两倍12,因为后者primefactors将是[2, 2, 3]),并且当然可以按照通常的方式(sorted(set(results))例如)清除它们。
6
12
[2, 2, 3]
sorted(set(results))
要计算primefactors给定listOfAllPrimes,请考虑以下示例:
listOfAllPrimes
def getprimefactors(n): primefactors = [] primeind = 0 p = listOfAllPrimes[primeind] while p <= n: if n % p == 0: primefactors.append(p) n //= p else: primeind += 1 p = listOfAllPrimes[primeind] return primefactors