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)#
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
sage: from sage.rings.function_field.drinfeld_modules.homset import DrinfeldModuleHomset sage: 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
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
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
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
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
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
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
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
- Element#
alias of
DrinfeldModuleMorphism
- class sage.rings.function_field.drinfeld_modules.homset.DrinfeldModuleMorphismAction(A, H, is_left, op)#
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)
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
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