Solve more problems road to 200.
This commit is contained in:
38
python/e188.py
Normal file
38
python/e188.py
Normal file
@@ -0,0 +1,38 @@
|
||||
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
|
||||
Reference in New Issue
Block a user