Advertisement
Guest User

findFirstHitFast

a guest
Nov 27th, 2013
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.75 KB | None | 0 0
  1. def gcd(a, b):
  2. return a if b == 0 else gcd(b, a % b)
  3.  
  4. def egcd(a, b):
  5. x,y, u,v = 0,1, 1,0
  6. while a != 0:
  7. q,r = b//a,b%a; m,n = x-u*q,y-v*q
  8. b,a, x,y, u,v = a,r, u,v, m,n
  9. return b, x, y
  10.  
  11. def modinv(a, m):
  12. g, x, y = egcd(a, m)
  13. if g != 1:
  14. return None # modular inverse does not exist
  15. else:
  16. return x % m
  17.  
  18. precision = 1 << 20
  19. def findFirstHitFast(a, b, c, d):
  20. a = long(a * precision)
  21. b = long(b * precision)
  22. c = long(c * precision)
  23. d = long(d * precision)
  24. m = gcd(b, c)
  25. k = (c-a) / m + 1
  26. s = b / m
  27. t = c / m
  28. inverse_s = modinv(s, t)
  29. n = k * inverse_s % t if inverse_s else precision
  30. print a, b, c, d, m, k, s, t, inverse_s, n
  31. return n
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement