parameters: (k, p)
return_statement: return x % p
docstring: Returns the inverse of k modulo p.
  
      This function returns the only integer x such that (x * k) % p == 1.
  
      k must be non-zero and p must be a prime.
docstring_summary: Returns the inverse of k modulo p.
docstring_tokens: Returns the inverse of k modulo p .
function: def inverse_mod(k, p):
      """Returns the inverse of k modulo p.
  
      This function returns the only integer x such that (x * k) % p == 1.
  
      k must be non-zero and p must be a prime.
      """
      if k == 0:
          raise ZeroDivisionError("division by zero")
  
      if k < 0:
          # k ** -1 = p - (-k) ** -1  (mod p)
          return p - inverse_mod(-k, p)
  
      # Extended Euclidean algorithm.
      s, old_s = 0, 1
      t, old_t = 1, 0
      r, old_r = p, k
  
      while r != 0:
          quotient = old_r // r
          old_r, r = r, old_r - quotient * r
          old_s, s = s, old_s - quotient * s
          old_t, t = t, old_t - quotient * t
  
      gcd, x, y = old_r, old_s, old_t
  
      assert gcd == 1
      assert (k * x) % p == 1
  
      return x % p
function_tokens: def inverse_mod ( k , p ) : if k == 0 : raise ZeroDivisionError ( "division by zero" ) if k < 0 : # k ** -1 = p - (-k) ** -1  (mod p) return p - inverse_mod ( - k , p ) # Extended Euclidean algorithm. s , old_s = 0 , 1 t , old_t = 1 , 0 r , old_r = p , k while r != 0 : quotient = old_r // r old_r , r = r , old_r - quotient * r old_s , s = s , old_s - quotient * s old_t , t = t , old_t - quotient * t gcd , x , y = old_r , old_s , old_t assert gcd == 1 assert ( k * x ) % p == 1 return x % p