code: def possible_public_pairs_for_signature(self, value, signature, y_parity=None):
          
          r, s = signature
  
          try:
              points = self.points_for_x(r)
          except ValueError:
              return []
  
          if y_parity is not None:
              if y_parity & 1:
                  points = points[1:]
              else:
                  points = points[:1]
  
          inv_r = self.inverse(r)
          s_over_r = s * inv_r
          minus_E_over_r = -(inv_r * value) * self
          try:
              return [s_over_r * p + minus_E_over_r for p in points]
          except ValueError:
              return []
docs: :param: value: an integer value
          :param: signature: an ``(r, s)`` pair of integers representing an ecdsa signature of ``value``
          :param: y_parity: (optional) for a given value and signature, there are either two points
              that sign it, or none if the signature is invalid. One of the points has an even y
              value, the other an odd. If this parameter is set, only points whose y value matches
              this value will be returned in the list.
  
          :return: a list of :class:`Point <pycoin.ecdsa.Point.Point>` objects p where each p is
              a possible public key for which ``signature`` correctly signs the given ``value``.
              If something goes wrong, this list will be empty.