Skip to content

Commit

Permalink
feat: pretty printing for elliptic curves and their points (#1677)
Browse files Browse the repository at this point in the history
  • Loading branch information
simonbrandhorst authored Dec 16, 2024
1 parent d7c9bf2 commit 0e5b061
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 46 deletions.
6 changes: 2 additions & 4 deletions docs/src/manual/elliptic_curves/basics.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 2 additions & 3 deletions docs/src/manual/elliptic_curves/finite_fields.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
74 changes: 52 additions & 22 deletions src/EllCrv/EllCrv.jl
Original file line number Diff line number Diff line change
Expand Up @@ -167,12 +167,16 @@ 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
Elliptic curve
over rational field
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
Elliptic curve
over prime field of characteristic 3
with equation
y^2 = x^3 + x + 1
```
"""
elliptic_curve
Expand Down Expand Up @@ -253,12 +257,16 @@ disabled by setting `check = false`.
julia> Qx, x = QQ["x"];
julia> elliptic_curve(x^3 + x + 1)
Elliptic curve with equation
y^2 = x^3 + x + 1
Elliptic curve
over rational field
with equation
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
Elliptic curve
over rational field
with equation
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
Expand Down Expand Up @@ -292,8 +300,10 @@ 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
Elliptic curve
over prime field of characteristic 3
with equation
y^2 + x*y = x^3 + 1
```
"""
function elliptic_curve_from_j_invariant(j::FieldElem)
Expand Down Expand Up @@ -584,12 +594,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}
Expand Down Expand Up @@ -754,8 +762,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))
Expand Down Expand Up @@ -807,8 +838,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


Expand All @@ -832,8 +865,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
Expand Down Expand Up @@ -1126,10 +1158,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}
Expand Down
17 changes: 6 additions & 11 deletions src/EllCrv/Finite.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1110,22 +1110,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}
Expand Down Expand Up @@ -1205,12 +1202,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
Expand Down
13 changes: 7 additions & 6 deletions src/EllCrv/Isomorphisms.jl
Original file line number Diff line number Diff line change
Expand Up @@ -623,15 +623,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

################################################################################
Expand Down

0 comments on commit 0e5b061

Please sign in to comment.