Ich arbeite an einem Projekt Euler-Problem, das die Faktorisierung einer ganzen Zahl erfordert. Ich kann eine Liste aller Primzahlen erstellen, die der Faktor einer gegebenen Zahl sind. Der Fundamentalsatz der Arithmetik besagt, dass ich diese Liste verwenden kann, um den Faktor Faktor abzuleiten.Ich habe eine Python-Liste der Primfaktoren einer Zahl. Wie finde ich (pythonisch) alle Faktoren?
Mein aktueller Plan ist es, jede Zahl in die Liste der Basis-Primzahlen aufzunehmen und ihre Potenz zu erhöhen, bis sie nicht länger ein ganzzahliger Faktor ist, um die maximalen Exponenten für jede Prim zu finden. Dann werde ich jede mögliche Kombination von Primzahl-Exponenten-Paaren multiplizieren.
So 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.
nächstes tun jede Kombination von diesen auf den maximalen Exponenten bis zu den 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
So ist 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 bisher habe. Zwei Probleme: Erstens glaube ich nicht, dass es sehr pythonisch ist. Ich würde das gerne reparieren. Zweitens habe ich wirklich haben keine pythonische Art, den kombinatorischen zweiten Schritt zu tun. Aus Scham habe ich dich von den lächerlichen Loops verschont.
n ist die Zahl, die wir berücksichtigen möchten. 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)
Ihr Code ist falsch. Es könnte eine anrechenbare Primzahl geben, die größer als die Quadratwurzel von n ist. Zum Beispiel, n = 7 oder n = 22. –
@Sheldon L. Cooper Danke, definitiv falsch. Ich habe Algorithmen verwechselt. –
Aus Neugier, welche Nummer Problem lösen Sie? – tokland