Skip to content

Use the variable name τ instead of t for Drinfeld modules #40430

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 85 additions & 41 deletions src/sage/categories/drinfeld_modules.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# sage_setup: distribution = sagemath-categories
# sage.doctest: needs sage.rings.finite_rings
r"""
Expand Down Expand Up @@ -70,7 +71,7 @@ class DrinfeldModules(Category_over_base_ring):
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
Category of Drinfeld modules over Finite Field in z of size 11^4

The output tells the user that the category is only defined by its
base.
Expand All @@ -88,7 +89,7 @@ class DrinfeldModules(Category_over_base_ring):
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
To: Finite Field in z of size 11^4
Defn: T |--> z^3 + 7*z^2 + 6*z + 10

The so-called constant coefficient --- which is the same for all
Expand Down Expand Up @@ -123,7 +124,7 @@ class DrinfeldModules(Category_over_base_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
Ore Polynomial Ring in τ over Finite Field in z of size 11^4 twisted by z |--> z^11
sage: C.ore_polring() is phi.ore_polring()
True

Expand All @@ -135,7 +136,7 @@ class DrinfeldModules(Category_over_base_ring):

sage: psi = C.object([p_root, 1])
sage: psi
Drinfeld module defined by T |--> t + z^3 + 7*z^2 + 6*z + 10
Drinfeld module defined by T |--> τ + z^3 + 7*z^2 + 6*z + 10
sage: psi.category() is C
True

Expand Down Expand Up @@ -165,20 +166,24 @@ class DrinfeldModules(Category_over_base_ring):
sage: K.<z> = Fq.extension(4)
sage: from sage.categories.drinfeld_modules import DrinfeldModules
sage: base = Hom(A, K)(0)
sage: C = DrinfeldModules(base)
sage: C = DrinfeldModules(base) # known bug (blankline)
<BLANKLINE>
Traceback (most recent call last):
...
TypeError: base field must be a ring extension

::
Note that `C.base_morphism()` has codomain `K` while
the defining morphism of `C.base()` has codomain `K` viewed
as an `A`-field. Thus, they differ::

sage: C.base().defining_morphism() == C.base_morphism()
True
False

::

sage: base = Hom(A, A)(1)
sage: C = DrinfeldModules(base)
sage: C = DrinfeldModules(base) # known bug (blankline)
<BLANKLINE>
Traceback (most recent call last):
...
TypeError: base field must be a ring extension
Expand All @@ -203,7 +208,7 @@ class DrinfeldModules(Category_over_base_ring):
TypeError: function ring base must be a finite field
"""

def __init__(self, base_field, name='t'):
def __init__(self, base_morphism, name='τ'):
r"""
Initialize ``self``.

Expand All @@ -212,7 +217,7 @@ def __init__(self, base_field, name='t'):
- ``base_field`` -- the base field, which is a ring extension
over a base

- ``name`` -- (default: ``'t'``) the name of the Ore polynomial
- ``name`` -- (default: ``'τ'``) the name of the Ore polynomial
variable

TESTS::
Expand All @@ -223,34 +228,23 @@ def __init__(self, base_field, name='t'):
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: ore_polring.<t> = OrePolynomialRing(phi.base(), phi.base().frobenius_endomorphism())
sage: ore_polring.<τ> = OrePolynomialRing(K, K.frobenius_endomorphism())
sage: C._ore_polring is ore_polring
True
sage: i = phi.base().coerce_map_from(K)
sage: base_morphism = Hom(A, K)(p_root)
sage: C.base() == K.over(base_morphism)
True
sage: C._base_morphism == i * base_morphism
True
sage: C._function_ring is A
True
sage: C._constant_coefficient == base_morphism(T)
sage: C._constant_coefficient == C._base_morphism(T)
True
sage: C._characteristic(C._constant_coefficient)
0
"""
# Check input is a ring extension
if not isinstance(base_field, RingExtension_generic):
raise TypeError('base field must be a ring extension')
base_morphism = base_field.defining_morphism()
self._base_morphism = base_morphism
function_ring = self._function_ring = base_morphism.domain()
base_field = self._base_field = base_morphism.codomain()
# Check input is a field
if not base_field.is_field():
raise TypeError('input must be a field')
self._base_field = base_field
self._function_ring = base_morphism.domain()
# Check domain of base morphism is Fq[T]
function_ring = self._function_ring
if not isinstance(function_ring, PolynomialRing_generic):
raise NotImplementedError('function ring must be a polynomial '
'ring')
Expand All @@ -262,7 +256,7 @@ def __init__(self, base_field, name='t'):
Fq = function_ring_base
A = function_ring
T = A.gen()
K = base_field # A ring extension
K = base_field
# Build K{t}
d = log(Fq.cardinality(), Fq.characteristic())
tau = K.frobenius_endomorphism(d)
Expand All @@ -284,7 +278,7 @@ def __init__(self, base_field, name='t'):
i = A.coerce_map_from(Fq)
Fq_to_K = self._base_morphism * i
self._base_over_constants_field = base_field.over(Fq_to_K)
super().__init__(base=base_field)
super().__init__(base=base_field.over(base_morphism))

def _latex_(self):
r"""
Expand Down Expand Up @@ -321,7 +315,7 @@ def _repr_(self):
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
Category of Drinfeld modules over Finite Field in z of size 11^4
"""
return f'Category of Drinfeld modules over {self._base_field}'

