diff --git a/ipython/EulerProblem035.html b/ipython/EulerProblem035.html new file mode 100644 index 0000000..06910be --- /dev/null +++ b/ipython/EulerProblem035.html @@ -0,0 +1,373 @@ + + +
+ + +The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
+There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
+How many circular primes are there below one million?
+ +First we get all primes into a look-up table. Then we iterate them and check whether they are circular.
+ +def get_primes_smaller(number):
+ primes = []
+ prospects = [n for n in range(2, number)]
+ while prospects:
+ p = prospects[0]
+ prospects = [x for x in prospects if x % p != 0]
+ primes.append(p)
+ if p * p > number:
+ return primes + prospects
+ return primes
+
+ps = get_primes_smaller(1000000)
+def get_combinations(xs):
+ if not xs:
+ return []
+ rs = []
+ for i in range(len(xs)):
+ yss = get_combinations(xs[:i] + xs[i + 1:])
+ if not yss:
+ rs.append(xs[i])
+ for ys in yss:
+ rs.append(xs[i] + ys)
+ return rs
+
+assert(get_combinations("ab") == ["ab", "ba"])
+from itertools import permutations
+prime_set = set(ps)
+
+def is_circular(p):
+ cs = permutations(str(p))
+ for c in cs:
+ if not int("".join(c)) in prime_set:
+ return False
+ return True
+
+assert(is_circular("2") == True)
+assert(is_circular("11") == True)
+assert(is_circular("47") == False)
+s = len([p for p in ps if is_circular(p)])
+print("False solution {}".format(s))
+We did not read the problem properly. Cycles are obviously not the same as permutations. If we change that we should get the solution in no time.
+ +def cyles(xs):
+ if len(xs) <= 1:
+ return xs
+ return [xs[i:] + xs[:i] for i in range(len(xs))]
+
+prime_set = set(ps)
+
+def is_circular(p):
+ cs = cyles(str(p))
+ for c in cs:
+ if not int("".join(c)) in prime_set:
+ return False
+ return True
+s = len([p for p in ps if is_circular(p)])
+s
+