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