docs: public Point add(Point b) {
        if (this.isInfinity()) {
           return b;
        }
  
        if (b.isInfinity()) {
           return this;
        }
  
        // Check if b = this or b = -this
        if (this._x.equals(b._x)) {
           if (this._y.equals(b._y)) {
              // this = b, i.e. this must be doubled
              return this.twice();
           }
  
           // this = -b, i.e. the result is the point at infinity
           return this._curve.getInfinity();
        }
  
        FieldElement gamma = b._y.subtract(this._y).divide(b._x.subtract(this._x));
  
        FieldElement x3 = gamma.square().subtract(this._x).subtract(b._x);
        FieldElement y3 = gamma.multiply(this._x.subtract(x3)).subtract(this._y);
  
        return new Point(_curve, x3, y3);
     }