Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit e8b6105

Browse files
author
Travis Scrimshaw
committed
Added list of basis and finite-dimensionality to finite rank free modules.
1 parent 769ff19 commit e8b6105

File tree

6 files changed

+152
-98
lines changed

6 files changed

+152
-98
lines changed

src/sage/tensor/modules/ext_pow_free_module.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class ExtPowerFreeModule(FiniteRankFreeModule):
103103
``A`` is a module (actually a free module) over `\ZZ`::
104104
105105
sage: A.category()
106-
Category of modules over Integer Ring
106+
Category of finite dimensional modules over Integer Ring
107107
sage: A in Modules(ZZ)
108108
True
109109
sage: A.rank()

src/sage/tensor/modules/finite_rank_free_module.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class :class:`~sage.modules.free_module.FreeModule_generic`
5252
sage: M = FiniteRankFreeModule(ZZ, 2, name='M') ; M
5353
Rank-2 free module M over the Integer Ring
5454
sage: M.category()
55-
Category of modules over Integer Ring
55+
Category of finite dimensional modules over Integer Ring
5656
5757
We introduce a first basis on ``M``::
5858
@@ -241,7 +241,7 @@ class :class:`~sage.modules.free_module.FreeModule_generic`
241241
This is also revealed by the category of each module::
242242
243243
sage: M.category()
244-
Category of modules over Integer Ring
244+
Category of finite dimensional modules over Integer Ring
245245
sage: N.category()
246246
Category of finite dimensional modules with basis over
247247
(euclidean domains and infinite enumerated sets and metric spaces)
@@ -385,7 +385,7 @@ class :class:`~sage.modules.free_module.FreeModule_generic`
385385
sage: V = FiniteRankFreeModule(QQ, 3, name='V') ; V
386386
3-dimensional vector space V over the Rational Field
387387
sage: V.category()
388-
Category of vector spaces over Rational Field
388+
Category of finite dimensional vector spaces over Rational Field
389389
sage: V.bases()
390390
[]
391391
sage: V.print_bases()
@@ -592,7 +592,7 @@ class :class:`~sage.modules.module.Module`.
592592
sage: M = FiniteRankFreeModule(ZZ, 3, name='M') ; M # declaration with a name
593593
Rank-3 free module M over the Integer Ring
594594
sage: M.category()
595-
Category of modules over Integer Ring
595+
Category of finite dimensional modules over Integer Ring
596596
sage: M.base_ring()
597597
Integer Ring
598598
sage: M.rank()
@@ -604,7 +604,7 @@ class :class:`~sage.modules.module.Module`.
604604
sage: V = FiniteRankFreeModule(QQ, 3, name='V') ; V
605605
3-dimensional vector space V over the Rational Field
606606
sage: V.category()
607-
Category of vector spaces over Rational Field
607+
Category of finite dimensional vector spaces over Rational Field
608608
609609
The LaTeX output is adjusted via the parameter ``latex_name``::
610610
@@ -745,7 +745,7 @@ class :class:`~sage.modules.module.Module`.
745745
Element = FiniteRankFreeModuleElement
746746

