from collections import deque
import re
def gen_primes(limit): # PE-35 by stackoverflow.com/users/5771269/cdlane,
D = {} # from stackoverflow.com/a/37264397,
q = 3 # optimized
yield 2
while q <= limit:
if q not in D:
yield q
D[q * q] = [2*q]
else:
for d in D[q]:
D.setdefault(q + d, []).append(d)
del D[q]
q += 2 # here
def exclude_primes(primes): # from stackoverflow.com/a/37265787/849891
regex = re.compile("[024568]")
included_primes = [p for p in primes
if p < 10 or regex.search(str(p)) is None]
return included_primes
def circular_list(limit):
cnt = 0 # here
#primes = set(gen_primes(limit)) # here 1.35 secs
primes = set(exclude_primes(gen_primes(limit))) # here 1.18s
for prime in primes:
string = str(prime)
digits = deque(string)
for rotation in range(1, len(string)):
digits.rotate(1)
if int("".join(digits)) not in primes:
break
else:
# print((cnt, prime)) ,
cnt = cnt + 1 # here
return cnt # and here
print(circular_list(1000000))
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKaW1wb3J0IHJlCgpkZWYgZ2VuX3ByaW1lcyhsaW1pdCk6ICMgUEUtMzUgYnkgc3RhY2tvdmVyZmxvdy5jb20vdXNlcnMvNTc3MTI2OS9jZGxhbmUsCiAgICBEID0ge30gICAgICAgICAgICAgIyAgZnJvbSBzdGFja292ZXJmbG93LmNvbS9hLzM3MjY0Mzk3LAogICAgcSA9IDMgICAgICAgICAgICAgICMgICBvcHRpbWl6ZWQgIAogICAgeWllbGQgMgogICAgd2hpbGUgcSA8PSBsaW1pdDoKICAgICAgICBpZiBxIG5vdCBpbiBEOgogICAgICAgICAgICB5aWVsZCBxCiAgICAgICAgICAgIERbcSAqIHFdID0gWzIqcV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgZCBpbiBEW3FdOgogICAgICAgICAgICAgICAgRC5zZXRkZWZhdWx0KHEgKyBkLCBbXSkuYXBwZW5kKGQpCiAgICAgICAgICAgIGRlbCBEW3FdICAgICAgIAogICAgICAgIHEgKz0gMiAgICAgICAgICAgICAgIyBoZXJlCiAgICAgICAgCmRlZiBleGNsdWRlX3ByaW1lcyhwcmltZXMpOiAgICAgICAgICAjIGZyb20gc3RhY2tvdmVyZmxvdy5jb20vYS8zNzI2NTc4Ny84NDk4OTEKICAgIHJlZ2V4ID0gcmUuY29tcGlsZSgiWzAyNDU2OF0iKQogICAgaW5jbHVkZWRfcHJpbWVzID0gW3AgZm9yIHAgaW4gcHJpbWVzICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwIDwgMTAgb3IgcmVnZXguc2VhcmNoKHN0cihwKSkgaXMgTm9uZV0KICAgIHJldHVybiBpbmNsdWRlZF9wcmltZXMKCmRlZiBjaXJjdWxhcl9saXN0KGxpbWl0KToKICAgIGNudCA9IDAgICAgICAgICAgICAgICAgICAgICAgIyBoZXJlCiAgICAKICAgICNwcmltZXMgPSBzZXQoZ2VuX3ByaW1lcyhsaW1pdCkpICAgICAgIyBoZXJlICAgICAgMS4zNSBzZWNzCiAgICBwcmltZXMgPSBzZXQoZXhjbHVkZV9wcmltZXMoZ2VuX3ByaW1lcyhsaW1pdCkpKSAgICMgaGVyZSAgICAxLjE4cwogICAgCiAgICBmb3IgcHJpbWUgaW4gcHJpbWVzOgogICAgICAgIHN0cmluZyA9IHN0cihwcmltZSkKICAgICAgICBkaWdpdHMgPSBkZXF1ZShzdHJpbmcpCgogICAgICAgIGZvciByb3RhdGlvbiBpbiByYW5nZSgxLCBsZW4oc3RyaW5nKSk6CiAgICAgICAgICAgIGRpZ2l0cy5yb3RhdGUoMSkKCiAgICAgICAgICAgIGlmIGludCgiIi5qb2luKGRpZ2l0cykpIG5vdCBpbiBwcmltZXM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgcHJpbnQoKGNudCwgcHJpbWUpKSAsCiAgICAgICAgICAgIGNudCA9IGNudCArIDEgICAgICAgICAgICAgICAjIGhlcmUKCiAgICByZXR1cm4gY250ICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBoZXJlCgpwcmludChjaXJjdWxhcl9saXN0KDEwMDAwMDApKQ==