@@ -719,10 +719,10 @@ def __call__(self, a):
719
719
720
720
def _Hom_ (self , other , category ):
721
721
r"""
722
- Return ``DrinfeldModuleHomset( self, other, category) ``.
722
+ Return the set of morphisms from `` self`` to ``other ``.
723
723
724
724
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
726
726
the same category.
727
727
728
728
INPUT:
@@ -1196,8 +1196,8 @@ def height(self):
1196
1196
1197
1197
def is_isomorphic (self , other , absolutely = False ):
1198
1198
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 .
1201
1201
1202
1202
INPUT:
1203
1203
@@ -1296,6 +1296,13 @@ def is_isomorphic(self, other, absolutely=False):
1296
1296
r = self .rank ()
1297
1297
if other .rank () != r :
1298
1298
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.
1299
1306
q = self ._Fq .cardinality ()
1300
1307
A = self .gen ()
1301
1308
B = other .gen ()
@@ -1318,6 +1325,10 @@ def is_isomorphic(self, other, absolutely=False):
1318
1325
f = (q ** i - 1 ) // e
1319
1326
if A [i ] != B [i ] * ue ** f :
1320
1327
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.
1321
1332
if absolutely :
1322
1333
return True
1323
1334
else :
@@ -1737,6 +1748,8 @@ def hom(self, x, codomain=None):
1737
1748
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
1738
1749
Defn: z*t^3 + t^2 + z
1739
1750
1751
+ ::
1752
+
1740
1753
sage: phi.hom(T^2 + 1)
1741
1754
Endomorphism of Drinfeld module defined by T |--> z*t^3 + t^2 + z
1742
1755
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):
1774
1787
...
1775
1788
ValueError: the input does not define an isogeny
1776
1789
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
+
1777
1797
"""
1778
1798
# When `x` is in the function ring (or something that coerces to it):
1779
1799
if self .function_ring ().has_coerce_map_from (x .parent ()):
@@ -1791,3 +1811,36 @@ def hom(self, x, codomain=None):
1791
1811
# It's not straightforward because `left_divides` does not
1792
1812
# work currently because Sage does not know how to invert the
1793
1813
# 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 )
0 commit comments