Skip to content

Commit baff07d

Browse files
committed
implement .push_subgroup() for composite isogenies
1 parent 189f840 commit baff07d

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

src/sage/schemes/elliptic_curves/hom.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,10 +1178,9 @@ def minimal_polynomial(self):
11781178

11791179
def push_subgroup(self, f):
11801180
r"""
1181-
Given a irreducible divisor `f` of an `l`-division polynomial on the
1182-
domain curve of this isogeny, return an irreducible polynomial `f'`
1183-
such that the subgroup defined by `f` is mapped to the subgroup
1184-
defined by `f'` under the isogeny. See :meth:`minimal_polynomial()`.
1181+
Given the minimal polynomial (see :meth:`minimal_polynomial`)
1182+
of a subgroup `G` of the domain of this isogeny, return a minimal
1183+
polynomial of the image of `G` under this isogeny.
11851184
11861185
ALGORITHM: [EPSV2023]_, Algorithm 5 (``PushSubgroup``)
11871186
@@ -1234,6 +1233,24 @@ def push_subgroup(self, f):
12341233
sage: any(iso * psi_pushed * phi == phi_pushed * psi
12351234
....: for iso in psi_pushed.codomain().isomorphisms(phi_pushed.codomain()))
12361235
True
1236+
1237+
If the subgroup represented by `f` intersects nontrivially with the
1238+
kernel of this isogeny, the method still works correctly::
1239+
1240+
sage: E = EllipticCurve(GF(419), [1,0])
1241+
sage: phi = next(E.isogenies_degree(7)); phi
1242+
Isogeny of degree 7
1243+
from Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 419
1244+
to Elliptic Curve defined by y^2 = x^3 + 285*x + 87 over Finite Field of size 419
1245+
sage: psi = next(E.isogenies_degree(21)); psi
1246+
Composite morphism of degree 21 = 7*3:
1247+
From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 419
1248+
To: Elliptic Curve defined by y^2 = x^3 + 134*x + 230 over Finite Field of size 419
1249+
sage: phi.kernel_polynomial().gcd(psi.kernel_polynomial())
1250+
x^3 + 274*x^2 + 350*x + 6
1251+
sage: f = phi.minimal_polynomial()
1252+
sage: psi.push_subgroup(f)
1253+
1
12371254
"""
12381255
g = self.x_rational_map()
12391256
g1, g2 = g.numerator(), g.denominator()
@@ -1242,6 +1259,8 @@ def push_subgroup(self, f):
12421259
R = f1.parent()
12431260
S = R.quotient_ring(f1)
12441261
alpha = S(g1 * g2.inverse_mod(f1))
1262+
if not alpha:
1263+
return R.one()
12451264
return alpha.minpoly()
12461265

12471266

src/sage/schemes/elliptic_curves/hom_composite.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,3 +931,36 @@ def inseparable_degree(self):
931931
1331
932932
"""
933933
return prod(phi.inseparable_degree() for phi in self._phis)
934+
935+
def push_subgroup(self, f):
936+
r"""
937+
Given the minimal polynomial (see :meth:`~EllipticCurveHom.minimal_polynomial`)
938+
of a subgroup `G` of the domain of this isogeny, return a minimal polynomial of
939+
the image of `G` under this isogeny.
940+
941+
ALGORITHM: iterative :meth:`EllipticCurveHom.push_subgroup()`
942+
943+
EXAMPLES::
944+
945+
sage: E = EllipticCurve(GF((2^61-1, 2)), [1,0])
946+
sage: phi = next(E.isogenies_degree(7)); phi
947+
Isogeny of degree 7
948+
from Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 2305843009213693951^2
949+
to Elliptic Curve defined by y^2 = x^3 + (595688734420561721*z2+584021682365204922)*x + (2058397526093132314*z2+490140893682260802) over Finite Field in z2 of size 2305843009213693951^2
950+
sage: psi = E.isogeny(E.lift_x(48), algorithm='factored'); psi
951+
Composite morphism of degree 36028797018963968 = 2^55:
952+
From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 2305843009213693951^2
953+
To: Elliptic Curve defined by y^2 = x^3 + 938942632807894005*x + 1238942515234646252 over Finite Field in z2 of size 2305843009213693951^2
954+
sage: f = phi.minimal_polynomial()
955+
sage: g = psi.push_subgroup(f)
956+
sage: h = psi.codomain().kernel_polynomial_from_divisor(g, phi.degree())
957+
sage: chi = psi.codomain().isogeny(h); chi
958+
Isogeny of degree 7 from Elliptic Curve defined by y^2 = x^3 + 938942632807894005*x + 1238942515234646252 over Finite Field in z2 of size 2305843009213693951^2 to Elliptic Curve defined by y^2 = x^3 + (1406897314822267524*z2+1659665944678449850)*x + (650305521764753329*z2+1047269804324934563) over Finite Field in z2 of size 2305843009213693951^2
959+
sage: x = phi.kernel_polynomial().any_root()
960+
sage: K = E.change_ring(E.base_field().extension(2)).lift_x(x)
961+
sage: (chi * psi)._eval(K)
962+
(0 : 1 : 0)
963+
"""
964+
for phi in self.factors():
965+
f = phi.push_subgroup(f)
966+
return f

0 commit comments

Comments
 (0)