Set of morphisms between two Drinfeld modules#
This module provides the class
sage.rings.function_field.drinfeld_module.homset.DrinfeldModuleHomset
.
AUTHORS:
Antoine Leudière (2022-04)
- class sage.rings.function_field.drinfeld_modules.homset.DrinfeldModuleHomset(X, Y, category=None, check=True)[source]#
Bases:
Homset
This class implements the set of morphisms between two Drinfeld \(\mathbb{F}_q[T]\)-modules.
INPUT:
X
– the domainY
– the codomain
EXAMPLES:
sage: Fq = GF(27) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(2) sage: phi = DrinfeldModule(A, [z6, z6, 2]) sage: psi = DrinfeldModule(A, [z6, 2*z6^5 + 2*z6^4 + 2*z6 + 1, 2]) sage: H = Hom(phi, psi) sage: H Set of Drinfeld module morphisms from (gen) 2*t^2 + z6*t + z6 to (gen) 2*t^2 + (2*z6^5 + 2*z6^4 + 2*z6 + 1)*t + z6
>>> from sage.all import * >>> Fq = GF(Integer(27)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(2), names=('z6',)); (z6,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [z6, z6, Integer(2)]) >>> psi = DrinfeldModule(A, [z6, Integer(2)*z6**Integer(5) + Integer(2)*z6**Integer(4) + Integer(2)*z6 + Integer(1), Integer(2)]) >>> H = Hom(phi, psi) >>> H Set of Drinfeld module morphisms from (gen) 2*t^2 + z6*t + z6 to (gen) 2*t^2 + (2*z6^5 + 2*z6^4 + 2*z6 + 1)*t + z6
sage: from sage.rings.function_field.drinfeld_modules.homset import DrinfeldModuleHomset sage: isinstance(H, DrinfeldModuleHomset) True
>>> from sage.all import * >>> from sage.rings.function_field.drinfeld_modules.homset import DrinfeldModuleHomset >>> isinstance(H, DrinfeldModuleHomset) True
There is a simpler syntax for endomorphisms sets:
sage: E = End(phi) sage: E Set of Drinfeld module morphisms from (gen) 2*t^2 + z6*t + z6 to (gen) 2*t^2 + z6*t + z6 sage: E is Hom(phi, phi) True
>>> from sage.all import * >>> E = End(phi) >>> E Set of Drinfeld module morphisms from (gen) 2*t^2 + z6*t + z6 to (gen) 2*t^2 + z6*t + z6 >>> E is Hom(phi, phi) True
The domain and codomain must have the same Drinfeld modules category:
sage: rho = DrinfeldModule(A, [Frac(A)(T), 1]) sage: Hom(phi, rho) Traceback (most recent call last): ... ValueError: Drinfeld modules must be in the same category
>>> from sage.all import * >>> rho = DrinfeldModule(A, [Frac(A)(T), Integer(1)]) >>> Hom(phi, rho) Traceback (most recent call last): ... ValueError: Drinfeld modules must be in the same category
sage: sigma = DrinfeldModule(A, [1, z6, 2]) sage: Hom(phi, sigma) Traceback (most recent call last): ... ValueError: Drinfeld modules must be in the same category
>>> from sage.all import * >>> sigma = DrinfeldModule(A, [Integer(1), z6, Integer(2)]) >>> Hom(phi, sigma) Traceback (most recent call last): ... ValueError: Drinfeld modules must be in the same category
One can create morphism objects by calling the homset:
sage: identity_morphism = E(1) sage: identity_morphism Identity morphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6
>>> from sage.all import * >>> identity_morphism = E(Integer(1)) >>> identity_morphism Identity morphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6
sage: t = phi.ore_polring().gen() sage: frobenius_endomorphism = E(t^6) sage: frobenius_endomorphism Endomorphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6 Defn: t^6
>>> from sage.all import * >>> t = phi.ore_polring().gen() >>> frobenius_endomorphism = E(t**Integer(6)) >>> frobenius_endomorphism Endomorphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6 Defn: t^6
sage: isogeny = H(t + 1) sage: isogeny Drinfeld Module morphism: From: Drinfeld module defined by T |--> 2*t^2 + z6*t + z6 To: Drinfeld module defined by T |--> 2*t^2 + (2*z6^5 + 2*z6^4 + 2*z6 + 1)*t + z6 Defn: t + 1
>>> from sage.all import * >>> isogeny = H(t + Integer(1)) >>> isogeny Drinfeld Module morphism: From: Drinfeld module defined by T |--> 2*t^2 + z6*t + z6 To: Drinfeld module defined by T |--> 2*t^2 + (2*z6^5 + 2*z6^4 + 2*z6 + 1)*t + z6 Defn: t + 1
And one can test if an Ore polynomial defines a morphism using the
in
syntax:sage: 1 in H False sage: t^6 in H False sage: t + 1 in H True sage: 1 in E True sage: t^6 in E True sage: t + 1 in E False
>>> from sage.all import * >>> Integer(1) in H False >>> t**Integer(6) in H False >>> t + Integer(1) in H True >>> Integer(1) in E True >>> t**Integer(6) in E True >>> t + Integer(1) in E False
This also works if the candidate is a morphism object:
sage: isogeny in H True sage: E(0) in E True sage: identity_morphism in H False sage: frobenius_endomorphism in H False
>>> from sage.all import * >>> isogeny in H True >>> E(Integer(0)) in E True >>> identity_morphism in H False >>> frobenius_endomorphism in H False
- Element[source]#
alias of
DrinfeldModuleMorphism
- class sage.rings.function_field.drinfeld_modules.homset.DrinfeldModuleMorphismAction(A, H, is_left, op)[source]#
Bases:
Action
Action of the function ring on the homset of a Drinfeld module.
EXAMPLES:
sage: Fq = GF(5) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(3) sage: phi = DrinfeldModule(A, [z, 1, z]) sage: psi = DrinfeldModule(A, [z, z^2 + 4*z + 3, 2*z^2 + 4*z + 4]) sage: H = Hom(phi, psi) sage: t = phi.ore_variable() sage: f = H(t + 2)
>>> from sage.all import * >>> Fq = GF(Integer(5)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(3), names=('z',)); (z,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [z, Integer(1), z]) >>> psi = DrinfeldModule(A, [z, z**Integer(2) + Integer(4)*z + Integer(3), Integer(2)*z**Integer(2) + Integer(4)*z + Integer(4)]) >>> H = Hom(phi, psi) >>> t = phi.ore_variable() >>> f = H(t + Integer(2))
Left action:
sage: (T + 1) * f Drinfeld Module morphism: From: Drinfeld module defined by T |--> z*t^2 + t + z To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z Defn: (2*z^2 + 4*z + 4)*t^3 + (2*z + 1)*t^2 + (2*z^2 + 4*z + 2)*t + 2*z + 2
>>> from sage.all import * >>> (T + Integer(1)) * f Drinfeld Module morphism: From: Drinfeld module defined by T |--> z*t^2 + t + z To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z Defn: (2*z^2 + 4*z + 4)*t^3 + (2*z + 1)*t^2 + (2*z^2 + 4*z + 2)*t + 2*z + 2
Right action currently does not work (it is a known bug, due to an incompatibility between multiplication of morphisms and the coercion system):
sage: f * (T + 1) Traceback (most recent call last): ... TypeError: right (=T + 1) must be a map to multiply it by Drinfeld Module morphism: From: Drinfeld module defined by T |--> z*t^2 + t + z To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z Defn: t + 2
>>> from sage.all import * >>> f * (T + Integer(1)) Traceback (most recent call last): ... TypeError: right (=T + 1) must be a map to multiply it by Drinfeld Module morphism: From: Drinfeld module defined by T |--> z*t^2 + t + z To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z Defn: t + 2