pairing-0.1.0: src/Pairing/Jacobian.hs
-- | Jacobian representation of points on an elliptic curve.
--
-- In Jacobian coordinates the triple @(x, y, z)@ represents the affine point
-- @(X / Z^2, Y / Z^3)@. Curve operations are more optimal in Jacobian
-- coordinates when the time complexity for underlying field inversions is
-- significantly higher than field multiplications.
module Pairing.Jacobian (
JPoint,
toJacobian,
fromJacobian
) where
import Protolude
import Pairing.Point
-- | Jacobian coordinates for points on an elliptic curve over a field
-- @a@.
type JPoint a = (a,a,a)
-- | Convert affine coordinates to Jacobian coordinates
toJacobian :: Fractional a => Point a -> JPoint a
toJacobian Infinity = (1, 1, 0)
toJacobian (Point x y) = (x,y,1)
-- | Convert Jacobian coordinates to affine coordinates
fromJacobian :: (Eq a, Fractional a) => JPoint a -> Point a
fromJacobian (x, y, z)
| z == 0 = Infinity
| otherwise = Point (x * zinv^2) (y * zinv^3)
where
zinv = recip z