Solve problem 111 and fix bug in lib prime.
parent
bf3732794a
commit
fd4ff495d9
|
@ -0,0 +1,46 @@
|
|||
from lib_prime import is_prime_rabin_miller as is_prime
|
||||
|
||||
|
||||
def get_permutations(number: str, number_permutations: int, start_index = 0):
|
||||
""" Returns number permutated at number_permutations locations. """
|
||||
if number_permutations == 0:
|
||||
yield int(number)
|
||||
else:
|
||||
numbers = list("0123456789")
|
||||
base = list(str(number))
|
||||
for i in range(start_index, len(base)):
|
||||
digit_stored = base[i]
|
||||
for n in numbers:
|
||||
if n == digit_stored:
|
||||
continue
|
||||
base[i] = n
|
||||
if base[0] == "0":
|
||||
continue
|
||||
for p in get_permutations("".join(base), number_permutations - 1, i):
|
||||
yield p
|
||||
base[i] = digit_stored
|
||||
|
||||
|
||||
def euler_111():
|
||||
result = 0
|
||||
n = 10
|
||||
for d in range(10):
|
||||
subresult = 0
|
||||
base = "".join([str(d) for _ in range(n)])
|
||||
for p in get_permutations(base, 1):
|
||||
if is_prime(p):
|
||||
subresult += p
|
||||
if subresult == 0:
|
||||
# d in [0, 2, 8] requires two permutations to yield at least one prime
|
||||
for p in get_permutations(base, 2):
|
||||
if is_prime(p):
|
||||
subresult += p
|
||||
assert subresult > 0, "More than to permutations required to yield prime"
|
||||
result += subresult
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = euler_111()
|
||||
print("e111.py: " + str(solution))
|
||||
assert(solution == 612407567715)
|
|
@ -68,6 +68,11 @@ def is_prime(n):
|
|||
|
||||
def is_prime_rabin_miller(number):
|
||||
""" Rabin-Miller Primality Test """
|
||||
witnesses = [2, 3, 5, 7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 47, 53]
|
||||
|
||||
if number in witnesses:
|
||||
return True
|
||||
|
||||
if number % 6 not in [1,5]:
|
||||
return False
|
||||
|
||||
|
@ -76,7 +81,7 @@ def is_prime_rabin_miller(number):
|
|||
s //= 2
|
||||
r += 1
|
||||
|
||||
for witness in [2, 3, 5, 7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 47, 53]:
|
||||
for witness in witnesses:
|
||||
remainder = pow(witness, s, number)
|
||||
if remainder == 1:
|
||||
continue
|
||||
|
|
Loading…
Reference in New Issue