Hier ist der sehr dumme Weg:
def divisorGenerator(n):
for i in xrange(1,n/2+1):
if n%i == 0: yield i
yield n
Das Ergebnis, das ich gerne hätte, ist ähnlich wie dieses, aber ich hätte gerne einen intelligenteren Algorithmus (dieser ist zu langsam und dumm :-)
Ich kann Primfaktoren und ihre Vielfalt schnell genug finden. Ich habe einen Generator, der auf diese Weise Faktoren erzeugt:
(Faktor1, Multiplizität1)
(Faktor2, Multiplizität2)
(Faktor3, Multiplizität3)
und so weiter ...
dh die Ausgabe von
for i in factorGenerator(100):
print i
ist:
(2, 2)
(5, 2)
Ich weiß nicht, wie nützlich dies für das ist, was ich tun möchte (ich habe es für andere Probleme codiert), trotzdem möchte ich eine intelligentere Methode
for i in divisorGen(100):
print i
Geben Sie Folgendes aus:
1
2
4
5
10
20
25
50
100
UPDATE: Vielen Dank an Greg Hewgill und seinen "intelligenten Weg" :) Das Berechnen aller Teiler von 100000000 dauerte 0,01 Sekunden mit seinem Weg gegen die 39er, die der dumme Weg auf meiner Maschine nahm, sehr cool: D.
UPDATE 2: Hör auf zu sagen, dass dies ein Duplikat dieses Beitrags ist. Um die Anzahl der Teiler einer bestimmten Zahl zu berechnen, müssen nicht alle Teiler berechnet werden. Es ist ein anderes Problem, wenn Sie denken, dass dies nicht der Fall ist, suchen Sie auf Wikipedia nach "Divisor-Funktion". Lesen Sie die Fragen und die Antwort vor dem Posten. Wenn Sie das Thema nicht verstehen, fügen Sie einfach keine nicht nützlichen und bereits gegebenen Antworten hinzu.
Antworten:
In Anbetracht Ihrer
factorGenerator
FunktiondivisorGen
sollte Folgendes funktionieren:Die Gesamteffizienz dieses Algorithmus hängt vollständig von der Effizienz des Algorithmus ab
factorGenerator
.quelle
Um das zu erweitern, was Shimi gesagt hat, sollten Sie Ihre Schleife nur von 1 bis zur Quadratwurzel von n ausführen. Um das Paar zu finden, tun Sie dies
n / i
, und dies deckt den gesamten Problembereich ab.Wie bereits erwähnt, handelt es sich hierbei um ein NP- oder "schwieriges" Problem. Eine umfassende Suche, so wie Sie es tun, ist so gut wie es nur geht, um garantierte Antworten zu erhalten. Diese Tatsache wird von Verschlüsselungsalgorithmen und dergleichen verwendet, um sie zu sichern. Wenn jemand dieses Problem lösen würde, würde die meiste, wenn nicht die gesamte derzeitige "sichere" Kommunikation unsicher werden.
Python-Code:
Welches sollte eine Liste ausgeben wie:
quelle
Obwohl es dafür bereits viele Lösungen gibt, muss ich das wirklich posten :)
Dieser ist:
Code:
quelle
while i*i <= nn
durchwhile i <= limit
, wolimit = math.sqrt(n)
Ich denke, Sie können
math.sqrt(n)
statt n / 2 anhalten .Ich werde Ihnen ein Beispiel geben, damit Sie es leicht verstehen können. Jetzt
sqrt(28)
ist das5.29
soceil(5.29)
wird 6. Wenn ich also bei 6 aufhöre, kann ich alle Teiler bekommen. Wie?Sehen Sie zuerst den Code und dann das Bild:
Siehe das Bild unten:
Nehmen wir an, ich habe bereits
1
zu meiner Teilerliste hinzugefügt und beginnei=2
damitAm Ende aller Iterationen, wenn ich den Quotienten und den Divisor zu meiner Liste hinzugefügt habe, werden alle Divisoren von 28 gefüllt.
Quelle: So bestimmen Sie die Teiler einer Zahl
quelle
math.sqrt(n) instead of n/2
ist obligatorisch für EleganzIch mag Greg Lösung, aber ich wünschte, es wäre mehr Python. Ich denke, es wäre schneller und besser lesbar. Nach einiger Zeit des Codierens kam ich damit heraus.
Die ersten beiden Funktionen werden benötigt, um das kartesische Produkt aus Listen zu erstellen. Und kann wiederverwendet werden, wenn dieses Problem auftritt. Übrigens musste ich das selbst programmieren. Wenn jemand eine Standardlösung für dieses Problem kennt, kann er sich gerne an mich wenden.
"Factorgenerator" gibt jetzt ein Wörterbuch zurück. Und dann wird das Wörterbuch in "Teiler" eingespeist, die es verwenden, um zuerst eine Liste von Listen zu erzeugen, wobei jede Liste die Liste der Faktoren der Form p ^ n mit p prime ist. Dann machen wir das kartesische Produkt dieser Listen und verwenden schließlich Gregs Lösung, um den Divisor zu erzeugen. Wir sortieren sie und geben sie zurück.
Ich habe es getestet und es scheint etwas schneller zu sein als die vorherige Version. Ich habe es als Teil eines größeren Programms getestet, daher kann ich nicht wirklich sagen, wie viel es schneller ist.
Pietro Speroni (pietrosperoni dot it)
PS: Es ist das erste Mal, dass ich auf Stackoverflow poste. Ich freue mich auf Feedback.
quelle
Angepasst an CodeReview ist hier eine Variante, die funktioniert
num=1
!quelle
NameError: global name 'prime_factors' is not defined
. Keine der anderen Antworten oder die ursprüngliche Frage definieren, was dies bewirkt.Hier ist eine intelligente und schnelle Möglichkeit, dies für Zahlen bis und um 10 ** 16 in reinem Python 3.6 zu tun.
quelle
Ich werde nur eine leicht überarbeitete Version von Anivarths (da ich glaube, dass es die pythonischste ist) als zukünftige Referenz hinzufügen.
quelle
Alte Frage, aber hier ist meine Meinung:
Sie können Proxy mit:
HINWEIS: Für Sprachen, die dies unterstützen, kann dies rekursiv sein.
quelle
Unter der Annahme, dass die
factors
Funktion die Faktoren von n zurückgibt (z. B.factors(60)
die Liste [2, 2, 3, 5]), ist hier eine Funktion zum Berechnen der Teiler von n :quelle
Hier ist meine Lösung. Es scheint dumm zu sein, funktioniert aber gut ... und ich habe versucht, alle richtigen Teiler zu finden, also begann die Schleife bei i = 2.
quelle
Wenn Sie sich nur für die Verwendung von Listenverständnissen interessieren und nichts anderes für Sie wichtig ist!
quelle
quelle
Für mich funktioniert das gut und ist auch sauber (Python 3)
Nicht sehr schnell, gibt aber Teiler Zeile für Zeile zurück, wie Sie möchten. Sie können auch list.append (n) und list.append (number) ausführen, wenn Sie dies wirklich möchten
quelle