Betrachten Sie die Funktion Remove(n, startIndex, count)
, mit der count
Ziffern n
von der Ziffer an der Position entfernt werden startIndex
. Beispiele:
Remove(1234, 1, 1) = 234
Remove(123456, 2, 3) = 156
Remove(1507, 1, 2) = 07 = 7
Remove(1234, 1, 4) = 0
Wir werden die Primzahl X als fragil bezeichnen, wenn jede mögliche Remove
Operation sie zu einer Nicht-Primzahl macht. Beispielsweise ist 80651 eine fragile Primzahl, da alle folgenden Zahlen keine Primzahlen sind:
651, 51, 1, 0, 8651, 851, 81, 8, 8051, 801, 80, 8061, 806, 8065
Tor
Schreiben Sie ein Programm, das die größte fragile Primzahl findet. Bearbeiten: Das Zeitlimit wurde entfernt, da es einen relativ fairen Weg gab, es zu umgehen.
Die Punktzahl ist die fragile Primzahl, die von Ihrem Programm gefunden wurde. Bei einem Gleichstand gewinnt die frühere Einreichung.
Regeln
- Sie können eine beliebige Sprache und Bibliotheken von Drittanbietern verwenden.
- Sie führen das Programm auf Ihrer eigenen Hardware aus.
- Sie können probabilistische Primalitätstests verwenden.
- Alles ist in der Basis 10.
Führende Einträge
- 6629 Ziffern von Qualtagh (Java)
- 5048 Ziffern von Emil (Python 2)
- 2268 Stellen von Jakube (Python 2)
Bearbeiten: Ich habe meine eigene Antwort hinzugefügt.
- 28164 Ziffern von Suboptimus Prime, basierend auf dem Qualtagh-Algorithmus (C #)
code-challenge
primes
Suboptimus Prime
quelle
quelle
Antworten:
Java -
314433226629 Stellen6 0{3314} 8969999
Diese Lösung basiert auf der Antwort von FryAmTheEggman .
Was ist, wenn wir tiefer graben?
Es wird eine Baumstruktur:
Nennen wir die Zahl R rechts zusammengesetzt, wenn R und alle seine Endungen zusammengesetzt sind.
Wir werden alle richtigen zusammengesetzten Zahlen in der Breite zuerst durchlaufen: 1, 9, 01, 81, 91, 09, 49, 69, 99, 001, 801, 901 usw.
Zahlen, die mit Null beginnen, werden nicht auf Primalität geprüft, sondern zum Aufbau weiterer Zahlen benötigt.
Wir werden nach einer Zielnummer N in der Form X00 ... 00R suchen, wobei X eine von 4, 6, 8 oder 9 ist und R die richtige Zusammensetzung ist. X kann keine Primzahl sein. X kann nicht 0 sein. Und X kann nicht 1 sein, denn wenn R mit 1 oder 9 endet, würde N 11 oder 19 enthalten.
Wenn XR nach dem Entfernen Primzahlen enthält, enthält XYR diese auch für jedes Y. Wir sollten also keine Zweige ab R durchlaufen.
Sei X eine Konstante, sagen wir 6.
Pseudocode:
Wir sollten die Anzahl der Nullen begrenzen, da es zu lange dauern kann, eine Primzahl in der Form X + Nullen + R zu finden (oder für immer, wenn alle zusammengesetzt sind).
Der wahre Code ist ziemlich ausführlich und kann hier gefunden werden .
Primalitätstests für Zahlen im Long-Int-Bereich werden mit der deterministischen Variante des Miller-Tests durchgeführt. Für BigInteger-Nummern wird zuerst eine Testdivision und dann ein BailliePSW-Test durchgeführt. Es ist wahrscheinlich, aber ziemlich sicher. Und es ist schneller als der Miller-Rabin-Test (wir sollten viele Iterationen für so große Zahlen in Miller-Rabin durchführen, um eine ausreichende Genauigkeit zu erzielen).
Bearbeiten: Der erste Versuch war falsch. Wir sollten auch Zweige ignorieren, die mit R beginnen, wenn X0 ... 0R Primzahl ist. Dann wäre X0 ... 0YR keine zerbrechliche Primzahl. Daher wurde eine zusätzliche Prüfung hinzugefügt. Diese Lösung scheint richtig zu sein.
Bearbeiten 2: Optimierung hinzugefügt. Wenn (X + R) durch 3 teilbar ist, ist (X + Nullen + R) auch durch 3 teilbar. Daher kann (X + Nullen + R) in diesem Fall keine Primzahl sein, und solche Rs können übersprungen werden.
Edit 3: Es war nicht notwendig, Primzahlen zu überspringen, wenn sie sich nicht an der letzten oder ersten Position befanden. Endungen wie 21 oder 51 sind also in Ordnung. Aber es ändert sich nicht viel.
Schlussfolgerungen:
quelle
Python 2 -
1261221133717192268 ZiffernEs gibt bei ungefähr len (n) ^ 2 resultierende Zahlen von Remove (n, startIndex, count). Ich habe versucht, diese Zahlen zu minimieren. Wenn viele Ziffern nebeneinander gleich sind, können viele dieser resultierenden Zahlen ignoriert werden, da sie mehrfach vorkommen.
Also habe ich es bis zum Äußersten genommen, nur 9s und ein wenig Blüte in der Mitte. Ich habe mir auch die fragile Primzahl unter 1 Million angesehen und festgestellt, dass es solche fragilen Primzahlen gibt. Die Suche nach Zahlen mit 2 9s am Ende funktioniert wirklich gut, ich weiß nicht warum. 1 Zahl, 3 oder 4 9s am Ende ergeben kleinere fragile Primzahlen.
Es wird das Pyprimes-Modul verwendet . Ich bin mir nicht sicher, ob es etwas Gutes ist. Es verwendet den miller_rabin-Test, ist also probabilistisch.
Das Programm findet diese 126-stellige fragile Primzahl in ungefähr 1 Minute und sucht für den Rest der Zeit erfolglos.
bearbeiten:
Hab gerade gesehen, dass du das Zeitlimit entfernt hast. Ich werde das Programm über Nacht laufen lassen, vielleicht tauchen einige wirklich große zerbrechliche Primzahlen auf.
2 bearbeiten:
Habe mein Originalprogramm schneller gemacht, also doch noch keine Lösung mit mehr als 126 Stellen. Also bin ich in den Zug gesprungen und habe nach x 9s + 1 Digit + y 9s gesucht. Der Vorteil ist, dass Sie O (n) -Nummern auf Primalität prüfen müssen, wenn Sie y korrigieren. Es findet einen 1221 ziemlich schnell.
3 bearbeiten:
Für die 2268-stellige Nummer verwende ich das gleiche Programm, nur die Arbeit auf mehrere Kerne aufgeteilt.
quelle
Python 2.7 - 429623069
99993799Bisher keine Optimierungen. Nur ein paar triviale Beobachtungen zu fragilen Primzahlen (dank Rainbolt im Chat):
Ich versuche nur, den Ball ins Rollen zu bringen :)
Dies dauert technisch gesehen etwas länger als 15 Minuten, prüft aber in der Verlängerung nur eine einzige Zahl.
is_prime
wird von hier genommen (isaacg hat es hier benutzt ) und ist probabilistisch.Nur eine Anmerkung, wenn ich damit anfange, stehe
n=429623069
ich auf482704669
. Die zusätzliche Ziffer scheint wirklich diese Strategie zu töten ...quelle
Python 2,
828 Stellen,5048 StellenWie @Jakube hervorhob, war die erste von mir eingereichte Primzahl aufgrund eines Fehlers in meinem Code nicht wirklich zerbrechlich. Das Beheben des Fehlers war einfach, aber der Algorithmus wurde dadurch erheblich langsamer.
Ich beschränkte mich auf eine leicht durchsuchbare Untermenge der fragilen Primzahlen, nämlich jene, die nur aus der Ziffer 9 und genau einer Ziffer 7 bestehen.
Ich habe dieselbe
is_prime
Funktion (von hier aus ) wie @FryAmTheEggman verwendet.Bearbeiten:
Ich habe zwei Änderungen vorgenommen, um den Algorithmus zu beschleunigen:
Ich versuche, so viele Primalitätsprüfungen wie möglich zu überspringen und erst dann zurückzukehren, wenn eine potenzielle fragile Primzahl gefunden wurde, um sicherzustellen, dass sie wirklich fragil ist. Es gibt eine kleine Anzahl von doppelten Schecks, deshalb habe ich die Funktion zur Prüfung der Primzahlen grob auswendig gelernt.
Für die Anzahl der Formulare habe
b*'9' + '7' + c*'9'
ich die Größe von begrenztb
. Je niedriger die Grenze, desto weniger Zahlen müssen überprüft werden, aber die Wahrscheinlichkeit steigt, dass keine großen fragilen Primzahlen gefunden werden. Ich habe 222 willkürlich als Grenze gewählt.Bei ein paar tausend Stellen kann eine einzelne Primzahlprüfung bereits einige Sekunden dauern. Daher kann ich mit diesem Ansatz wahrscheinlich nicht viel besser umgehen.
Bitte zögern Sie nicht, die Richtigkeit meiner Angaben zu überprüfen. Aufgrund der probabilistischen Primalitätsprüfung könnte meine Zahl theoretisch keine Primzahl sein, aber wenn ja, sollte sie fragil sein. Oder ich habe etwas falsch gemacht. :-)
quelle
C #,
1003928164 ZiffernBearbeiten: Ich habe ein anderes Programm basierend auf dem Qualtagh-Algorithmus mit einigen geringfügigen Änderungen erstellt:
Alte Antwort:
Dies sind einige bemerkenswerte Muster für fragile Primzahlen:
wobei X 1, 2, 4, 5, 7 oder 8 sein kann.
Für solche Zahlen müssen wir nur (Länge - 1) mögliche
Remove
Operationen berücksichtigen . Die anderenRemove
Operationen erzeugen entweder Duplikate oder offensichtlich zusammengesetzte Zahlen. Ich habe versucht, nach solchen Zahlen mit bis zu 800 Ziffern zu suchen, und festgestellt, dass 4 Muster häufiger auftreten als die anderen: 8007001, 8004001, 9997999 und 6004009. Da Emil und Jakube das Muster 999X999 verwenden, habe ich mich für 8004001 entschieden etwas Abwechslung hinzufügen.Ich habe dem Algorithmus die folgenden Optimierungen hinzugefügt:
quelle
Haskell -
1220- 1277 Stellen für echte Reals wurden korrigiertBesser eins - 1277 Stellen
Haskell-Code
quelle