Skip to content

Commit f87597c

Browse files
committed
Antoine's comments
1 parent ec5691f commit f87597c

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -719,10 +719,10 @@ def __call__(self, a):
719719

720720
def _Hom_(self, other, category):
721721
r"""
722-
Return ``DrinfeldModuleHomset(self, other, category)``.
722+
Return the set of morphisms from ``self`` to ``other``.
723723
724724
Validity of the input is checked at the instantiation of
725-
``DrinfeldModuleHomset``. ``self`` and ``other`` only need be in
725+
``DrinfeldModuleHomset``; ``self`` and ``other`` only need be in
726726
the same category.
727727
728728
INPUT:
@@ -1196,8 +1196,8 @@ def height(self):
11961196

11971197
def is_isomorphic(self, other, absolutely=False):
11981198
r"""
1199-
Return ``True`` if this Drinfeld module is isomorphic to
1200-
``other``.
1199+
Return ``True`` if this Drinfeld module is isomorphic to ``other``;
1200+
return ``False`` otherwise.
12011201
12021202
INPUT:
12031203
@@ -1296,6 +1296,13 @@ def is_isomorphic(self, other, absolutely=False):
12961296
r = self.rank()
12971297
if other.rank() != r:
12981298
return False
1299+
# Check if there exists u such that u*self_X = other_X*u:
1300+
# if self_X = a_0 + a_1*t + ... + a_r*t^r
1301+
# and other_x = b_0 + b_1*t + ... + b_r*t^r
1302+
# this reduced to finding solution of the system:
1303+
# b_i * u^(q^i - 1) = a_i (0 <= i <= r)
1304+
# which, using gcds, can be reduced to a unique equation
1305+
# of the form u^e = ue.
12991306
q = self._Fq.cardinality()
13001307
A = self.gen()
13011308
B = other.gen()
@@ -1318,6 +1325,10 @@ def is_isomorphic(self, other, absolutely=False):
13181325
f = (q**i - 1) // e
13191326
if A[i] != B[i] * ue**f:
13201327
return False
1328+
# Solve the equation u^e = ue
1329+
# - when absolutely=True, on the algebraic closure (then a
1330+
# solution always exists)
1331+
# - when absolutely=False, on the ground field.
13211332
if absolutely:
13221333
return True
13231334
else:
@@ -1737,6 +1748,8 @@ def hom(self, x, codomain=None):
17371748
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
17381749
Defn: z*t^3 + t^2 + z
17391750
1751+
::
1752+
17401753
sage: phi.hom(T^2 + 1)
17411754
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
17421755
Defn: z^2*t^6 + (3*z^2 + z + 1)*t^5 + t^4 + 2*z^2*t^3 + (3*z^2 + z + 1)*t^2 + z^2 + 1
@@ -1774,6 +1787,13 @@ def hom(self, x, codomain=None):
17741787
...
17751788
ValueError: the input does not define an isogeny
17761789
1790+
::
1791+
1792+
sage: phi.hom(t + 1, codomain=phi)
1793+
Traceback (most recent call last):
1794+
...
1795+
ValueError: Ore polynomial does not define a morphism
1796+
17771797
"""
17781798
# When `x` is in the function ring (or something that coerces to it):
17791799
if self.function_ring().has_coerce_map_from(x.parent()):
@@ -1791,3 +1811,36 @@ def hom(self, x, codomain=None):
17911811
# It's not straightforward because `left_divides` does not
17921812
# work currently because Sage does not know how to invert the
17931813
# Frobenius endomorphism; this is due to the RingExtension stuff.
1814+
1815+
def scalar_multiplication(self, x):
1816+
r"""
1817+
Return the endomorphism of this Drinfeld module, which is
1818+
the multiplication by `x`, i.e. the isogeny defined by the
1819+
Ore polynomial `\phi_x`.
1820+
1821+
INPUT:
1822+
1823+
- ``x`` -- an element in the ring of functions
1824+
1825+
EXAMPLES::
1826+
1827+
sage: Fq = GF(5)
1828+
sage: A.<T> = Fq[]
1829+
sage: K.<z> = Fq.extension(3)
1830+
sage: phi = DrinfeldModule(A, [z, 0, 1, z])
1831+
sage: phi
1832+
Drinfeld module defined by T |--> z*t^3 + t^2 + z
1833+
sage: phi.hom(T)
1834+
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
1835+
Defn: z*t^3 + t^2 + z
1836+
1837+
::
1838+
1839+
sage: phi.hom(T^2 + 1)
1840+
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
1841+
Defn: z^2*t^6 + (3*z^2 + z + 1)*t^5 + t^4 + 2*z^2*t^3 + (3*z^2 + z + 1)*t^2 + z^2 + 1
1842+
1843+
"""
1844+
if not self.function_ring().has_coerce_map_from(x.parent()):
1845+
raise ValueError("%s is not element of the function ring" % x)
1846+
return self.Hom(self)(x)

src/sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ def invert(self, ore_pol):
407407
...
408408
ValueError: input must be in the image of the Drinfeld module
409409
410+
::
411+
410412
sage: phi.invert(t^4 + t^2 + 1)
411413
Traceback (most recent call last):
412414
...
@@ -475,6 +477,7 @@ def invert(self, ore_pol):
475477
mat = Matrix(mat_rows)
476478
vec = vector([ore_pol[r*j] for j in range(k+1)])
477479
coeffs_K = list(mat.inverse() * vec)
480+
# Cast the coefficients to Fq
478481
try:
479482
coeffs_Fq = [K(c).in_base() for c in coeffs_K]
480483
pre_image = A(coeffs_Fq)

0 commit comments

Comments
 (0)