私は整数の因数分解を必要とするプロジェクトオイラー問題に取り組んでいます。与えられた数の因数であるすべての素数のリストを思いつくことができます。算術の基本定理は、このリストを使用して、数のすべての要素を導き出すことができることを意味します。
私の現在の計画は、基本素数のリストの各数値を取得し、各素数の最大指数を見つけるための素因数がなくなるまでその累乗を上げることです。次に、素数と指数のペアの可能なすべての組み合わせを乗算します。
たとえば、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]
これが私がこれまでに持っているコードです。2つの問題:最初に、それはまったくPythonicではないと思います。それを直したいのですが。第二に、私には、組み合わせの2番目のステップを実行するためのPythonの方法が本当にありません。恥ずかしさから、私はあなたをばかげたループのセットから免れました。
nは因数分解したい数です。listOfAllPrimesは、1,000万までの素数の事前計算されたリストです。
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)