Intro
Considérons le processus consistant à prendre un entier positif n dans une base b et à remplacer chaque chiffre par sa représentation dans la base du chiffre à droite.
- Si le chiffre à droite est un 0, utilisez la base b .
- Si le chiffre à droite est un 1, utilisez unaire avec 0 comme marque de pointage.
- S'il n'y a pas de chiffre à droite (c'est-à-dire que vous êtes à la place), faites une boucle vers le chiffre le plus significatif.
À titre d'exemple, n = 160 et b = 10. L'exécution du processus ressemble à ceci:
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.
La même procédure exacte mais se déplaçant vers la gauche au lieu de la droite peut également être effectuée:
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.
Ainsi, nous avons fait deux nombres liés à 160 (pour b = 10): 16 et 10000000.
Nous définirons n comme un nombre astucieux s'il divise également au moins l'un des deux nombres générés dans ce processus en 2 parties ou plus.
Dans l'exemple n est astucieux car 160 divise 10000000 exactement 62500 fois.
203 n'est PAS astucieux car les chiffres résultants sont 2011 et 203 lui-même, qui 203 ne peuvent pas se répartir uniformément en 2 fois ou plus.
Défi
(Pour le reste du problème, nous ne considérerons que b = 10.)
Le défi est d'écrire un programme qui trouve le plus haut nombre astucieux qui est également premier.
Les 7 premiers nombres premiers astucieux (et tout ce que j'ai trouvé jusqu'à présent) sont:
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Je ne suis pas officiellement certain qu'il en existe d'autres, mais je m'attends à ce qu'ils existent. Si vous pouvez prouver qu'il y en a (ou qu'il n'y en a pas) en nombre fini, je vous donnerai +200 représentants de primes.
Le gagnant sera la personne qui peut fournir le plus haut astuce astucieux, à condition qu'il soit évident qu'ils ont été actifs dans la recherche et ne prennent pas intentionnellement la gloire des autres.
Règles
- Vous pouvez utiliser tous les outils de recherche de choix que vous souhaitez.
- Vous pouvez utiliser des testeurs principaux probabilistes.
- Vous pouvez réutiliser le code d' autres personnes avec attribution . Il s'agit d'un effort commun. Les tactiques acharnées ne seront pas tolérées.
- Votre programme doit rechercher activement le premier. Vous pouvez commencer votre recherche au plus haut astucieux astuce connu.
- Votre programme devrait être capable de calculer tous les nombres premiers astucieux connus dans les 4 heures suivant les instances d' Amazon EC2 t2.medium (soit quatre à la fois, soit une pendant quatre heures ou quelque chose entre les deux). Je ne vais pas vraiment le tester sur eux et vous n'avez certainement pas besoin de le faire. Ceci est juste une référence.
Voici mon code Python 3 que j'ai utilisé pour générer le tableau ci-dessus: (s'exécute dans une seconde ou deux)
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()