docs: def from_signature(klass, sig, recid, h, curve):
          """ See http://www.secg.org/download/aid-780/sec1-v2.pdf, chapter 4.1.6 """
          from ecdsa import util, numbertheory
          import msqr
          curveFp = curve.curve
          G = curve.generator
          order = G.order()
          # extract r,s from signature
          r, s = util.sigdecode_string(sig, order)
          # 1.1
          x = r + (recid/2) * order
          # 1.3
          alpha = ( x * x * x  + curveFp.a() * x + curveFp.b() ) % curveFp.p()
          beta = msqr.modular_sqrt(alpha, curveFp.p())
          y = beta if (beta - recid) % 2 == 0 else curveFp.p() - beta
          # 1.4 the constructor checks that nR is at infinity
          R = Point(curveFp, x, y, order)
          # 1.5 compute e from message:
          e = string_to_number(h)
          minus_e = -e % order
          # 1.6 compute Q = r^-1 (sR - eG)
          inv_r = numbertheory.inverse_mod(r,order)
          Q = inv_r * ( s * R + minus_e * G )
          return klass.from_public_point( Q, curve )