joylintp

crt.py

Jan 23rd, 2021 (edited)
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.03 KB | None | 0 0
  1. from decimal import Decimal, getcontext
  2. getcontext().prec = 500
  3. # copied from some site
  4. def bezout(a, b):
  5.     # Apply the Extended Euclidean Algorithm
  6.     u1, v1, r1 = 1, 0, a
  7.     u2, v2, r2 = 0, 1, b
  8.  
  9.     while r2:
  10.         q = r1 // r2
  11.         u1, u2 = u2, u1-q*u2
  12.         v1, v2 = v2, v1-q*v2
  13.         r1, r2 = r2, r1-q*r2
  14.         assert u1*a + v1*b == r1
  15.         assert u2*a + v2*b == r2
  16.  
  17.     if r1 < 0:
  18.         u1, v1, r1 = -u1, -v1, -r1
  19.  
  20.     return (u1, v1, r1)
  21.  
  22. def crt(cong1, cong2):
  23.     # Apply the Chinese Remainder Theorem
  24.     a1, n1 = cong1
  25.     a2, n2 = cong2
  26.     c1, c2, g = bezout(n1, n2)
  27.     assert n1*c1 + n2*c2 == g
  28.    
  29.     if (a1 - a2) % g != 0:
  30.         raise ValueError(f"Incompatible congruences {cong1} and {cong2}.")
  31.    
  32.     lcm = n1 // g * n2
  33.     rem = (a1*c2*n2 + a2*c1*n1)//g
  34.     return rem % lcm, lcm
  35.  
  36.  
  37.  
  38. R = 0
  39. M = 1
  40. while True:
  41.     try:
  42.         m, r = [int(t) for t in input().split()]
  43.         R, M = crt((r, m), (R, M))
  44.     except EOFError:
  45.         break
  46.  
  47. print(Decimal(R).sqrt())
Advertisement
Add Comment
Please, Sign In to add comment