Expand Down Expand Up @@ -363,6 +357,30 @@ def Endsets(self):
"""
return Homsets().Endsets()

def A_field(self):
r"""
Return the underlying `A`-field of this category,
viewed as an algebra over the function ring `A`.

This is an instance of the class
:class:`sage.rings.ring_extension.RingExtension`.

NOTE::

This method has the same behavior as :meth:`base`.

EXAMPLES::

sage: Fq = GF(25)
sage: A.<T> = Fq[]
sage: K.<z> = Fq.extension(6)
sage: phi = DrinfeldModule(A, [z, z^3, z^5])
sage: C = phi.category()
sage: C.A_field()
Finite Field in z of size 5^12 over its base
"""
return self.base()

def base_morphism(self):
r"""
Return the base morphism of the category.
Expand All @@ -378,7 +396,7 @@ def base_morphism(self):
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
To: Finite Field in z of size 11^4
Defn: T |--> z^3 + 7*z^2 + 6*z + 10

sage: C.constant_coefficient() == C.base_morphism()(T)
Expand Down Expand Up @@ -490,7 +508,7 @@ def object(self, gen):

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
Drinfeld module defined by 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
Expand All @@ -517,7 +535,7 @@ def ore_polring(self):
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
Ore Polynomial Ring in τ over Finite Field in z of size 11^4 twisted by z |--> z^11
"""
return self._ore_polring

Expand Down Expand Up @@ -575,14 +593,41 @@ def super_categories(self):

class ParentMethods:

def A_field(self):
r"""
Return the underlying `A`-field of this Drinfeld module,
viewed as an algebra over the function ring `A`.

This is an instance of the class
:class:`sage.rings.ring_extension.RingExtension`.

NOTE::

This method has the same behavior as :meth:`base`.

EXAMPLES::

sage: Fq = GF(25)
sage: A.<T> = Fq[]
sage: K.<z> = Fq.extension(6)
sage: phi = DrinfeldModule(A, [z, z^3, z^5])
sage: phi.A_field()
Finite Field in z of size 5^12 over its base
"""
return self.category().A_field()

def base(self):
r"""
Return the base field of this Drinfeld module, viewed as
an algebra over the function ring.
Return the underlying `A`-field of this Drinfeld module,
viewed as an algebra over the function ring `A`.

This is an instance of the class
:class:`sage.rings.ring_extension.RingExtension`.

NOTE::

This method has the same behavior as :meth:`A_field`.

EXAMPLES::

sage: Fq = GF(25)
Expand Down Expand Up @@ -615,17 +660,16 @@ def base_morphism(self):
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
To: Finite Field in z12 of size 5^12
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:
Coercion map:
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
To: Fraction Field of Univariate Polynomial Ring in T over Finite Field in z2 of size 5^2
"""
return self.category().base_morphism()

Expand Down Expand Up @@ -727,7 +771,7 @@ def constant_coefficient(self):
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
Drinfeld module defined by 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
Expand All @@ -753,7 +797,7 @@ def ore_polring(self):
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
Ore Polynomial Ring in τ over Finite Field in z12 of size 5^12 twisted by z12 |--> z12^(5^2)

The Ore polynomial ring can also be retrieved from the category
of the Drinfeld module::
Expand Down Expand Up @@ -782,8 +826,8 @@ def ore_variable(self):
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
Ore Polynomial Ring in τ over Finite Field in z12 of size 5^12 twisted by z12 |--> z12^(5^2)
sage: phi.ore_variable()
t
τ
"""
return self.category().ore_polring().gen()
7 changes: 4 additions & 3 deletions src/sage/rings/function_field/drinfeld_modules/action.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# sage.doctest: needs sage.rings.finite_rings
r"""
The module action induced by a Drinfeld module
Expand Down Expand Up @@ -60,7 +61,7 @@ class DrinfeldModuleAction(Action):
sage: action = phi.action()
sage: action
Action on Finite Field in z of size 11^2 over its base
induced by Drinfeld module defined by T |--> t^3 + z
induced by Drinfeld module defined by T |--> τ^3 + z

The action on elements is computed as follows::

Expand Down Expand Up @@ -154,7 +155,7 @@ def _latex_(self):
sage: phi = DrinfeldModule(A, [z, 0, 0, 1])
sage: action = phi.action()
sage: latex(action)
\text{Action{ }on{ }}\Bold{F}_{11^{2}}\text{{ }induced{ }by{ }}\phi: T \mapsto t^{3} + z
\text{Action{ }on{ }}\Bold{F}_{11^{2}}\text{{ }induced{ }by{ }}\phi: T \mapsto τ^{3} + z
"""
return f'\\text{{Action{{ }}on{{ }}}}' \
f'{latex(self._base)}\\text{{{{ }}' \
Expand All @@ -174,7 +175,7 @@ def _repr_(self):
sage: phi = DrinfeldModule(A, [z, 0, 0, 1])
sage: action = phi.action()
sage: action
Action on Finite Field in z of size 11^2 over its base induced by Drinfeld module defined by T |--> t^3 + z
Action on Finite Field in z of size 11^2 over its base induced by Drinfeld module defined by T |--> τ^3 + z
"""
return f'Action on {self._base} induced by ' \
f'{self._drinfeld_module}'
Expand Down
Loading
Loading