Drinfeld modules over a base#
This module provides the class
sage.category.drinfeld_modules.DrinfeldModules
.
AUTHORS:
Antoine Leudière (2022-04)
Xavier Caruso (2022-06)
- class sage.categories.drinfeld_modules.DrinfeldModules(base_field, name='t')[source]#
Bases:
Category_over_base_ring
This class implements the category of Drinfeld \(\mathbb{F}_q[T]\)-modules on a given base field.
Let \(\mathbb{F}_q[T]\) be a polynomial ring with coefficients in a finite field \(\mathbb{F}_q\) and let \(K\) be a field. Fix a ring morphism \(\gamma: \mathbb{F}_q[T] \to K\); we say that \(K\) is an \(\mathbb{F}_q[T]`*-field*. Let `K\{\tau\}\) be the ring of Ore polynomials with coefficients in \(K\), whose multiplication is given by the rule \(\tau \lambda = \lambda^q \tau\) for any \(\lambda \in K\).
The extension \(K\)/\(\mathbb{F}_q[T]\) (represented as an instance of the class
sage.rings.ring_extension.RingExtension
) is the base field of the category; its defining morphism \(\gamma\) is called the base morphism.The monic polynomial that generates the kernel of \(\gamma\) is called the \(\mathbb{F}_q[T]\)-characteristic, or function-field characteristic, of the base field. We say that \(\mathbb{F}_q[T]\) is the function ring of the category; \(K\{\tau\}\) is the Ore polynomial ring. The constant coefficient of the category is the image of \(T\) under the base morphism.
Construction
Generally, Drinfeld modules objects are created before their category, and the category is retrieved as an attribute of the Drinfeld module:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C Category of Drinfeld modules over Finite Field in z of size 11^4 over its base
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C Category of Drinfeld modules over Finite Field in z of size 11^4 over its base
The output tells the user that the category is only defined by its base.
Properties of the category
The base field is retrieved using the method
base()
.sage: C.base() Finite Field in z of size 11^4 over its base
Equivalently, one can use
base_morphism()
to retrieve the base morphism:sage: C.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field of size 11 To: Finite Field in z of size 11^4 over its base Defn: T |--> z^3 + 7*z^2 + 6*z + 10
>>> from sage.all import * >>> C.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field of size 11 To: Finite Field in z of size 11^4 over its base Defn: T |--> z^3 + 7*z^2 + 6*z + 10
The so-called constant coefficient — which is the same for all Drinfeld modules in the category — is simply the image of \(T\) by the base morphism:
sage: C.constant_coefficient() z^3 + 7*z^2 + 6*z + 10 sage: C.base_morphism()(T) == C.constant_coefficient() True
>>> from sage.all import * >>> C.constant_coefficient() z^3 + 7*z^2 + 6*z + 10 >>> C.base_morphism()(T) == C.constant_coefficient() True
Similarly, the function ring-characteristic of the category is either \(0\) or the unique monic polynomial in \(\mathbb{F}_q[T]\) that generates the kernel of the base:
sage: C.characteristic() T^2 + 7*T + 2 sage: C.base_morphism()(C.characteristic()) 0
>>> from sage.all import * >>> C.characteristic() T^2 + 7*T + 2 >>> C.base_morphism()(C.characteristic()) 0
The base field, base morphism, function ring and Ore polynomial ring are the same for the category and its objects:
sage: C.base() is phi.base() True sage: C.base_morphism() is phi.base_morphism() True sage: C.function_ring() Univariate Polynomial Ring in T over Finite Field of size 11 sage: C.function_ring() is phi.function_ring() True sage: C.ore_polring() Ore Polynomial Ring in t over Finite Field in z of size 11^4 over its base twisted by Frob sage: C.ore_polring() is phi.ore_polring() True
>>> from sage.all import * >>> C.base() is phi.base() True >>> C.base_morphism() is phi.base_morphism() True >>> C.function_ring() Univariate Polynomial Ring in T over Finite Field of size 11 >>> C.function_ring() is phi.function_ring() True >>> C.ore_polring() Ore Polynomial Ring in t over Finite Field in z of size 11^4 over its base twisted by Frob >>> C.ore_polring() is phi.ore_polring() True
Creating Drinfeld module objects from the category
Calling
object()
with an Ore polynomial creates a Drinfeld module object in the category whose generator is the input:sage: psi = C.object([p_root, 1]) sage: psi Drinfeld module defined by T |--> t + z^3 + 7*z^2 + 6*z + 10 sage: psi.category() is C True
>>> from sage.all import * >>> psi = C.object([p_root, Integer(1)]) >>> psi Drinfeld module defined by T |--> t + z^3 + 7*z^2 + 6*z + 10 >>> psi.category() is C True
Of course, the constant coefficient of the input must be the same as the category:
sage: C.object([z, 1]) Traceback (most recent call last): ... ValueError: constant coefficient must equal that of the category
>>> from sage.all import * >>> C.object([z, Integer(1)]) Traceback (most recent call last): ... ValueError: constant coefficient must equal that of the category
It is also possible to create a random object in the category. The input is the desired rank:
sage: rho = C.random_object(2) sage: rho # random Drinfeld module defined by T |--> (7*z^3 + 7*z^2 + 10*z + 2)*t^2 + (9*z^3 + 5*z^2 + 2*z + 7)*t + z^3 + 7*z^2 + 6*z + 10 sage: rho.rank() == 2 True sage: rho.category() is C True
>>> from sage.all import * >>> rho = C.random_object(Integer(2)) >>> rho # random Drinfeld module defined by T |--> (7*z^3 + 7*z^2 + 10*z + 2)*t^2 + (9*z^3 + 5*z^2 + 2*z + 7)*t + z^3 + 7*z^2 + 6*z + 10 >>> rho.rank() == Integer(2) True >>> rho.category() is C True
- Endsets()[source]#
Return the category of endsets.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: from sage.categories.homsets import Homsets sage: C.Endsets() is Homsets().Endsets() True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> from sage.categories.homsets import Homsets >>> C.Endsets() is Homsets().Endsets() True
- Homsets()[source]#
Return the category of homsets.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: from sage.categories.homsets import Homsets sage: C.Homsets() is Homsets() True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> from sage.categories.homsets import Homsets >>> C.Homsets() is Homsets() True
- class ParentMethods[source]#
Bases:
object
- base()[source]#
Return the base field of this Drinfeld module, viewed as an algebra over the function ring.
This is an instance of the class
sage.rings.ring_extension.RingExtension
.EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.base() Finite Field in z12 of size 5^12 over its base
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.base() Finite Field in z12 of size 5^12 over its base
The base can be infinite:
sage: sigma = DrinfeldModule(A, [Frac(A).gen(), 1]) sage: sigma.base() Fraction Field of Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 over its base
>>> from sage.all import * >>> sigma = DrinfeldModule(A, [Frac(A).gen(), Integer(1)]) >>> sigma.base() Fraction Field of Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 over its base
- base_morphism()[source]#
Return the base morphism of this Drinfeld module.
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 To: Finite Field in z12 of size 5^12 over its base Defn: T |--> 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 To: Finite Field in z12 of size 5^12 over its base Defn: T |--> 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
The base field can be infinite:
sage: sigma = DrinfeldModule(A, [Frac(A).gen(), 1]) sage: sigma.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 To: Fraction Field of Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 over its base Defn: T |--> T
>>> from sage.all import * >>> sigma = DrinfeldModule(A, [Frac(A).gen(), Integer(1)]) >>> sigma.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 To: Fraction Field of Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 over its base Defn: T |--> T
- base_over_constants_field()[source]#
Return the base field, seen as an extension over the constants field \(\mathbb{F}_q\).
This is an instance of the class
sage.rings.ring_extension.RingExtension
.EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.base_over_constants_field() Field in z12 with defining polynomial x^6 + (4*z2 + 3)*x^5 + x^4 + (3*z2 + 1)*x^3 + x^2 + (4*z2 + 1)*x + z2 over its base
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.base_over_constants_field() Field in z12 with defining polynomial x^6 + (4*z2 + 3)*x^5 + x^4 + (3*z2 + 1)*x^3 + x^2 + (4*z2 + 1)*x + z2 over its base
- characteristic()[source]#
Return the function ring-characteristic.
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.characteristic() T^2 + (4*z2 + 2)*T + 2 sage: phi.base_morphism()(phi.characteristic()) 0
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.characteristic() T^2 + (4*z2 + 2)*T + 2 >>> phi.base_morphism()(phi.characteristic()) 0
sage: B.<Y> = Fq[] sage: L = Frac(B) sage: psi = DrinfeldModule(A, [L(1), 0, 0, L(1)]) sage: psi.characteristic() Traceback (most recent call last): ... NotImplementedError: function ring characteristic not implemented in this case
>>> from sage.all import * >>> B = Fq['Y']; (Y,) = B._first_ngens(1) >>> L = Frac(B) >>> psi = DrinfeldModule(A, [L(Integer(1)), Integer(0), Integer(0), L(Integer(1))]) >>> psi.characteristic() Traceback (most recent call last): ... NotImplementedError: function ring characteristic not implemented in this case
- constant_coefficient()[source]#
Return the constant coefficient of the generator of this Drinfeld module.
OUTPUT: an element in the base field
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.constant_coefficient() == p_root True
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.constant_coefficient() == p_root True
Let \(\mathbb{F}_q[T]\) be the function ring, and let \(\gamma\) be the base of the Drinfeld module. The constant coefficient is \(\gamma(T)\):
sage: C = phi.category() sage: base = C.base() sage: base(T) == phi.constant_coefficient() True
>>> from sage.all import * >>> C = phi.category() >>> base = C.base() >>> base(T) == phi.constant_coefficient() True
Naturally, two Drinfeld modules in the same category have the same constant coefficient:
sage: t = phi.ore_polring().gen() sage: psi = C.object(phi.constant_coefficient() + t^3) sage: psi Drinfeld module defined by T |--> t^3 + 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
>>> from sage.all import * >>> t = phi.ore_polring().gen() >>> psi = C.object(phi.constant_coefficient() + t**Integer(3)) >>> psi Drinfeld module defined by T |--> t^3 + 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12
Reciprocally, it is impossible to create two Drinfeld modules in this category if they do not share the same constant coefficient:
sage: rho = C.object(phi.constant_coefficient() + 1 + t^3) Traceback (most recent call last): ... ValueError: constant coefficient must equal that of the category
>>> from sage.all import * >>> rho = C.object(phi.constant_coefficient() + Integer(1) + t**Integer(3)) Traceback (most recent call last): ... ValueError: constant coefficient must equal that of the category
- function_ring()[source]#
Return the function ring of this Drinfeld module.
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.function_ring() Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 sage: phi.function_ring() is A True
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.function_ring() Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2 >>> phi.function_ring() is A True
- ore_polring()[source]#
Return the Ore polynomial ring of this Drinfeld module.
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: S = phi.ore_polring() sage: S Ore Polynomial Ring in t over Finite Field in z12 of size 5^12 over its base twisted by Frob^2
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> S = phi.ore_polring() >>> S Ore Polynomial Ring in t over Finite Field in z12 of size 5^12 over its base twisted by Frob^2
The Ore polynomial ring can also be retrieved from the category of the Drinfeld module:
sage: S is phi.category().ore_polring() True
>>> from sage.all import * >>> S is phi.category().ore_polring() True
The generator of the Drinfeld module is in the Ore polynomial ring:
sage: phi(T) in S True
>>> from sage.all import * >>> phi(T) in S True
- ore_variable()[source]#
Return the variable of the Ore polynomial ring of this Drinfeld module.
EXAMPLES:
sage: Fq = GF(25) sage: A.<T> = Fq[] sage: K.<z12> = Fq.extension(6) sage: p_root = 2*z12^11 + 2*z12^10 + z12^9 + 3*z12^8 + z12^7 + 2*z12^5 + 2*z12^4 + 3*z12^3 + z12^2 + 2*z12 sage: phi = DrinfeldModule(A, [p_root, z12^3, z12^5]) sage: phi.ore_polring() Ore Polynomial Ring in t over Finite Field in z12 of size 5^12 over its base twisted by Frob^2 sage: phi.ore_variable() t
>>> from sage.all import * >>> Fq = GF(Integer(25)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(6), names=('z12',)); (z12,) = K._first_ngens(1) >>> p_root = Integer(2)*z12**Integer(11) + Integer(2)*z12**Integer(10) + z12**Integer(9) + Integer(3)*z12**Integer(8) + z12**Integer(7) + Integer(2)*z12**Integer(5) + Integer(2)*z12**Integer(4) + Integer(3)*z12**Integer(3) + z12**Integer(2) + Integer(2)*z12 >>> phi = DrinfeldModule(A, [p_root, z12**Integer(3), z12**Integer(5)]) >>> phi.ore_polring() Ore Polynomial Ring in t over Finite Field in z12 of size 5^12 over its base twisted by Frob^2 >>> phi.ore_variable() t
- base_morphism()[source]#
Return the base morphism of the category.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field of size 11 To: Finite Field in z of size 11^4 over its base Defn: T |--> z^3 + 7*z^2 + 6*z + 10 sage: C.constant_coefficient() == C.base_morphism()(T) True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.base_morphism() Ring morphism: From: Univariate Polynomial Ring in T over Finite Field of size 11 To: Finite Field in z of size 11^4 over its base Defn: T |--> z^3 + 7*z^2 + 6*z + 10 >>> C.constant_coefficient() == C.base_morphism()(T) True
- base_over_constants_field()[source]#
Return the base field, seen as an extension over the constants field \(\mathbb{F}_q\).
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.base_over_constants_field() Field in z with defining polynomial x^4 + 8*x^2 + 10*x + 2 over its base
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.base_over_constants_field() Field in z with defining polynomial x^4 + 8*x^2 + 10*x + 2 over its base
- characteristic()[source]#
Return the function ring-characteristic.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.characteristic() T^2 + 7*T + 2
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.characteristic() T^2 + 7*T + 2
sage: psi = DrinfeldModule(A, [Frac(A).gen(), 1]) sage: C = psi.category() sage: C.characteristic() 0
>>> from sage.all import * >>> psi = DrinfeldModule(A, [Frac(A).gen(), Integer(1)]) >>> C = psi.category() >>> C.characteristic() 0
- constant_coefficient()[source]#
Return the constant coefficient of the category.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.constant_coefficient() z^3 + 7*z^2 + 6*z + 10 sage: C.constant_coefficient() == C.base()(T) True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.constant_coefficient() z^3 + 7*z^2 + 6*z + 10 >>> C.constant_coefficient() == C.base()(T) True
- function_ring()[source]#
Return the function ring of the category.
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.function_ring() Univariate Polynomial Ring in T over Finite Field of size 11 sage: C.function_ring() is A True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.function_ring() Univariate Polynomial Ring in T over Finite Field of size 11 >>> C.function_ring() is A True
- object(gen)[source]#
Return a Drinfeld module object in the category whose generator is the input.
INPUT:
gen
– the generator of the Drinfeld module, given as an Ore polynomial or a list of coefficients
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: psi = DrinfeldModule(A, [p_root, 1]) sage: C = psi.category() sage: phi = C.object([p_root, 0, 1]) sage: phi Drinfeld module defined by T |--> t^2 + z^3 + 7*z^2 + 6*z + 10 sage: t = phi.ore_polring().gen() sage: C.object(t^2 + z^3 + 7*z^2 + 6*z + 10) is phi True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> psi = DrinfeldModule(A, [p_root, Integer(1)]) >>> C = psi.category() >>> phi = C.object([p_root, Integer(0), Integer(1)]) >>> phi Drinfeld module defined by T |--> t^2 + z^3 + 7*z^2 + 6*z + 10 >>> t = phi.ore_polring().gen() >>> C.object(t**Integer(2) + z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10)) is phi True
- ore_polring()[source]#
Return the Ore polynomial ring of the category
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.ore_polring() Ore Polynomial Ring in t over Finite Field in z of size 11^4 over its base twisted by Frob
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.ore_polring() Ore Polynomial Ring in t over Finite Field in z of size 11^4 over its base twisted by Frob
- random_object(rank)[source]#
Return a random Drinfeld module in the category with given rank.
INPUT:
rank
– an integer, the rank of the Drinfeld module
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: psi = C.random_object(3) # random Drinfeld module defined by T |--> (6*z^3 + 4*z^2 + 10*z + 9)*t^3 + (4*z^3 + 8*z^2 + 8*z)*t^2 + (10*z^3 + 3*z^2 + 6*z)*t + z^3 + 7*z^2 + 6*z + 10 sage: psi.rank() == 3 True
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> psi = C.random_object(Integer(3)) # random Drinfeld module defined by T |--> (6*z^3 + 4*z^2 + 10*z + 9)*t^3 + (4*z^3 + 8*z^2 + 8*z)*t^2 + (10*z^3 + 3*z^2 + 6*z)*t + z^3 + 7*z^2 + 6*z + 10 >>> psi.rank() == Integer(3) True
- super_categories()[source]#
EXAMPLES:
sage: Fq = GF(11) sage: A.<T> = Fq[] sage: K.<z> = Fq.extension(4) sage: p_root = z^3 + 7*z^2 + 6*z + 10 sage: phi = DrinfeldModule(A, [p_root, 0, 0, 1]) sage: C = phi.category() sage: C.super_categories() [Category of objects]
>>> from sage.all import * >>> Fq = GF(Integer(11)) >>> A = Fq['T']; (T,) = A._first_ngens(1) >>> K = Fq.extension(Integer(4), names=('z',)); (z,) = K._first_ngens(1) >>> p_root = z**Integer(3) + Integer(7)*z**Integer(2) + Integer(6)*z + Integer(10) >>> phi = DrinfeldModule(A, [p_root, Integer(0), Integer(0), Integer(1)]) >>> C = phi.category() >>> C.super_categories() [Category of objects]