Solve problem 111 and fix bug in lib prime.

main
felixm 2023-10-01 20:19:41 +02:00
parent bf3732794a
commit fd4ff495d9
2 changed files with 52 additions and 1 deletions

46
python/e111.py Normal file
View File

@ -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)

View File

@ -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