747747
def __init__(self, ring, rank, name=None, latex_name=None, start_index=0,
748-
output_formatter=None):
748+
output_formatter=None, category=None):
749749
r"""
750750
See :class:`FiniteRankFreeModule` for documentation and examples.
751751
@@ -761,7 +761,8 @@ def __init__(self, ring, rank, name=None, latex_name=None, start_index=0,
761761
"""
762762
if ring not in Rings().Commutative():
763763
raise TypeError("the module base ring must be commutative")
764-
Parent.__init__(self, base=ring, category=Modules(ring))
764+
category = Modules(ring).FiniteDimensional().or_subcategory(category)
765+
Parent.__init__(self, base=ring, category=category)
765766
self._ring = ring # same as self._base
766767
self._rank = rank
767768
self._name = name
@@ -890,12 +891,12 @@ def _Hom_(self, other, category=None):
890891
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
891892
sage: H = M._Hom_(N) ; H
892893
Set of Morphisms from Rank-3 free module M over the Integer Ring
893-
to Rank-2 free module N over the Integer Ring in Category of
894-
modules over Integer Ring
894+
to Rank-2 free module N over the Integer Ring
895+
in Category of finite dimensional modules over Integer Ring
895896
sage: H = Hom(M,N) ; H # indirect doctest
896897
Set of Morphisms from Rank-3 free module M over the Integer Ring
897-
to Rank-2 free module N over the Integer Ring in Category of
898-
modules over Integer Ring
898+
to Rank-2 free module N over the Integer Ring
899+
in Category of finite dimensional modules over Integer Ring
899900
900901
"""
901902
from free_module_homset import FreeModuleHomset

src/sage/tensor/modules/free_module_basis.py

Lines changed: 118 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,114 @@
2727
# http://www.gnu.org/licenses/
2828
#******************************************************************************
2929

30-
from sage.structure.sage_object import SageObject
3130
from sage.structure.unique_representation import UniqueRepresentation
31+
from sage.structure.sage_object import SageObject
32+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
33+
34+
class Basis_abstract(UniqueRepresentation, SageObject):
35+
"""
36+
Abstract base class for (dual) bases of free modules.
37+
"""
38+
def __init__(self, fmodule, symbol, latex_symbol, latex_name):
39+
"""
40+
Initialize ``self``.
41+
42+
EXAMPLES::
43+
44+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
45+
sage: e = M.basis('e')
46+
sage: e._fmodule is M
47+
True
48+
"""
49+
self._symbol = symbol
50+
self._latex_symbol = latex_symbol
51+
self._latex_name = latex_name
52+
self._fmodule = fmodule
53+
54+
def __iter__(self):
55+
r"""
56+
Return the list of basis elements of ``self``.
57+
58+
EXAMPLES::
59+
60+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
61+
sage: e = M.basis('e')
62+
sage: list(e)
63+
[Element e_0 of the Rank-3 free module M over the Integer Ring,
64+
Element e_1 of the Rank-3 free module M over the Integer Ring,
65+
Element e_2 of the Rank-3 free module M over the Integer Ring]
66+
sage: ed = e.dual_basis()
67+
sage: list(ed)
68+
[Linear form e^0 on the Rank-3 free module M over the Integer Ring,
69+
Linear form e^1 on the Rank-3 free module M over the Integer Ring,
70+
Linear form e^2 on the Rank-3 free module M over the Integer Ring]
71+
"""
72+
for i in range(self._fmodule._rank):
73+
yield self[i]
74+
75+
def __len__(self):
76+
r"""
77+
Return the basis length, i.e. the rank of the free module.
78+
79+
NB: the method ``__len__()`` is required for the basis to act as a
80+
"frame" in the class :class:`~sage.tensor.modules.comp.Components`.
81+
82+
EXAMPLES::
83+
84+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
85+
sage: e = M.basis('e')
86+
sage: e.__len__()
87+
3
88+
sage: len(e)
89+
3
90+
"""
91+
return self._fmodule._rank
92+
93+
def _latex_(self):
94+
r"""
95+
Return a LaTeX representation of ``self``.
96+
97+
EXAMPLES::
98+
99+
sage: FiniteRankFreeModule._clear_cache_() # for doctests only
100+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
101+
sage: e = M.basis('e')
102+
sage: e._latex_()
103+
'\\left(e_0,e_1,e_2\\right)'
104+
sage: latex(e)
105+
\left(e_0,e_1,e_2\right)
106+
sage: f = M.basis('eps', latex_symbol=r'\epsilon')
107+
sage: f._latex_()
108+
'\\left(\\epsilon_0,\\epsilon_1,\\epsilon_2\\right)'
109+
sage: latex(f)
110+
\left(\epsilon_0,\epsilon_1,\epsilon_2\right)
111+
112+
::
113+
114+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
115+
sage: e = M.basis('e')
116+
sage: f = e.dual_basis()
117+
sage: f._latex_()
118+
'\\left(e^0,e^1,e^2\\right)'
119+
120+
"""
121+
return self._latex_name
122+
123+
def free_module(self):
124+
"""
125+
Return the free module of ``self``.
126+
127+
EXAMPLES::
128+
129+
sage: M = FiniteRankFreeModule(QQ, 2, name='M', start_index=1)
130+
sage: e = M.basis('e')
131+
sage: e.free_module() is M
132+
True
133+
"""
134+
return self._fmodule
32135

33-
class FreeModuleBasis(UniqueRepresentation, SageObject):
136+
137+
class FreeModuleBasis(Basis_abstract):
34138
r"""
35139
Basis of a free module over a commutative ring `R`.
36140
@@ -119,15 +223,15 @@ def __init__(self, fmodule, symbol, latex_symbol=None):
119223
sage: TestSuite(e).run()
120224
121225
"""
122-
self._fmodule = fmodule
123226
if latex_symbol is None:
124227
latex_symbol = symbol
125228
self._name = "(" + \
126229
",".join([symbol + "_" + str(i) for i in fmodule.irange()]) +")"
127-
self._latex_name = r"\left(" + ",".join([latex_symbol + "_" + str(i)
230+
latex_name = r"\left(" + ",".join([latex_symbol + "_" + str(i)
128231
for i in fmodule.irange()]) + r"\right)"
129-
self._symbol = symbol
130-
self._latex_symbol = latex_symbol
232+
233+
Basis_abstract.__init__(self, fmodule, symbol, latex_symbol, latex_name)
234+
131235
# The basis is added to the module list of bases
132236
for other in fmodule._known_bases:
133237
if symbol == other._symbol:
@@ -270,28 +374,6 @@ def dual_basis(self):
270374
"""
271375
return self._dual_basis
272376

273-
def _latex_(self):
274-
r"""
275-
LaTeX representation of the object.
276-
277-
EXAMPLES::
278-
279-
sage: FiniteRankFreeModule._clear_cache_() # for doctests only
280-
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
281-
sage: e = M.basis('e')
282-
sage: e._latex_()
283-
'\\left(e_0,e_1,e_2\\right)'
284-
sage: latex(e)
285-
\left(e_0,e_1,e_2\right)
286-
sage: f = M.basis('eps', latex_symbol=r'\epsilon')
287-
sage: f._latex_()
288-
'\\left(\\epsilon_0,\\epsilon_1,\\epsilon_2\\right)'
289-
sage: latex(f)
290-
\left(\epsilon_0,\epsilon_1,\epsilon_2\right)
291-
292-
"""
293-
return self._latex_name
294-
295377
def __getitem__(self, index):
296378
r"""
297379
Return the basis element corresponding to the given index ``index``.
@@ -333,25 +415,6 @@ def __getitem__(self, index):
333415
str(n-1+si) + "]")
334416
return self._vec[i]
335417

336-
def __len__(self):
337-
r"""
338-
Return the basis length, i.e. the rank of the free module.
339-
340-
NB: the method ``__len__()`` is required for the basis to act as a
341-
"frame" in the class :class:`~sage.tensor.modules.comp.Components`.
342-
343-
EXAMPLES::
344-
345-
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
346-
sage: e = M.basis('e')
347-
sage: e.__len__()
348-
3
349-
sage: len(e)
350-
3
351-
352-
"""
353-
return self._fmodule._rank
354-
355418
def new_basis(self, change_of_basis, symbol, latex_symbol=None):
356419
r"""
357420
Define a new module basis from ``self``.
@@ -441,10 +504,9 @@ def new_basis(self, change_of_basis, symbol, latex_symbol=None):
441504
#
442505
return the_new_basis
443506

444-
445507
#******************************************************************************
446508

