Drinfeld module morphisms#
This module provides the class
sage.rings.function_fields.drinfeld_module.morphism.DrinfeldModuleMorphism
.
AUTHORS: - Antoine Leudière (2022-04)
- class sage.rings.function_field.drinfeld_modules.morphism.DrinfeldModuleMorphism(parent, ore_pol)#
Bases:
Morphism
,UniqueRepresentation
This class represents Drinfeld \(\mathbb{F}_q[T]\)-module morphisms.
Let \(\phi\) and \(\psi\) be two Drinfeld \(\mathbb{F}_q[T]\)-modules over a field \(K\). A morphism of Drinfeld modules \(\phi \to \psi\) is an Ore polynomial \(f \in K\{\tau\}\) such that \(f \phi_a = \psi_a f\) for every \(a \in \mathbb{F}_q[T]\). In our case, this is equivalent to \(f \phi_T = \psi_T f\). An isogeny is a nonzero morphism.
To create a morphism object, the user should never explicitly instantiate
DrinfeldModuleMorphism
, but rather call the parent homset with the defining Ore polynomial:sage: Fq = GF(4) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(3) sage: phi = DrinfeldModule(A, [z, z^2 + z, z^2 + z]) sage: t = phi.ore_polring().gen() sage: ore_pol = t + z^5 + z^3 + z + 1 sage: psi = phi.velu(ore_pol) sage: morphism = Hom(phi, psi)(ore_pol) sage: morphism Drinfeld Module morphism: From: Drinfeld module defined by T |--> (z^2 + z)*t^2 + (z^2 + z)*t + z To: Drinfeld module defined by T |--> (z^5 + z^2 + z + 1)*t^2 + (z^4 + z + 1)*t + z Defn: t + z^5 + z^3 + z + 1
The given Ore polynomial must indeed define a morphism:
sage: morphism = Hom(phi, psi)(1) Traceback (most recent call last): ... ValueError: Ore polynomial does not define a morphism
One can get basic data on the morphism:
sage: morphism.domain() Drinfeld module defined by T |--> (z^2 + z)*t^2 + (z^2 + z)*t + z sage: morphism.domain() is phi True sage: morphism.codomain() Drinfeld module defined by T |--> (z^5 + z^2 + z + 1)*t^2 + (z^4 + z + 1)*t + z sage: morphism.codomain() is psi True
sage: morphism.ore_polynomial() t + z^5 + z^3 + z + 1 sage: morphism.ore_polynomial() is ore_pol True
One can check various properties:
sage: morphism.is_zero() False sage: morphism.is_isogeny() True sage: morphism.is_endomorphism() False sage: morphism.is_isomorphism() False
- is_identity()#
Return
True
whether the morphism is the identity morphism.EXAMPLES:
sage: Fq = GF(2) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(6) sage: phi = DrinfeldModule(A, [z6, 1, 1]) sage: morphism = End(phi)(1) sage: morphism.is_identity() True
sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1]) sage: t = phi.ore_polring().gen() sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1) sage: morphism.is_identity() False
- is_isogeny()#
Return
True
whether the morphism is an isogeny.EXAMPLES:
sage: Fq = GF(2) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(6) sage: phi = DrinfeldModule(A, [z6, 1, 1]) sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1]) sage: t = phi.ore_polring().gen() sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1) sage: morphism.is_isogeny() True
sage: zero_morphism = End(phi)(0) sage: zero_morphism.is_isogeny() False
sage: identity_morphism = End(phi)(1) sage: identity_morphism.is_isogeny() True
sage: frobenius_endomorphism = phi.frobenius_endomorphism() sage: frobenius_endomorphism.is_isogeny() True
- is_isomorphism()#
Return
True
whether the morphism is an isomorphism.EXAMPLES:
sage: Fq = GF(2) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(6) sage: phi = DrinfeldModule(A, [z6, 1, 1]) sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1]) sage: t = phi.ore_polring().gen() sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1) sage: morphism.is_isomorphism() False
sage: zero_morphism = End(phi)(0) sage: zero_morphism.is_isomorphism() False
sage: identity_morphism = End(phi)(1) sage: identity_morphism.is_isomorphism() True
sage: frobenius_endomorphism = phi.frobenius_endomorphism() sage: frobenius_endomorphism.is_isomorphism() False
- is_zero()#
Return
True
whether the morphism is the zero morphism.EXAMPLES:
sage: Fq = GF(2) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(6) sage: phi = DrinfeldModule(A, [z6, 1, 1]) sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1]) sage: t = phi.ore_polring().gen() sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1) sage: morphism.is_zero() False
sage: zero_morphism = End(phi)(0) sage: zero_morphism.is_zero() True
- ore_polynomial()#
Return the Ore polynomial that defines the morphism.
EXAMPLES:
sage: Fq = GF(2) sage: A.<T> = Fq[] sage: K.<z6> = Fq.extension(6) sage: phi = DrinfeldModule(A, [z6, 1, 1]) sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1]) sage: t = phi.ore_polring().gen() sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1) sage: ore_pol = morphism.ore_polynomial() sage: ore_pol t + z6^5 + z6^2 + 1
sage: ore_pol * phi(T) == psi(T) * ore_pol True