Doubles this point.

        Returns:
            AffinePoint: The point corresponding to `2 * self`.

def double(self):
        """
        Doubles this point.

        Returns:
            AffinePoint: The point corresponding to `2 * self`.
        """
        X1, Y1, a, P = self.X, self.Y, self.a, self.P

        if self.infinity:
            return self

        S = ((3 * X1 ** 2 + a) * self.inverse(2 * Y1)) % P
        X2 = (S ** 2 - (2 * X1)) % P
        Y2 = (S * (X1 - X2) - Y1) % P
        return AffinePoint(X2, Y2)