@@ -963,7 +963,7 @@ class EllipticCurveIsogeny(EllipticCurveHom):
963
963
#
964
964
__base_field = None
965
965
__poly_ring = None # univariate in x over __base_field
966
- __mpoly_ring = None # bivariate in x, y over __base_field
966
+ __mpoly_ring = None # __base_field[x][y], internal use only
967
967
968
968
#
969
969
# Rational Maps
@@ -1003,7 +1003,7 @@ class EllipticCurveIsogeny(EllipticCurveHom):
1003
1003
#
1004
1004
__psi = None # psi polynomial
1005
1005
__phi = None # phi polynomial
1006
- __omega = None # omega polynomial
1006
+ __omega = None # omega polynomial, an element of k[x][y]
1007
1007
1008
1008
1009
1009
#
@@ -1559,7 +1559,7 @@ def __init_algebraic_structs(self, E):
1559
1559
sage: phi._EllipticCurveIsogeny__poly_ring # optional - sage.rings.finite_rings
1560
1560
Univariate Polynomial Ring in x over Finite Field of size 17
1561
1561
sage: phi._EllipticCurveIsogeny__mpoly_ring # optional - sage.rings.finite_rings
1562
- Multivariate Polynomial Ring in x, y over Finite Field of size 17
1562
+ Univariate Polynomial Ring in y over Univariate Polynomial Ring in x over Finite Field of size 17
1563
1563
1564
1564
Now, calling the initialization function does nothing more::
1565
1565
@@ -1571,7 +1571,7 @@ def __init_algebraic_structs(self, E):
1571
1571
sage: phi._EllipticCurveIsogeny__poly_ring # optional - sage.rings.finite_rings
1572
1572
Univariate Polynomial Ring in x over Finite Field of size 17
1573
1573
sage: phi._EllipticCurveIsogeny__mpoly_ring # optional - sage.rings.finite_rings
1574
- Multivariate Polynomial Ring in x, y over Finite Field of size 17
1574
+ Univariate Polynomial Ring in y over Univariate Polynomial Ring in x over Finite Field of size 17
1575
1575
1576
1576
sage: E = EllipticCurve(QQ, [0,0,0,1,0])
1577
1577
sage: phi = EllipticCurveIsogeny(E, E((0,0)))
@@ -1583,7 +1583,7 @@ def __init_algebraic_structs(self, E):
1583
1583
sage: phi._EllipticCurveIsogeny__poly_ring
1584
1584
Univariate Polynomial Ring in x over Rational Field
1585
1585
sage: phi._EllipticCurveIsogeny__mpoly_ring
1586
- Multivariate Polynomial Ring in x, y over Rational Field
1586
+ Univariate Polynomial Ring in y over Univariate Polynomial Ring in x over Rational Field
1587
1587
1588
1588
sage: F = GF(19); R.<x> = F[] # optional - sage.rings.finite_rings
1589
1589
sage: E = EllipticCurve(j=GF(19)(0)) # optional - sage.rings.finite_rings
@@ -1596,14 +1596,16 @@ def __init_algebraic_structs(self, E):
1596
1596
sage: phi._EllipticCurveIsogeny__poly_ring # optional - sage.rings.finite_rings
1597
1597
Univariate Polynomial Ring in x over Finite Field of size 19
1598
1598
sage: phi._EllipticCurveIsogeny__mpoly_ring # optional - sage.rings.finite_rings
1599
- Multivariate Polynomial Ring in x, y over Finite Field of size 19
1599
+ Univariate Polynomial Ring in y over Univariate Polynomial Ring in x over Finite Field of size 19
1600
1600
"""
1601
1601
self ._domain = E
1602
1602
self .__base_field = E .base_ring ()
1603
1603
self .__poly_ring = PolynomialRing (self .__base_field , ['x' ])
1604
- self .__mpoly_ring = PolynomialRing (self .__base_field , ['x' ,'y' ])
1604
+ self .__mpoly_ring = PolynomialRing (self .__poly_ring , ['y' ])
1605
+ # The fraction fields are implicitly part of the public API, being the parents
1606
+ # of the rational maps.
1605
1607
self .__xfield = FractionField (self .__poly_ring )
1606
- self .__xyfield = FractionField (self .__mpoly_ring )
1608
+ self .__xyfield = FractionField (PolynomialRing ( self .__base_field , [ 'x' , 'y' ]) )
1607
1609
1608
1610
def __compute_codomain (self ):
1609
1611
r"""
@@ -2157,7 +2159,7 @@ def __initialize_rational_maps_via_velu(self):
2157
2159
((x^4 + 5*x^3 + x^2 + 4*x)/(x^3 + 5*x^2 + 3*x + 5), (x^5*y - 2*x^3*y - x^2*y - 2*x*y + 2*y)/(x^5 + 3*x^3 + 3*x^2 + x - 1))
2158
2160
"""
2159
2161
x = self .__poly_ring .gen ()
2160
- y = self .__mpoly_ring .gen (1 )
2162
+ y = self .__xyfield .gen (1 )
2161
2163
return self .__compute_via_velu (x ,y )
2162
2164
2163
2165
def __init_kernel_polynomial_velu (self ):
@@ -2314,7 +2316,7 @@ def __init_even_kernel_polynomial(self, E, psi_G):
2314
2316
sage: from sage.schemes.elliptic_curves.ell_curve_isogeny import two_torsion_part
2315
2317
sage: psig = two_torsion_part(E,x) # optional - sage.rings.finite_rings
2316
2318
sage: phi._EllipticCurveIsogeny__init_even_kernel_polynomial(E,psig) # optional - sage.rings.finite_rings
2317
- (x^3 + 6*x, x^3*y + x*y, 6, 0, 1, 2)
2319
+ (x^3 + 6*x, ( x^3 + x) *y, 6, 0, 1, 2)
2318
2320
2319
2321
sage: F = GF(2^4, 'alpha'); R.<x> = F[] # optional - sage.rings.finite_rings
2320
2322
sage: E = EllipticCurve(F, [1,1,0,1,0]) # optional - sage.rings.finite_rings
@@ -2325,7 +2327,7 @@ def __init_even_kernel_polynomial(self, E, psi_G):
2325
2327
2326
2328
sage: psig = two_torsion_part(E,x) # optional - sage.rings.finite_rings
2327
2329
sage: phi._EllipticCurveIsogeny__init_even_kernel_polynomial(E,psig) # optional - sage.rings.finite_rings
2328
- (x^3 + x, x^3*y + x^2 + x*y , 1, 0, 1, 2)
2330
+ (x^3 + x, ( x^3 + x)*y + x^2 , 1, 0, 1, 2)
2329
2331
2330
2332
sage: E = EllipticCurve(GF(7), [0,-1,0,0,1]) # optional - sage.rings.finite_rings
2331
2333
sage: R.<x> = GF(7)[] # optional - sage.rings.finite_rings
@@ -2337,7 +2339,7 @@ def __init_even_kernel_polynomial(self, E, psi_G):
2337
2339
sage: psig = two_torsion_part(E,f) # optional - sage.rings.finite_rings
2338
2340
sage: psig = two_torsion_part(E,f) # optional - sage.rings.finite_rings
2339
2341
sage: phi._EllipticCurveIsogeny__init_even_kernel_polynomial(E,psig) # optional - sage.rings.finite_rings
2340
- (x^7 + 5*x^6 + 2*x^5 + 6*x^4 + 3*x^3 + 5*x^2 + 6*x + 3, x^9*y - 3 *x^8*y + 2*x^7*y - 3 *x^3*y + 2*x^2*y + x*y - y, 1, 6, 3, 4)
2342
+ (x^7 + 5*x^6 + 2*x^5 + 6*x^4 + 3*x^3 + 5*x^2 + 6*x + 3, ( x^9 + 4 *x^8 + 2*x^7 + 4 *x^3 + 2*x^2 + x + 6)* y, 1, 6, 3, 4)
2341
2343
"""
2342
2344
# check if the polynomial really divides the two_torsion_polynomial
2343
2345
if self .__check and E .division_polynomial (2 , x = self .__poly_ring .gen ()) % psi_G != 0 :
@@ -2349,7 +2351,7 @@ def __init_even_kernel_polynomial(self, E, psi_G):
2349
2351
a1 , a2 , a3 , a4 , a6 = E .a_invariants ()
2350
2352
b2 , b4 , _ , _ = E .b_invariants ()
2351
2353
x = self .__poly_ring .gen ()
2352
- y = self .__mpoly_ring .gen (1 )
2354
+ y = self .__mpoly_ring .gen ()
2353
2355
2354
2356
if n == 1 :
2355
2357
x0 = - psi_G .constant_coefficient ()
@@ -2430,7 +2432,7 @@ def __init_odd_kernel_polynomial(self, E, psi):
2430
2432
2431
2433
sage: R.<x> = GF(7)[] # optional - sage.rings.finite_rings
2432
2434
sage: phi._EllipticCurveIsogeny__init_odd_kernel_polynomial(E, x+6) # optional - sage.rings.finite_rings
2433
- (x^3 + 5*x^2 + 3*x + 2, x^3*y - 3 *x^2*y + x*y, 2, 6, 1, 3)
2435
+ (x^3 + 5*x^2 + 3*x + 2, ( x^3 + 4 *x^2 + x) *y, 2, 6, 1, 3)
2434
2436
2435
2437
sage: F = GF(2^4, 'alpha'); R.<x> = F[] # optional - sage.rings.finite_rings
2436
2438
sage: alpha = F.gen() # optional - sage.rings.finite_rings
@@ -2444,7 +2446,7 @@ def __init_odd_kernel_polynomial(self, E, psi):
2444
2446
sage: R.<x> = F[] # optional - sage.rings.finite_rings
2445
2447
sage: f = x + alpha^2 + 1 # optional - sage.rings.finite_rings
2446
2448
sage: phi._EllipticCurveIsogeny__init_odd_kernel_polynomial(E, f) # optional - sage.rings.finite_rings
2447
- (x^3 + (alpha^2 + 1)*x + alpha^3 + alpha^2 + alpha, x^3*y + (alpha^2 + 1)*x^2*y + (alpha^2 + alpha + 1)*x^2 + (alpha^2 + 1)*x*y + (alpha^2 + alpha)*x + alpha*y + alpha, alpha^2 + alpha + 1, alpha^3 + alpha^2 + alpha, 1, 3)
2449
+ (x^3 + (alpha^2 + 1)*x + alpha^3 + alpha^2 + alpha, ( x^3 + (alpha^2 + 1)*x^2 + (alpha^2 + 1)*x + alpha)*y + (alpha^2 + alpha + 1)*x^2 + (alpha^2 + alpha)*x + alpha, alpha^2 + alpha + 1, alpha^3 + alpha^2 + alpha, 1, 3)
2448
2450
2449
2451
sage: E = EllipticCurve(j=-262537412640768000) # optional - sage.rings.finite_rings
2450
2452
sage: f = E.isogenies_prime_degree()[0].kernel_polynomial() # optional - sage.rings.finite_rings
@@ -2536,11 +2538,12 @@ def __compute_omega_fast(self, E, psi, psi_pr, phi, phi_pr):
2536
2538
sage: fi = phi._EllipticCurveIsogeny__phi # optional - sage.rings.finite_rings
2537
2539
sage: fi_pr = fi.derivative() # optional - sage.rings.finite_rings
2538
2540
sage: phi._EllipticCurveIsogeny__compute_omega_fast(E, psi, psi_pr, fi, fi_pr) # optional - sage.rings.finite_rings
2539
- x^3*y - 3 *x^2*y + x*y
2541
+ ( x^3 + 4 *x^2 + x) *y
2540
2542
"""
2541
2543
a1 = E .a1 ()
2542
2544
a3 = E .a3 ()
2543
- x , y = self .__mpoly_ring .gens ()
2545
+ x = self .__poly_ring .gen ()
2546
+ y = self .__mpoly_ring .gen ()
2544
2547
2545
2548
psi_2 = 2 * y + a1 * x + a3
2546
2549
@@ -2587,7 +2590,7 @@ def __compute_omega_general(self, E, psi, psi_pr, phi, phi_pr):
2587
2590
sage: fi = phi._EllipticCurveIsogeny__phi # optional - sage.rings.finite_rings
2588
2591
sage: fi_pr = fi.derivative() # optional - sage.rings.finite_rings
2589
2592
sage: phi._EllipticCurveIsogeny__compute_omega_general(E, psi, psi_pr, fi, fi_pr) # optional - sage.rings.finite_rings
2590
- x^3*y + (alpha^2 + 1)*x^2*y + (alpha^2 + alpha + 1)*x^2 + (alpha^2 + 1)*x*y + (alpha^2 + alpha)*x + alpha*y + alpha
2593
+ ( x^3 + (alpha^2 + 1)*x^2 + (alpha^2 + 1)*x + alpha)*y + (alpha^2 + alpha + 1)*x^2 + (alpha^2 + alpha)*x + alpha
2591
2594
2592
2595
A bug fixed in :trac:`7907`::
2593
2596
@@ -2604,7 +2607,8 @@ def __compute_omega_general(self, E, psi, psi_pr, phi, phi_pr):
2604
2607
"""
2605
2608
a1 , a2 , a3 , a4 , a6 = E .a_invariants ()
2606
2609
b2 , b4 , _ , _ = E .b_invariants ()
2607
- x , y = self .__mpoly_ring .gens ()
2610
+ x = self .__poly_ring .gen ()
2611
+ y = self .__mpoly_ring .gen ()
2608
2612
2609
2613
n = psi .degree ()
2610
2614
d = 2 * n + 1
@@ -2693,7 +2697,9 @@ def __compute_via_kohel(self, xP, yP):
2693
2697
((x^3 - 2*x^2 + 3*x + 2)/(x^2 - 2*x + 1), (x^3*y - 3*x^2*y + x*y)/(x^3 - 3*x^2 + 3*x - 1))
2694
2698
"""
2695
2699
a = self .__phi (xP )
2696
- b = self .__omega (xP , yP )
2700
+ omega0 = self .__omega [0 ]
2701
+ omega1 = self .__omega [1 ]
2702
+ b = omega0 (xP ) + omega1 (xP )* yP
2697
2703
c = self .__psi (xP )
2698
2704
return a / c ** 2 , b / c ** 3
2699
2705
0 commit comments