39 lines
804 B
Python
39 lines
804 B
Python
from lib_prime import prime_factors
|
|
|
|
|
|
def phi(n):
|
|
# Calculate phi using Euler's totient function
|
|
c = n
|
|
fs = set(prime_factors(n))
|
|
for f in fs:
|
|
# same as c *= (1 - 1/f)
|
|
c *= (f - 1)
|
|
c //= f
|
|
return c
|
|
|
|
|
|
def tetmod(a, k, m):
|
|
# https://stackoverflow.com/questions/30713648/how-to-compute-ab-mod-m
|
|
assert k > 0
|
|
if k == 1:
|
|
return a
|
|
if m == 1:
|
|
if a % 2 == 0:
|
|
return 0
|
|
else:
|
|
return 1
|
|
phi_m = phi(m)
|
|
return pow(a, phi_m + tetmod(a, k - 1, phi_m), m)
|
|
|
|
|
|
def euler_188():
|
|
assert phi(100) == 40
|
|
assert tetmod(14, 2016, 100) == 36
|
|
return tetmod(1777, 1855, 10**8)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
solution = euler_188()
|
|
print("e188.py: " + str(solution))
|
|
assert solution == 95962097
|