From 7ff5c287ecefabd0c2f292085fbb4ed497c09b87 Mon Sep 17 00:00:00 2001 From: Simon Brandhorst Date: Fri, 8 Nov 2024 16:04:43 +0100 Subject: [PATCH] feat: pretty printing for elliptic curves and their points --- docs/src/manual/elliptic_curves/basics.md | 6 +-- .../manual/elliptic_curves/finite_fields.md | 5 +- src/EllCrv/EllCrv.jl | 54 +++++++++++++------ src/EllCrv/Finite.jl | 17 +++--- src/EllCrv/Isomorphisms.jl | 13 ++--- 5 files changed, 54 insertions(+), 41 deletions(-) diff --git a/docs/src/manual/elliptic_curves/basics.md b/docs/src/manual/elliptic_curves/basics.md index d23cd52c2c..c512e323f5 100644 --- a/docs/src/manual/elliptic_curves/basics.md +++ b/docs/src/manual/elliptic_curves/basics.md @@ -50,12 +50,10 @@ by setting `check = false`. 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 +(1 : -2 : 1) julia> E([2, -4, 2]) -Point (1 : -2 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 +(1 : -2 : 1) ``` ```@docs diff --git a/docs/src/manual/elliptic_curves/finite_fields.md b/docs/src/manual/elliptic_curves/finite_fields.md index 19bc50fcfc..c752a3fe3a 100644 --- a/docs/src/manual/elliptic_curves/finite_fields.md +++ b/docs/src/manual/elliptic_curves/finite_fields.md @@ -15,12 +15,11 @@ end Return a random point on the elliptic curve $E$ defined over a finite field. -```jldoctest; filter = r"Point.*" +```jldoctest; filter = r"\(.*" julia> E = elliptic_curve(GF(3), [1, 2]); julia> rand(E) -Point (2 : 0 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 +(2 : 0 : 1) ``` ## Cardinality and orders diff --git a/src/EllCrv/EllCrv.jl b/src/EllCrv/EllCrv.jl index b77f9899eb..77a696c4b5 100644 --- a/src/EllCrv/EllCrv.jl +++ b/src/EllCrv/EllCrv.jl @@ -198,11 +198,11 @@ disabled by setting `check = false`. ```jldoctest 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 + 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 + y^2 = x^3 + x + 1 ``` """ elliptic_curve @@ -284,11 +284,11 @@ julia> Qx, x = QQ["x"]; julia> elliptic_curve(x^3 + x + 1) Elliptic curve with equation -y^2 = x^3 + x + 1 + y^2 = x^3 + x + 1 julia> elliptic_curve(x^3 + x + 1, x) Elliptic curve with equation -y^2 + x*y = x^3 + x + 1 + y^2 + x*y = x^3 + x + 1 ``` """ function elliptic_curve(f::PolyRingElem{T}, h::PolyRingElem{T} = zero(parent(f)); check::Bool = true) where T @@ -323,7 +323,7 @@ Prime field of characteristic 3 julia> elliptic_curve_from_j_invariant(K(2)) Elliptic curve with equation -y^2 + x*y = x^3 + 1 + y^2 + x*y = x^3 + 1 ``` """ function elliptic_curve_from_j_invariant(j::FieldElem) @@ -608,12 +608,10 @@ by setting `check = false`. 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 +(1 : -2 : 1) julia> E([2, -4, 2]) -Point (1 : -2 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 +(1 : -2 : 1) ``` """ function (E::EllipticCurve{T})(coords::Vector{S}; check::Bool = true) where {S, T} @@ -778,8 +776,31 @@ end # ################################################################################ +function show(io::IO, ::MIME"text/plain", E::EllipticCurve) + io = pretty(io) + println(io, "Elliptic curve") + print(io, Indent(), "over ", Lowercase()) + print(io, base_field(E)) + println(io, Dedent()) + println(io, "with equation") + print(io, Indent()) + _print_equation(io, E) + print(io, Dedent()) +end + function show(io::IO, E::EllipticCurve) - print(io, "Elliptic curve with equation\n") + if is_terse(io) + print(io, "Elliptic curve") + return + end + io = pretty(io) + print(io, "Elliptic curve over ", Lowercase()) + print(terse(io), base_field(E)) + print(io, " with equation ") + _print_equation(io, E) +end + +function _print_equation(io::IO, E::EllipticCurve) a1, a2, a3, a4, a6 = a_invariants(E) sum = Expr(:call, :+) push!(sum.args, Expr(:call, :^, :y, 2)) @@ -831,8 +852,10 @@ function show(io::IO, E::EllipticCurve) print(io, AbstractAlgebra.expr_to_string(AbstractAlgebra.canonicalize(sum))) end + function show(io::IO, P::EllipticCurvePoint) - print(io, "Point ($(P[1]) : $(P[2]) : $(P[3])) of $(P.parent)") + io = pretty(io) + print(io, "($(P[1]) : $(P[2]) : $(P[3]))") end @@ -856,8 +879,7 @@ 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 +(-1 : 0 : 1) ``` """ function +(P::EllipticCurvePoint{T}, Q::EllipticCurvePoint{T}) where T @@ -1150,10 +1172,8 @@ 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 + (0 : 1 : 0) + (-1 : 0 : 1) ``` """ function division_points(P::EllipticCurvePoint, m::S) where S<:Union{Integer, ZZRingElem} diff --git a/src/EllCrv/Finite.jl b/src/EllCrv/Finite.jl index ca3fee6883..a210ee6df3 100644 --- a/src/EllCrv/Finite.jl +++ b/src/EllCrv/Finite.jl @@ -1140,22 +1140,19 @@ Return a list of generators of the group of rational points on $E$. # Examples -```jldoctest; filter = r"Point.*" +```jldoctest; filter = r"\(.*" julia> E = elliptic_curve(GF(101, 2), [1, 2]); julia> gens(E) 2-element Vector{EllipticCurvePoint{FqFieldElem}}: - Point (16*o + 42 : 88*o + 97 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 - Point (88*o + 23 : 94*o + 22 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 + (13*o + 83 : 90*o + 25 : 1) + (61*o + 62 : 19*o + 24 : 1) julia> E = elliptic_curve(GF(101), [1, 2]); julia> gens(E) 1-element Vector{EllipticCurvePoint{FqFieldElem}}: - Point (85 : 58 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 + (27 : 57 : 1) ``` """ function gens(E::EllipticCurve{T}) where {T <: FinFieldElem} @@ -1235,12 +1232,10 @@ argument. julia> E = elliptic_curve(GF(101), [1, 2]); julia> P = E([6, 74]) -Point (6 : 74 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 +(6 : 74 : 1) julia> Q = E([85, 43]) -Point (85 : 43 : 1) of Elliptic curve with equation -y^2 = x^3 + x + 2 +(85 : 43 : 1) julia> disc_log(P, Q) 13 diff --git a/src/EllCrv/Isomorphisms.jl b/src/EllCrv/Isomorphisms.jl index 4cfc3be0f1..52bec3e426 100644 --- a/src/EllCrv/Isomorphisms.jl +++ b/src/EllCrv/Isomorphisms.jl @@ -615,15 +615,16 @@ end # ################################################################################ - -function show(io::IO, f::EllCrvIso) +function show(io::IO, ::MIME"text/plain", f::EllCrvIso) + io = pretty(io) E1 = domain(f) E2 = codomain(f) fx, fy, fz = rational_maps(f) - print(io, "Isomorphism from - $(E1) to \n - $(E2) given by \n - (x : y : 1) -> ($(fx) : $(fy) : $(fz) )") + println(io, "Isomorphism") + println(io, Indent(), "from ", E1) + println(io, "to ", E2) + print(io,"given by ") + print(io, "(x : y : 1) -> ($(fx) : $(fy) : $(fz) )") end ################################################################################