Skip to content

Elliptic curve point homsets should be in the AbelianGroup category #37730

@grhkm21

Description

@grhkm21

Steps To Reproduce

Discovered while working on #37705

sage: E = EllipticCurve(GF(103), [3, 5])
....: S = E.point_homset(); S
Abelian group of points on Elliptic Curve defined by y^2 = x^3 + 3*x + 5 over Finite Field of size 103
sage: S.categories()
[Category of homsets of schemes over Finite Field of size 103,
 Category of homsets,
 Category of sets,
 Category of sets with partial maps,
 Category of objects]

Actually, the same applies for jacobians:

sage: H = HyperellipticCurve(polygen(GF(103))^5 + 3).jacobian()
....: S = H.point_homset(); S
Set of rational points of Jacobian of Hyperelliptic Curve over Finite Field of size 103 defined by y^2 = x^5 + 3
sage: S.categories()
[Category of homsets of schemes over Finite Field of size 103,
 Category of homsets,
 Category of sets,
 Category of sets with partial maps,
 Category of objects]

In fact, the same applies for Jacobian_generic:

sage: from sage.schemes.jacobians.abstract_jacobian import Jacobian_generic
....: P2.<x, y, z> = ProjectiveSpace(QQ, 2)
....: C = Curve(x^3 + y^3 + z^3)
....: J = Jacobian_generic(C)
....: J.categories()
[Category of schemes over Rational Field,
 Category of schemes,
 Category of sets,
 Category of sets with partial maps,
 Category of objects]

(C has to be smooth)

Expected Behavior

These should be in Groups() (and more). For elliptic curves, there's actually a method E.abelian_group() which returns the abelian group structure:

sage: E = EllipticCurve(GF(103), [3, 5])
....: S = E.point_homset(); S
Abelian group of points on Elliptic Curve defined by y^2 = x^3 + 3*x + 5 over Finite Field of size 103
sage: S
Abelian group of points on Elliptic Curve defined by y^2 = x^3 + 3*x + 5 over Finite Field of size 103
sage: E.abelian_group()
Additive abelian group isomorphic to Z/48 + Z/2 embedded in Abelian group of points on Elliptic Curve defined by y^2 = x^3 + 3*x + 5 over Finite Field of size 103
sage: E.abelian_group().categories()
[Category of modules over Integer Ring,
 Category of bimodules over Integer Ring on the left and Integer Ring on the right,
 Category of right modules over Integer Ring,
 Category of left modules over Integer Ring,
 Category of commutative additive groups,
 Category of additive groups,
 Category of additive inverse additive unital additive magmas,
 Category of commutative additive monoids,
 Category of additive monoids,
 Category of additive unital additive magmas,
 Category of commutative additive semigroups,
 Category of additive commutative additive magmas,
 Category of additive semigroups,
 Category of additive magmas,
 Category of sets,
 Category of sets with partial maps,
 Category of objects]

(It says "embedded" but it's actually isomorphic)

Additional Information

I will work on this tonight. An annoyance is that TestSuite(S).run() will then require S to implement an_element, which is not always possible for (jacobians over) curves just return the additive identity, which is the zero divisor class for jacobians.

Checklist

  • I have searched the existing issues for a bug report that matches the one I want to file, without success.
  • I have read the documentation and troubleshoot guide

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions