Solve problem 274
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
from math import gcd
|
||||
from lib_prime import primes
|
||||
from lib_misc import modinv
|
||||
|
||||
|
||||
def find_m(p: int) -> int:
|
||||
rs = []
|
||||
test_n = p * 1337
|
||||
for m in range(1, p):
|
||||
test_f = f(test_n, m)
|
||||
if test_f % p == 0:
|
||||
rs.append(m)
|
||||
assert len(rs) == 1
|
||||
return rs[0]
|
||||
|
||||
|
||||
def calc_m(p: int) -> int:
|
||||
"""
|
||||
(n // 10 + (n % 10) * m) % p == 0
|
||||
a + b * m == 0 (mod p)
|
||||
b * m == -a (mod p)
|
||||
m == -a * b**-1 (mod p)
|
||||
"""
|
||||
n = p * 1337
|
||||
a = n // 10
|
||||
b = (n % 10)
|
||||
m = -a * modinv(b, p)
|
||||
m %= p
|
||||
return m
|
||||
|
||||
|
||||
def f(n: int, m: int = 34) -> int:
|
||||
left = n // 10
|
||||
right = n % 10 * m
|
||||
r = left + right
|
||||
return r
|
||||
|
||||
|
||||
def euler_274():
|
||||
ps = primes(10**7)
|
||||
sum_m = 0
|
||||
for p in ps:
|
||||
if gcd(p, 10) != 1:
|
||||
continue
|
||||
m = calc_m(p)
|
||||
if p < 1000:
|
||||
m_naiv = find_m(p)
|
||||
assert m == m_naiv
|
||||
sum_m += m
|
||||
return sum_m
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = euler_274()
|
||||
print(f"e274.py: {solution}")
|
||||
assert solution == 1601912348822
|
||||
|
||||
Reference in New Issue
Block a user