197 est appelé un nombre premier cyclique, car les nombres 197, 971, 719 obtenus en faisant tourner les chiffres sont tous des nombres premiers.
Moins de 100 a 13 nombres premiers cycliques: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79 et 97.
Combien de nombres premiers mobiles sont inférieurs à 1 million? http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2035
0,2,4,5,6,8 ne sont pas inclus dans les chiffres des nombres premiers cycliques à deux chiffres ou plus. En effet, lorsque ces nombres sont dans le premier chiffre, ils sont toujours divisibles par 2 ou 5. Par conséquent, à part 2,5, nous devrions considérer les nombres qui incluent seulement 1,3,7,9. Afin de créer ce nombre d'ensembles, j'ai créé une fonction appelée mapall. mapall est une fonction qui combine chaque élément e1 et e2 d'un certain ensemble iter1 pour le nombre de fois num spécifié par une règle de couplage appropriée f et renvoie le résultat sous la forme d'un type d'ensemble. Tout d'abord, en utilisant ['', 1,3,7,9] comme iter1, j'ai créé un nombre à 6 chiffres qui est considéré comme le plus grand. '' Est inclus de telle sorte que lorsqu'ils sont combinés, les éléments de la liste d'origine restent dans la liste combinée. Par exemple, "+" 3 "devient" 3 "et les éléments de la liste d'origine resteront dans la liste combinée.
import mymath
def circle(num):
s = str(num)
for c in range(len(s)):
s = s[1:]+s[0]
yield int(s)
def mapall(f, iter1, num=1):
ret = iter1
for i in range(num):
ret = set([f(e1,e2) for e1 in ret for e2 in iter1])
return ret
def connect_num(e1,e2):
return str(e1)+str(e2)
def main():
pri = mymath.get_primes(10**6)
n_list = ['',1,3,7,9]
pn5 = mapall(connect_num, n_list,5)
pn5.remove('')
ans = {}
for pn in pn5:
if pn in ans:
continue
flag = True
for n in circle(pn):
if not pri['bool'][n]:
flag = False
break
if flag:
for n in circle(pn):
ans[n] = True
print len(ans)+2
main()
Recommended Posts