Intro
Betrachten Sie den Prozess, bei dem eine positive ganze Zahl n in einer Basis b genommen und jede Ziffer durch ihre Darstellung in der Basis der Ziffer rechts ersetzt wird.
- Wenn die Ziffer rechts eine 0 ist, verwenden Sie die Basis b .
- Wenn die Ziffer rechts eine 1 ist, verwenden Sie unär mit Nullen als Strichmarkierungen.
- Wenn sich rechts keine Ziffer befindet (dh Sie befinden sich an der richtigen Stelle), wechseln Sie zur höchstwertigen Ziffer.
Als Beispiel sei n = 160 und b = 10. Das Ausführen des Prozesses sieht folgendermaßen aus:
The first digit is 1, the digit to the right is 6, 1 in base 6 is 1.
The next digit is 6, the digit to the right is 0, 0 is not a base so use b, 6 in base b is 6.
The last digit is 0, the digit to the right (looping around) is 1, 0 in base 1 is the empty string (but that's ok).
Concatenating '1', '6', and '' together gives 16, which is read in the original base b = 10.
Das genau gleiche Verfahren, aber das Bewegen nach links statt nach rechts kann auch durchgeführt werden:
The first digit is 1, the digit to the left (looping around) is 0, 0 is not a base so use b, 1 in base b is 1.
The next digit is 6, the digit to the left is 1, 6 in base 1 is 000000.
The last digit is 0, the digit to the left is 6, 0 in base 6 is 0.
Concatenating '1', '000000', and '0' together gives 10000000, which is read in the original base b = 10.
Daher haben wir zwei Zahlen für 160 (für b = 10) erstellt: 16 und 10000000.
Wir werden n als eine listige Zahl definieren, wenn sie mindestens eine der beiden in diesem Prozess erzeugten Zahlen gleichmäßig in zwei oder mehr Teile aufteilt
Im Beispiel ist n schlau, weil 160 10000000 genau 62500 mal teilt.
203 ist NICHT schlau, da die resultierenden Zahlen 2011 und 203 selbst sind, die 203 nicht gleichmäßig in zwei oder mehr Male passen können.
Herausforderung
(Für den Rest des Problems betrachten wir nur b = 10.)
Die Herausforderung besteht darin, ein Programm zu schreiben, das die höchste schlauen Zahl findet, die auch eine Primzahl ist.
Die ersten 7 schlauen Primzahlen (und alles, was ich bisher gefunden habe) sind:
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Ich bin mir offiziell nicht sicher, ob es noch mehr gibt, aber ich gehe davon aus, dass dies der Fall ist. Wenn Sie beweisen können, dass es endlich viele gibt (oder nicht), gebe ich Ihnen +200 Kopfgeld-Repräsentanten.
Der Gewinner wird die Person sein, die die höchste schlauen Primzahl liefern kann, vorausgesetzt, es ist offensichtlich, dass sie bei der Suche aktiv war und nicht absichtlich Ruhm von anderen nimmt.
Regeln
- Sie können alle gewünschten Suchwerkzeuge verwenden.
- Sie können probabilistische Primetester verwenden.
- Sie können den Code anderer Personen mit Namensnennung wiederverwenden . Dies ist eine gemeinsame Anstrengung. Cutthroat-Taktiken werden nicht toleriert.
- Ihr Programm muss aktiv nach der Primzahl suchen. Sie können Ihre Suche am höchsten bekannten schlauen Prime beginnen.
- Ihr Programm sollte in der Lage sein, alle bekannten schlauen Primzahlen innerhalb von 4 Stunden nach Amazon EC2 t2.medium-Instanzen zu berechnen (entweder vier auf einmal oder eine für vier Stunden oder etwas dazwischen). Ich werde es nicht wirklich an ihnen testen und du musst es bestimmt nicht. Dies ist nur ein Maßstab.
Hier ist mein Python 3-Code, den ich zum Generieren der obigen Tabelle verwendet habe: (läuft in ein oder zwei Sekunden)
import pyprimes
def toBase(base, digit):
a = [
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
['', '0', '00', '000', '0000', '00000', '000000', '0000000', '00000000', '000000000' ],
['0', '1', '10', '11', '100', '101', '110', '111', '1000', '1001'],
['0', '1', '2', '10', '11', '12', '20', '21', '22', '100'],
['0', '1', '2', '3', '10', '11', '12', '13', '20', '21'],
['0', '1', '2', '3', '4', '10', '11', '12', '13', '14'],
['0', '1', '2', '3', '4', '5', '10', '11', '12', '13'],
['0', '1', '2', '3', '4', '5', '6', '10', '11', '12'],
['0', '1', '2', '3', '4', '5', '6', '7', '10', '11'],
['0', '1', '2', '3', '4', '5', '6', '7', '8', '10']
]
return a[base][digit]
def getCrafty(start=1, stop=100000):
for p in pyprimes.primes_above(start):
s = str(p)
left = right = ''
for i in range(len(s)):
digit = int(s[i])
left += toBase(int(s[i - 1]), digit)
right += toBase(int(s[0 if i + 1 == len(s) else i + 1]), digit)
left = int(left)
right = int(right)
if (left % p == 0 and left // p >= 2) or (right % p == 0 and right // p >= 2):
print(p, left, right)
if p >= stop:
break
print('DONE')
getCrafty()