# Basics

## Creation

elliptic_curveFunction
elliptic_curve([K::Field], x::Vector; check::Bool = true) -> EllipticCurve

Construct an elliptic curve with Weierstrass equation specified by the coefficients in x, which must have either length 2 or 5.

Per default, it is checked whether the discriminant is non-zero. This can be disabled by setting check = false.

Examples

julia> elliptic_curve(QQ, [1, 2, 3, 4, 5])
Elliptic curve with equation
y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5

julia> elliptic_curve(GF(3), [1, 1])
Elliptic curve with equation
y^2 = x^3 + x + 1
source
elliptic_curve_from_j_invariantFunction
elliptic_curve_from_j_invariant(j::FieldElem) -> EllipticCurve

Return an elliptic curve with the given $j$-invariant.

Examples

julia> K = GF(3)
Prime field of characteristic 3

julia> elliptic_curve_from_j_invariant(K(2))
Elliptic curve with equation
y^2 + x*y = x^3 + 1
source

## Basic properties

base_fieldMethod
base_field(E::EllipticCurve) -> Field

Return the base field over which E is defined.

source
base_field(C::HypellCrv) -> Field

Return the base field over which C is defined.

source
base_changeMethod
base_change(K::Field, E::EllipticCurve) -> EllipticCurve

Return the base change of the elliptic curve $E$ over $K$ if coercion is possible.

source
base_changeMethod
base_change(f, E::EllipticCurve) -> EllipticCurve

Return the base change of the elliptic curve $E$ using the map $f$.

source
coefficientsMethod
coefficients(E::EllipticCurve{T}) -> Tuple{T, T, T, T, T}

Return the Weierstrass coefficients of $E$ as a tuple (a1, a2, a3, a4, a6) such that $E$ is given by y^2 + a1xy + a3y = x^3 + a2x^2 + a4x + a6.

source
a_invariantsMethod
a_invariants(E::EllipticCurve{T}) -> Tuple{T, T, T, T, T}

Return the Weierstrass coefficients of $E$ as a tuple $(a_1, a_2, a_3, a_4, a_6)$ such that $E$ is given by $y^2 + a_1xy + a_3y = x^3 + a_2x^2 + a_4x + a_6$.

source
b_invariantsMethod
b_invariants(E::EllipticCurve{T}) -> Tuple{T, T, T, T}

Return the b-invariants of $E$ as a tuple $(b_2, b_4, b_6, b_8)$.

source
c_invariantsMethod
c_invariants(E::EllipticCurve{T}) -> Tuple{T, T}

Return the c-invariants of $E as a tuple$(c_4, c_6)$. source discriminantMethod discriminant(E::EllipticCurve) -> FieldElem Return the discriminant of$E$. source discriminant(C::HypellCrv{T}) -> T Compute the discriminant of$C$. source discriminant(O::AlgssRelOrd) Returns the discriminant of$O$. source equationMethod equation([R::MPolyRing,] E::EllipticCurve) -> MPolyRingElem Return the equation defining the elliptic curve$E$as a bivariate polynomial. If the polynomial ring$R$is specified, it must by a bivariate polynomial ring. Examples julia> E = elliptic_curve(QQ, [1, 2, 3, 4, 5]); julia> equation(E) -x^3 - 2*x^2 + x*y - 4*x + y^2 + 3*y - 5 source hyperelliptic_polynomialsMethod hyperelliptic_polynomials([R::PolyRing,] E::EllipticCurve) -> PolyRingElem, PolyRingElem Return univariate polynomials$f, h$such that$E$is given by$y^2 + h*y = f$. Examples julia> E = elliptic_curve(QQ, [1, 2, 3, 4, 5]); julia> hyperelliptic_polynomials(E) (x^3 + 2*x^2 + 4*x + 5, x + 3) source ## Points  (E::EllipticCurve)(coords::Vector; check::Bool = true) Return the point$P$of$E$with coordinates specified by coords, which can be either affine coordinates (length(coords) == 2) or projective coordinates (length(coords) == 3). Per default, it is checked whether the point lies on$E$. This can be disabled by setting check = false. ##### Examples julia> E = elliptic_curve(QQ, [1, 2]); julia> E([1, -2]) Point (1 : -2 : 1) of Elliptic curve with equation y^2 = x^3 + x + 2 julia> E([2, -4, 2]) Point (1 : -2 : 1) of Elliptic curve with equation y^2 = x^3 + x + 2 infinityMethod infinity(E::EllipticCurve) -> EllipticCurvePoint Return the point at infinity with project coordinates$[0 : 1 : 0]$. source parentMethod parent(P::EllipticCurvePoint) -> EllipticCurve Return the elliptic curve on which$P$lies. Examples julia> E = elliptic_curve(QQ, [1, 2]); julia> P = E([1, -2]); julia> E == parent(P) true source is_on_curveMethod is_on_curve(E::EllipticCurve, coords::Vector) -> Bool Return true if coords defines a point on$E$and false otherwise. The array coords must have length 2. Examples julia> E = elliptic_curve(QQ, [1, 2]); julia> is_on_curve(E, [1, -2]) true julia> is_on_curve(E, [1, -1]) false source +Method +(P::EllipticCurvePoint, Q::EllipticCurvePoint) -> EllipticCurvePoint Add two points on an elliptic curve. Examples julia> E = elliptic_curve(QQ, [1, 2]); julia> P = E([1, -2]); julia> P + P Point (-1 : 0 : 1) of Elliptic curve with equation y^2 = x^3 + x + 2 source division_pointsMethod division_points(P::EllipticCurvePoint, m::Int) -> EllipticCurvePoint Compute the set of points$Q$defined over the base field such that$mQ = P\$. Returns the empty list if no such points exist.

Examples

julia> E = elliptic_curve(QQ, [1, 2]);

julia> division_points(infinity(E), 2)
2-element Vector{EllipticCurvePoint{QQFieldElem}}:
Point  (0 : 1 : 0)  of Elliptic curve with equation
y^2 = x^3 + x + 2
Point  (-1 : 0 : 1)  of Elliptic curve with equation
y^2 = x^3 + x + 2
source