From b0111fc3183f5c7fb0d2003c5e13c5f55541bca0 Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Thu, 13 Jul 2023 17:53:45 +0300 Subject: [PATCH 1/8] Implement `.isogenies_degree` for EllipticCurves This supports computing (separable) isogenies of composite degree. It is generic and calls `.isogenies_prime_degree`. --- src/sage/schemes/elliptic_curves/ell_field.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 5a5fdf1fcb6..407ede6cd79 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1588,6 +1588,62 @@ def isogenies_prime_degree(self, l=None, max_l=31): from .isogeny_small_degree import isogenies_prime_degree return sum([isogenies_prime_degree(self, d) for d in L], []) + def isogenies_degree(self, n): + """ + Return a list of all separable isogenies of given degree with domain + equal to ``self``, which are defined over the base field of ``self``. + + INPUT: + + - ``n`` -- an integer. + + TESTS:: + sage: E = EllipticCurve(GF(11), [1, 1]) + sage: E.isogenies_degree(23 * 19) + [Composite morphism of degree 437 = 1*19*23: + From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 + To: Elliptic Curve defined by y^2 = x^3 + 8*x + 7 over Finite Field of size 11, + Composite morphism of degree 437 = 1*19*23: + From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 + To: Elliptic Curve defined by y^2 = x^3 + 2*x + 6 over Finite Field of size 11, + Composite morphism of degree 437 = 1*19*23: + From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 + To: Elliptic Curve defined by y^2 = x^3 + 6*x + 2 over Finite Field of size 11, + Composite morphism of degree 437 = 1*19*23: + From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 + To: Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 11] + + sage: pol = PolynomialRing(QQ, 'x')([1, -3, 5, -5, 5, -3, 1]) + sage: L. = NumberField(pol) + sage: js = hilbert_class_polynomial(-23).roots(L, multiplicities=False) + sage: len(js) + 3 + sage: E = EllipticCurve(j=js[0]) + sage: len(E.isogenies_degree(2**2)) + 7 + sage: len(E.isogenies_degree(2**5)) # long time (15s) + 99 + """ + n = rings.Integer(n) + if n.is_prime(): + return self.isogenies_prime_degree(n) + + prime_divisors = sum([[p] * e for p, e in n.factor()], []) + isos = [self.isogeny(self(0))] + + for p in prime_divisors: + if len(isos) == 0: + break + + new_isos = [] + for iso in isos: + Eiso = iso.codomain() + for next_iso in Eiso.isogenies_prime_degree(p): + new_isos.append(next_iso * iso) + isos = new_isos + + return isos + def is_isogenous(self, other, field=None): """ Return whether or not self is isogenous to other. From 3f876faa666b946a3da91e7844570a7049068632 Mon Sep 17 00:00:00 2001 From: grhkm21 <83517584+grhkm21@users.noreply.github.com> Date: Mon, 6 Nov 2023 22:59:10 +0000 Subject: [PATCH 2/8] Apply suggestions from code review Thanks Lorenz for the review <3 Co-authored-by: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> --- src/sage/schemes/elliptic_curves/ell_field.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 407ede6cd79..c9d74c961f0 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1589,7 +1589,7 @@ def isogenies_prime_degree(self, l=None, max_l=31): return sum([isogenies_prime_degree(self, d) for d in L], []) def isogenies_degree(self, n): - """ + r""" Return a list of all separable isogenies of given degree with domain equal to ``self``, which are defined over the base field of ``self``. @@ -1613,6 +1613,8 @@ def isogenies_degree(self, n): From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 11] + :: + sage: pol = PolynomialRing(QQ, 'x')([1, -3, 5, -5, 5, -3, 1]) sage: L. = NumberField(pol) sage: js = hilbert_class_polynomial(-23).roots(L, multiplicities=False) @@ -1632,7 +1634,7 @@ def isogenies_degree(self, n): isos = [self.isogeny(self(0))] for p in prime_divisors: - if len(isos) == 0: + if not isos: break new_isos = [] From 8e0346ccc622b287727e4ed3471b0fc3f0dfce59 Mon Sep 17 00:00:00 2001 From: grhkm21 <83517584+grhkm21@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:30:45 +0100 Subject: [PATCH 3/8] Update src/sage/schemes/elliptic_curves/ell_field.py Yes. Co-authored-by: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> --- src/sage/schemes/elliptic_curves/ell_field.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index c9d74c961f0..68f48edd4fc 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1598,6 +1598,7 @@ def isogenies_degree(self, n): - ``n`` -- an integer. TESTS:: + sage: E = EllipticCurve(GF(11), [1, 1]) sage: E.isogenies_degree(23 * 19) [Composite morphism of degree 437 = 1*19*23: From 9aa101d78e8457d2bc114e5b69806c8b2b1bd64d Mon Sep 17 00:00:00 2001 From: grhkm21 <83517584+grhkm21@users.noreply.github.com> Date: Sat, 20 Jan 2024 13:28:54 +0100 Subject: [PATCH 4/8] Replace `rings.Integer` with `Integer` --- src/sage/schemes/elliptic_curves/ell_field.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 68f48edd4fc..9c9ae630679 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -229,9 +229,9 @@ def two_torsion_rank(self): sage: EllipticCurve('15a1').two_torsion_rank() 2 """ - f = self.division_polynomial(rings.Integer(2)) + f = self.division_polynomial(Integer(2)) n = len(f.roots())+1 - return rings.Integer(n).ord(rings.Integer(2)) + return Integer(n).ord(Integer(2)) def quartic_twist(self, D): r""" @@ -996,7 +996,7 @@ def division_field(self, l, names='t', map=False, **kwds): - Lorenz Panny (2022): extend to finite fields """ from sage.misc.verbose import verbose - l = rings.Integer(l) + l = Integer(l) if not l.is_prime(): raise ValueError("l must be a prime number") @@ -1627,7 +1627,7 @@ def isogenies_degree(self, n): sage: len(E.isogenies_degree(2**5)) # long time (15s) 99 """ - n = rings.Integer(n) + n = Integer(n) if n.is_prime(): return self.isogenies_prime_degree(n) From 0d48917670f52b12e52bc815ed0593dae35bf41b Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Mon, 22 Jan 2024 13:07:49 +0000 Subject: [PATCH 5/8] =?UTF-8?q?Apply=20reviews=20=F0=9F=A4=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sage/schemes/elliptic_curves/ell_field.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 89f2f6392a3..5e2870d1711 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1352,9 +1352,9 @@ def isogeny_codomain(self, kernel): def isogenies_prime_degree(self, l=None, max_l=31): """ - Return a list of all separable isogenies of given prime degree(s) - with domain equal to ``self``, which are defined over the base - field of ``self``. + Return a list of all separable isogenies (up to post-composition with + isomorphisms) of given prime degree(s) with domain equal to ``self``, + which are defined over the base field of ``self``. INPUT: @@ -1638,8 +1638,9 @@ def isogenies_prime_degree(self, l=None, max_l=31): def isogenies_degree(self, n): r""" - Return a list of all separable isogenies of given degree with domain - equal to ``self``, which are defined over the base field of ``self``. + Return a list of all separable isogenies of given degree (up to + post-composition with isomorphisms) with domain equal to ``self``, which + are defined over the base field of ``self``. INPUT: @@ -1649,16 +1650,16 @@ def isogenies_degree(self, n): sage: E = EllipticCurve(GF(11), [1, 1]) sage: E.isogenies_degree(23 * 19) - [Composite morphism of degree 437 = 1*19*23: + [Composite morphism of degree 437 = 19*23: From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 8*x + 7 over Finite Field of size 11, - Composite morphism of degree 437 = 1*19*23: + Composite morphism of degree 437 = 19*23: From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 2*x + 6 over Finite Field of size 11, - Composite morphism of degree 437 = 1*19*23: + Composite morphism of degree 437 = 19*23: From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 6*x + 2 over Finite Field of size 11, - Composite morphism of degree 437 = 1*19*23: + Composite morphism of degree 437 = 19*23: From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 11] @@ -1675,12 +1676,11 @@ def isogenies_degree(self, n): sage: len(E.isogenies_degree(2**5)) # long time (15s) 99 """ + from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism n = Integer(n) - if n.is_prime(): - return self.isogenies_prime_degree(n) - prime_divisors = sum([[p] * e for p, e in n.factor()], []) - isos = [self.isogeny(self(0))] + prime_divisors = [p for p, e in n.factor() for _ in range(e)] + isos = [identity_morphism(self)] for p in prime_divisors: if not isos: From 91b2ff23d8b6cdb89681f6eb8d053862ed187126 Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Mon, 22 Jan 2024 23:42:28 +0000 Subject: [PATCH 6/8] Return iterator for `isogenies_degree` --- src/sage/schemes/elliptic_curves/ell_field.py | 92 ++++++++++++++----- 1 file changed, 71 insertions(+), 21 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 5e2870d1711..889617c837f 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1636,17 +1636,55 @@ def isogenies_prime_degree(self, l=None, max_l=31): from .isogeny_small_degree import isogenies_prime_degree return sum([isogenies_prime_degree(self, d) for d in L], []) - def isogenies_degree(self, n): + def _isogenies_degree_helper(self, n, _intermediate=False): + r""" + See documentation of :meth:`isogenies_degree`. + """ + from sage.structure.factorization import Factorization + from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism + + if not isinstance(n, Factorization): + n_fac = Integer(n).factor() + else: + n_fac = n + + if n_fac.value() == 1: + yield identity_morphism(self) + return + + p = n_fac[-1][0] + for iso in self._isogenies_degree_helper(n_fac / p, _intermediate=_intermediate): + if _intermediate: + yield iso + + Eiso = iso.codomain() + for next_iso in Eiso.isogenies_prime_degree(p): + yield next_iso * iso + + def isogenies_degree(self, n, *, iter=False, _intermediate=False): r""" Return a list of all separable isogenies of given degree (up to post-composition with isomorphisms) with domain equal to ``self``, which are defined over the base field of ``self``. + ALGORITHM: + + The prime factors `p` of `n` are processed one by one, each time + "branching" out by taking isogenies of degree `p`. + INPUT: - - ``n`` -- an integer. + - ``n`` -- integer, or its + :class:`~sage.structure.factorization.Factorization` - TESTS:: + - ``iter`` -- (bool, default: False): If set, an iterator in depth-first + traversal order will be returned. + + - ``_intermediate`` -- (bool, default: False): If set, the curves + traversed within the depth-first search are returned. This is for + internal use only. + + EXAMPLES:: sage: E = EllipticCurve(GF(11), [1, 1]) sage: E.isogenies_degree(23 * 19) @@ -1663,6 +1701,34 @@ def isogenies_degree(self, n): From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 11] + :: + + sage: E = EllipticCurve(GF(next_prime(2^32)), j=1728) + sage: sorted([phi.codomain().j_invariant() for phi in E.isogenies_degree(11 * 17 * 19^2)]) + [1348157279, 1348157279, 1713365879, 1713365879, 3153894341, 3153894341, 3153894341, + 3153894341, 3225140514, 3225140514, 3673460198, 3673460198, 3994312564, 3994312564, + 3994312564, 3994312564] + sage: E.isogenies_degree(2^2, _intermediate=True) + [Elliptic-curve endomorphism of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 + Via: (u,r,s,t) = (1, 0, 0, 0), + Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 to Elliptic Curve defined by + y^2 = x^3 + 4294967307*x over Finite Field of size 4294967311, + Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 to Elliptic Curve defined by + y^2 = x^3 + 4294967307*x over Finite Field of size 4294967311, + Composite morphism of degree 4 = 2^2: + From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 + To: Elliptic Curve defined by y^2 = x^3 + 16*x over Finite Field of size 4294967311, + Composite morphism of degree 4 = 2^2: + From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 + To: Elliptic Curve defined by y^2 = x^3 + 4294967267*x + 4294967199 over Finite Field of size 4294967311, + Composite morphism of degree 4 = 2^2: + From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 + To: Elliptic Curve defined by y^2 = x^3 + 4294967267*x + 112 over Finite Field of size 4294967311] + sage: it = E.isogenies_degree(2^2, iter=True); it + + sage: list(it) == E.isogenies_degree(2^2) + True + :: sage: pol = PolynomialRing(QQ, 'x')([1, -3, 5, -5, 5, -3, 1]) @@ -1676,24 +1742,8 @@ def isogenies_degree(self, n): sage: len(E.isogenies_degree(2**5)) # long time (15s) 99 """ - from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism - n = Integer(n) - - prime_divisors = [p for p, e in n.factor() for _ in range(e)] - isos = [identity_morphism(self)] - - for p in prime_divisors: - if not isos: - break - - new_isos = [] - for iso in isos: - Eiso = iso.codomain() - for next_iso in Eiso.isogenies_prime_degree(p): - new_isos.append(next_iso * iso) - isos = new_isos - - return isos + it = self._isogenies_degree_helper(n, _intermediate=_intermediate) + return it if iter else list(it) def is_isogenous(self, other, field=None): """ From 797181bb7bbeb57f41a444d01b31e1eb269c876d Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Mon, 12 Feb 2024 15:51:04 +0000 Subject: [PATCH 7/8] =?UTF-8?q?apply=20review=20changes=20=F0=9F=A4=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sage/schemes/elliptic_curves/ell_field.py | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 3e1e593f556..ee22aceea4a 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1882,36 +1882,11 @@ def isogenies_prime_degree(self, l=None, max_l=31): from .isogeny_small_degree import isogenies_prime_degree return sum([isogenies_prime_degree(self, d) for d in L], []) - def _isogenies_degree_helper(self, n, _intermediate=False): + def isogenies_degree(self, n, *, _intermediate=False): r""" - See documentation of :meth:`isogenies_degree`. - """ - from sage.structure.factorization import Factorization - from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism - - if not isinstance(n, Factorization): - n_fac = Integer(n).factor() - else: - n_fac = n - - if n_fac.value() == 1: - yield identity_morphism(self) - return - - p = n_fac[-1][0] - for iso in self._isogenies_degree_helper(n_fac / p, _intermediate=_intermediate): - if _intermediate: - yield iso - - Eiso = iso.codomain() - for next_iso in Eiso.isogenies_prime_degree(p): - yield next_iso * iso - - def isogenies_degree(self, n, *, iter=False, _intermediate=False): - r""" - Return a list of all separable isogenies of given degree (up to - post-composition with isomorphisms) with domain equal to ``self``, which - are defined over the base field of ``self``. + Return an iterator of all separable isogenies of given degree (up to + post-composition with isomorphisms) with domain equal to ``self``, + which are defined over the base field of ``self``. ALGORITHM: @@ -1923,9 +1898,6 @@ def isogenies_degree(self, n, *, iter=False, _intermediate=False): - ``n`` -- integer, or its :class:`~sage.structure.factorization.Factorization` - - ``iter`` -- (bool, default: False): If set, an iterator in depth-first - traversal order will be returned. - - ``_intermediate`` -- (bool, default: False): If set, the curves traversed within the depth-first search are returned. This is for internal use only. @@ -1933,7 +1905,7 @@ def isogenies_degree(self, n, *, iter=False, _intermediate=False): EXAMPLES:: sage: E = EllipticCurve(GF(11), [1, 1]) - sage: E.isogenies_degree(23 * 19) + sage: list(E.isogenies_degree(23 * 19)) [Composite morphism of degree 437 = 19*23: From: Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 11 To: Elliptic Curve defined by y^2 = x^3 + 8*x + 7 over Finite Field of size 11, @@ -1954,7 +1926,28 @@ def isogenies_degree(self, n, *, iter=False, _intermediate=False): [1348157279, 1348157279, 1713365879, 1713365879, 3153894341, 3153894341, 3153894341, 3153894341, 3225140514, 3225140514, 3673460198, 3673460198, 3994312564, 3994312564, 3994312564, 3994312564] - sage: E.isogenies_degree(2^2, _intermediate=True) + sage: it = E.isogenies_degree(2^2); it + + sage: all(phi.degree() == 2^2 for phi in it) + True + + :: + + sage: pol = PolynomialRing(QQ, 'x')([1, -3, 5, -5, 5, -3, 1]) + sage: L. = NumberField(pol) + sage: js = hilbert_class_polynomial(-23).roots(L, multiplicities=False) + sage: len(js) + 3 + sage: E = EllipticCurve(j=js[0]) + sage: len(list(E.isogenies_degree(2**2))) + 7 + sage: len(list(E.isogenies_degree(2**5))) # long time (15s) + 99 + + TESTS:: + + sage: E = EllipticCurve(GF(next_prime(2^32)), j=1728) + sage: list(E.isogenies_degree(2^2, _intermediate=True)) [Elliptic-curve endomorphism of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 Via: (u,r,s,t) = (1, 0, 0, 0), Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 to Elliptic Curve defined by @@ -1970,26 +1963,33 @@ def isogenies_degree(self, n, *, iter=False, _intermediate=False): Composite morphism of degree 4 = 2^2: From: Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 4294967311 To: Elliptic Curve defined by y^2 = x^3 + 4294967267*x + 112 over Finite Field of size 4294967311] - sage: it = E.isogenies_degree(2^2, iter=True); it - - sage: list(it) == E.isogenies_degree(2^2) - True - :: + The following curve has no degree-`5` isogenies, so the code is quick:: - sage: pol = PolynomialRing(QQ, 'x')([1, -3, 5, -5, 5, -3, 1]) - sage: L. = NumberField(pol) - sage: js = hilbert_class_polynomial(-23).roots(L, multiplicities=False) - sage: len(js) - 3 - sage: E = EllipticCurve(j=js[0]) - sage: len(E.isogenies_degree(2**2)) - 7 - sage: len(E.isogenies_degree(2**5)) # long time (15s) - 99 + sage: E = EllipticCurve(GF(103), [3, 5]) + sage: list(E.isogenies_degree(5 * product(prime_range(7, 100)))) + [] """ - it = self._isogenies_degree_helper(n, _intermediate=_intermediate) - return it if iter else list(it) + from sage.structure.factorization import Factorization + from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism + + if not isinstance(n, Factorization): + n_fac = Integer(n).factor() + else: + n_fac = n + + if n_fac.value() == 1: + yield identity_morphism(self) + return + + p = n_fac[-1][0] + for iso in self.isogenies_degree(n_fac / p, _intermediate=_intermediate): + if _intermediate: + yield iso + + Eiso = iso.codomain() + for next_iso in Eiso.isogenies_prime_degree(p): + yield next_iso * iso def is_isogenous(self, other, field=None): """ From f5d58340ce2213367854241bcc073c15430919cc Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Mon, 12 Feb 2024 15:53:31 +0000 Subject: [PATCH 8/8] write better code --- src/sage/schemes/elliptic_curves/ell_field.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index ee22aceea4a..62cd11d5792 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1974,16 +1974,14 @@ def isogenies_degree(self, n, *, _intermediate=False): from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism if not isinstance(n, Factorization): - n_fac = Integer(n).factor() - else: - n_fac = n + n = Integer(n).factor() - if n_fac.value() == 1: + if n.value() == 1: yield identity_morphism(self) return - p = n_fac[-1][0] - for iso in self.isogenies_degree(n_fac / p, _intermediate=_intermediate): + p = n[-1][0] + for iso in self.isogenies_degree(n / p, _intermediate=_intermediate): if _intermediate: yield iso