code: def add(self, p0, p1):
          
          p = self._p
          infinity = self._infinity
  
          if p0 == infinity:
              return p1
          if p1 == infinity:
              return p0
  
          x0, y0 = p0
          x1, y1 = p1
          if (x0 - x1) % p == 0:
              if (y0 + y1) % p == 0:
                  return infinity
              else:
                  slope = ((3 * x0 * x0 + self._a) * self.inverse_mod(2 * y0, p)) % p
          else:
              slope = ((y1 - y0) * self.inverse_mod(x1 - x0, p)) % p
  
          x3 = (slope * slope - x0 - x1) % p
          y3 = (slope * (x0 - x3) - y0) % p
  
          return self.Point(x3, y3)
docs: :param p0: a point
          :param p1: a point
          :returns: the sum of the two points