Zufällige Primzahl in python
Ich habe momentan ↓ gesetzt als meine randprime(p,q)
Funktion. Gibt es eine Möglichkeit, verdichten diese, über so etwas wie eine genexp oder listcomp? Hier ist meine Funktion:
n = randint(p, q)
while not isPrime(n):
n = randint(p, q)
Es scheint, wie es wäre besser, um eine Liste der Primzahlen zwischen
Sie können Ihre Chancen erhöhen, eine Zahl als Primzahl, durch die Einstellung der niedrigste bit auf 1, somit wird es seltsam - es gibt nur noch prime, die 2. In der Tat, alle prim zahlen außer 2 und 3 sind entweder unten, oder oben, ein Vielfaches von sechs.
Ich hasse es, wenn jemand downvote eine Frage, ohne zu sagen, warum denn die OP kann es nicht reparieren, wenn er nicht weiß, was falsch ist.
das hängt von der Größe der p & q. Für große zahlen, das wäre effizienter. Auch, wenn Sie tun eine Anzahl Sieb (einfachste Möglichkeit der Generierung von Primzahlen), dann müssen Sie starten bei 1.
Bitte Liebe Leute, die Frage fehlt Spezifität und viel hin-und-her hier Ergebnisse aus. Könntest du bitte die Schuld, statt andere Antwort?
p
und q
und wählen Sie dann zufällig eines aus dieser Liste.Sie können Ihre Chancen erhöhen, eine Zahl als Primzahl, durch die Einstellung der niedrigste bit auf 1, somit wird es seltsam - es gibt nur noch prime, die 2. In der Tat, alle prim zahlen außer 2 und 3 sind entweder unten, oder oben, ein Vielfaches von sechs.
Ich hasse es, wenn jemand downvote eine Frage, ohne zu sagen, warum denn die OP kann es nicht reparieren, wenn er nicht weiß, was falsch ist.
das hängt von der Größe der p & q. Für große zahlen, das wäre effizienter. Auch, wenn Sie tun eine Anzahl Sieb (einfachste Möglichkeit der Generierung von Primzahlen), dann müssen Sie starten bei 1.
Bitte Liebe Leute, die Frage fehlt Spezifität und viel hin-und-her hier Ergebnisse aus. Könntest du bitte die Schuld, statt andere Antwort?
InformationsquelleAutor PolarBearITS | 2015-01-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es besser, generieren Sie einfach die Liste der Primzahlen, und wählen Sie dann aus dieser Zeile.
Wie es ist, mit dem code gibt es die geringe chance, dass es auf einer Endlosschleife, entweder, wenn es keine Primzahlen im Intervall oder wenn
randint
greift immer dann ein non-prime dann diewhile
Schleife wird niemals enden.Also ist das wohl kürzer und weniger mühsam:
Der andere Vorteil von diesem ist, gibt es keine Möglichkeit von Deadlocks, wenn es keine Primzahlen im Intervall. Wie gesagt das kann langsam sein, je nach Bandbreite, so dass es schneller wäre, wenn Sie zwischengespeicherte die Primzahlen vor der Zeit:
Wieder, weitere Optimierungen sind möglich, sind aber sehr stark abhängig von Ihrer eigentlichen code... und Sie wissen, was Sie sagen, über die vorzeitige Optimierungen.
Ich denke, dass, wenn es irgendwelche Primzahlen zwischen
p
undq
es wird deadlock-sicher.Gut, vermutlich würden Sie das Zwischenspeichern der
isPrime
prüfen, oder haben eine vordefinierte Liste aus zu arbeiten.nicht unbedingt. Beim arbeiten mit großen Primzahlen (z.B. für RSA-Verschlüsselung), der übliche Weg ist, zu überprüfen, eine kleine Anzahl, und verwenden Sie dann eine statistische Methode - siehe en.wikipedia.org/wiki/Primality_test#Probabilistic_tests (da ein vollständiger test würde viel zu Jahren für einen 2048-bit-Primzahl) - jeder test auf eine Primzahl erfolgreich sein wird, und jeder test auf einer nicht-Premium hat eine 50% chance, zu zeigen, dass die Zahl nicht prim. Entscheiden Sie, wie gering eine Wahrscheinlichkeit, die Sie wollen, und führen Sie die entsprechende Anzahl von tests.
Die Menschen sind einfach nur wild Annahmen über Verschlüsselung und verrückt großen zahlen. Dies könnte ein undergrad ersten Jahr Programmierung in Frage.
InformationsquelleAutor
Also wäre es toll, wenn könnten Sie verwenden einen iterator zu geben, die die ganzen zahlen von p zu q in zufälliger Reihenfolge (ohne Ersatz). Ich habe nicht in der Lage, einen Weg zu finden, das zu tun. Im folgenden erhalten zufällige Ganzzahlen in diesem Bereich und überspringen alles, was es bereits getestet.
Der große Vorteil ist, wenn Sie sagen, der Bereich, den Sie testen wollen, ist nur (14,15), die Ihr code ausführen würde, für immer. Dieser code wird garantiert, um zu produzieren eine Antwort, wenn eine solche Primzahl existiert, und sagen Sie es nicht, wenn eine solche Primzahl existiert nicht. Sie können offensichtlich machen dieses kompakte, aber ich werde versuchen zu zeigen, die Logik.
code von OP ist 3 Linien, aber es wird deadlock, wenn es keine Primzahlen zwischen p und q, so dass es unsicher ist.
Es war mir, und ich habe Sie abgelehnt, weil Ihre Antwort, während die Einführung von etwas sinnvoll ist, ist das GENAUE GEGENTEIL von dem, was wurde gefragt -
Is there any way to condense this
. Ich habe Kredit geben, dass das Teil nicht mir. Es war nicht der Grund meiner Antwort, nur eine Fußnote. Sie sind herzlich eingeladen zu übernehmen, meinen code in deine Antwort als Fußnote (oder Vorstellungen davon).Fein - code ist eine Zeile, aber es ist immer noch fast 2 mal so viele Zeichen, wie der ursprüngliche code, erfordert den Import itertools, und nicht, lösen den bug. Ist, die kondensiert? Nehmen Sie das Stück von meinem code die Beseitigung der Fehler und mein code ist im wesentlichen die gleiche Länge (in Zeichen) wie bei Ihnen.
Mein code arbeitet mit p=14,f=15 und ist viel kürzer und hat keine deadlocks...
InformationsquelleAutor Joel
Diese beginnt mit itertools.count() - dieser gibt eine unendliche Menge.
Jede Zahl, die zugeordnet wird, eine neue Zufallszahl im Bereich von itertools.imap(). imap ist wie die Karte, sondern liefert einen iterator statt einer Liste - wollen wir nicht eine Liste erstellen von inifinite Zufallszahlen!
Dann das erste übereinstimmende Nummer gefunden wird, und zurückgegeben.
Arbeitet effizient, selbst wenn p und q sind sehr weit auseinander liegen, z.B. 1 und 10**30, welche die Generierung einer vollständigen Liste nicht!
Durch die Art und Weise, dies ist nicht effizienter als dein code oben, und ist viel schwieriger zu verstehen, auf einen Blick - bitte haben Sie etwas Rücksicht für den nächsten Programmierer, zu Lesen, Ihre Codes, und tun Sie es einfach, wie Sie Tat vor. Dass die Programmierer vielleicht werden Sie in sechs Monaten, wenn Sie vergessen haben, was dieser code tun soll!
P. S - in der Praxis, möchten Sie vielleicht zu ersetzen, count() mit xrange (NICHT Spektrum!) z.B.
xrange((p-q)**1.5+20)
zu tun, nicht mehr als die Anzahl der versuche (symmetrisch zwischen begrenzten tests für kleine Bereiche und große Reichweiten, und hat nicht mehr als 1/2% chance, zu scheitern, wenn es gelingen könnte), sonst, so wurde vorgeschlagen, in einem anderen Beitrag, man könnte die Schleife für immer.PPS - Verbesserung: ersetzt
random.randint(p,q)
mitrandom.randint(p,q)|1
- dadurch wird der code doppelt so effizient, aber schließt die Möglichkeit aus, dass das Ergebnis 2.p**2
. Meine Letzte Antwort (gerade beschlossen) ist (q-p)**2. q-p ist wohl nicht genug; Wenn Sie zwei zahlen und einer von Ihnen ist ein Paradebeispiel (z.B. q=18 und p=19), dann haben Sie eine 25% chance des Scheiterns. Da die Bandbreite sich erhöht, die Chancen, die alle zahlen in der Reihe abnimmt (samplingrange
Zufallszahlen inrange
).Nachdem dies erledigt, einige auf die Jagd, eine sehr schlechte case-Szenario ist die Wahl p=1425172824437699411, und q=p+1475; in dieser Reihe von zahlen, es gibt nur eine Primzahl (und 1475 nicht-Primzahlen). Jeder hat eine 1475/1476 chance, eine nicht-Primzahl, so noch 1476 versucht hat eine 37% ige chance zu scheitern.
Eine weitere Berechnung zeigt, dass
(q-p)**2
versucht, kann nicht genug sein - für q=p+1 (wo p oder q ist eine Primzahl), gibt es eine 6% chance des Scheiterns für viele (=4) tests. Ich revidiere meine Antwort auf(q-p)**2+20
nur etwas langsamer, und arbeiten besser für kleine zahlen.InformationsquelleAutor AMADANON Inc.