Ich arbeite an einem Projekt-Euler-Problem, das die Faktorisierung einer ganzen Zahl erfordert. Ich kann eine Liste mit allen Primzahlen erstellen, die ein Faktor einer bestimmten Zahl sind. Der Fundamentalsatz der Arithmetik besagt, dass ich diese Liste verwenden kann, um Folgendes abzuleiten jede Faktor der Zahl.
Mein derzeitiger Plan ist, jede Zahl in der Liste der Primzahlen zu nehmen und ihre Potenz zu erhöhen, bis sie kein ganzzahliger Faktor mehr ist, um die maximalen Exponenten für jede Primzahl zu finden. Dann werde ich jede mögliche Kombination von Primzahl-Exponent-Paaren multiplizieren.
Also zum Beispiel für 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.
Als Nächstes wird jede Kombination bis zum maximalen Exponenten durchgeführt, um die Faktoren zu erhalten:
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
Also die Liste der Faktoren = [1, 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]
Hier ist der Code, den ich bis jetzt habe. Zwei Probleme: Erstens finde ich, dass er überhaupt nicht sehr Pythonisch ist. Das würde ich gerne beheben. Zweitens, ich wirklich haben keine pythonische Methode, um den zweiten kombinatorischen Schritt auszuführen. Aus Scham erspare ich Ihnen die lächerliche Menge von Schleifen.
n ist die Zahl, die wir faktorisieren wollen. listOfAllPrimes ist eine vorberechnete Liste der Primzahlen bis zu 10 Millionen.
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)