code: def _recover_public_key(G, order, r, s, i, e):
      
  
      c = G.curve()
  
      # 1.1 Let x = r + jn
      x = r + (i // 2) * order
  
      # 1.3 point from x
      alpha = (x * x * x + c.a() * x + c.b()) % c.p()
      beta = pycoin.ecdsa.numbertheory.modular_sqrt(alpha, c.p())
      y = beta if (beta - i) % 2 == 0 else c.p() - beta
  
      # 1.4 Check that nR is at infinity
      R = pycoin.ecdsa.ellipticcurve.Point(c, x, y, order)
  
      rInv = pycoin.ecdsa.numbertheory.inverse_mod(r, order)  # r^-1
      eNeg = -e % order  # -e
  
      # 1.6 compute Q = r^-1 (sR - eG)
      Q = rInv * (s * R + eNeg * G)
      return Q
docs: Recover a public key from a signature.
      See SEC 1: Elliptic Curve Cryptography, section 4.1.6, "Public
      Key Recovery Operation".
      http://www.secg.org/sec1-v2.pdf