447-
class FreeModuleCoBasis(UniqueRepresentation, SageObject):
509+
class FreeModuleCoBasis(Basis_abstract):
448510
r"""
449511
Dual basis of a free module over a commutative ring.
450512
@@ -497,14 +559,16 @@ def __init__(self, basis, symbol, latex_symbol=None):
497559
498560
"""
499561
self._basis = basis
500-
self._fmodule = basis._fmodule
501562
self._name = "(" + \
502-
",".join([symbol + "^" + str(i) for i in self._fmodule.irange()]) +")"
563+
",".join([symbol + "^" + str(i) for i in basis._fmodule.irange()]) +")"
503564
if latex_symbol is None:
504565
latex_symbol = symbol
505-
self._latex_name = r"\left(" + \
566+
latex_name = r"\left(" + \
506567
",".join([latex_symbol + "^" + str(i)
507-
for i in self._fmodule.irange()]) + r"\right)"
568+
for i in basis._fmodule.irange()]) + r"\right)"
569+
570+
Basis_abstract.__init__(self, basis._fmodule, symbol, latex_symbol, latex_name)
571+
508572
# The individual linear forms:
509573
vl = list()
510574
for i in self._fmodule.irange():
@@ -533,21 +597,6 @@ def _repr_(self):
533597
"""
534598
return "Dual basis {} on the {}".format(self._name, self._fmodule)
535599

536-
def _latex_(self):
537-
r"""
538-
Return a LaTeX representation of ``self``.
539-
540-
EXAMPLES::
541-
542-
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
543-
sage: e = M.basis('e')
544-
sage: f = e.dual_basis()
545-
sage: f._latex_()
546-
'\\left(e^0,e^1,e^2\\right)'
547-
548-
"""
549-
return self._latex_name
550-
551600
def __getitem__(self, index):
552601
r"""
553602
Return the basis linear form corresponding to a given index.
@@ -586,3 +635,4 @@ def __getitem__(self, index):
586635
raise IndexError("out of range: {} not in [{},{}]".format(i+si,
587636
si, n-1+si))
588637
return self._form[i]
638+

src/sage/tensor/modules/free_module_homset.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ class FreeModuleHomset(Homset):
6464
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
6565
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
6666
sage: H = Hom(M,N) ; H
67-
Set of Morphisms from Rank-3 free module M over the Integer Ring to
68-
Rank-2 free module N over the Integer Ring in Category of modules
69-
over Integer Ring
67+
Set of Morphisms from Rank-3 free module M over the Integer Ring
68+
to Rank-2 free module N over the Integer Ring
69+
in Category of finite dimensional modules over Integer Ring
7070
sage: type(H)
7171
<class 'sage.tensor.modules.free_module_homset.FreeModuleHomset_with_category_with_equality_by_id'>
7272
sage: H.category()
@@ -124,8 +124,8 @@ class FreeModuleHomset(Homset):
124124
125125
sage: End(M)
126126
Set of Morphisms from Rank-3 free module M over the Integer Ring
127-
to Rank-3 free module M over the Integer Ring in Category of modules
128-
over Integer Ring
127+
to Rank-3 free module M over the Integer Ring
128+
in Category of finite dimensional modules over Integer Ring
129129
130130
``End(M)`` is actually identical to ``Hom(M,M)``::
131131
@@ -203,8 +203,9 @@ def __init__(self, fmodule1, fmodule2, name=None, latex_name=None):
203203
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
204204
sage: FreeModuleHomset(M, N)
205205
Set of Morphisms from Rank-3 free module M over the Integer Ring
206-
to Rank-2 free module N over the Integer Ring in Category of
207-
modules over Integer Ring
206+
to Rank-2 free module N over the Integer Ring
207+
in Category of finite dimensional modules over Integer Ring
208+
208209
sage: H = FreeModuleHomset(M, N, name='L(M,N)',
209210
....: latex_name=r'\mathcal{L}(M,N)')
210211
sage: latex(H)
@@ -512,7 +513,9 @@ def one(self):
512513
sage: M.identity_map().parent()
513514
General linear group of the Rank-3 free module M over the Integer Ring
514515
sage: H.one().parent()
515-
Set of Morphisms from Rank-3 free module M over the Integer Ring to Rank-3 free module M over the Integer Ring in Category of modules over Integer Ring
516+
Set of Morphisms from Rank-3 free module M over the Integer Ring
517+
to Rank-3 free module M over the Integer Ring
518+
in Category of finite dimensional modules over Integer Ring
516519
sage: H.one() == H(M.identity_map())
517520
True
518521

0 commit comments

Comments
 (0)