Module: sage.modules.free_module
Free modules
SAGE supports computation with free modules over an arbitrary
commutative ring. Nontrivial functionality is available over
and
fields. All free modules over an integral domain are equipped with an
embedding in an ambient vector space and an inner product, which you
can specify and change.
Create the free module of rank
over an arbitrary commutative
ring
using the command
FreeModule(R,n)
. Equivalently,
Rn
also creates that free module.
The following example illustrates the creation of both a vector spaces
and a free module over the integers and a submodule of it. Use the functions
FreeModule
, span
and member functions of free modules
to create free modules. Do not use the FreeModule_xxx constructors
directly.
sage: V = VectorSpace(QQ,3) sage: W = V.subspace([[1,2,7], [1,1,0]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -7] [ 0 1 7] sage: C = VectorSpaces(FiniteField(7)) sage: C Category of vector spaces over Finite Field of size 7 sage: C(W) Vector space of degree 3 and dimension 2 over Finite Field of size 7 Basis matrix: [1 0 0] [0 1 0]
sage: M = ZZ^3 sage: C = VectorSpaces(FiniteField(7)) sage: C(M) Vector space of dimension 3 over Finite Field of size 7 sage: W = M.submodule([[1,2,7], [8,8,0]]) sage: C(W) Vector space of degree 3 and dimension 2 over Finite Field of size 7 Basis matrix: [1 0 0] [0 1 0]
We illustrate the exponent notation for creation of free modules.
sage: ZZ^4 Ambient free module of rank 4 over the principal ideal domain Integer Ring sage: QQ^2 Vector space of dimension 2 over Rational Field sage: RR^3 Vector space of dimension 3 over Real Field with 53 bits of precision
Base ring:
sage: R.<x,y> = PolynomialRing(QQ,2) sage: M = FreeModule(R,2) sage: M.base_ring() Multivariate Polynomial Ring in x, y over Rational Field
sage: VectorSpace(QQ, 10).base_ring() Rational Field
TESTS: We intersect a zero-dimensional vector space with a 1-dimension submodule.
sage: V = (QQ^1).span([]) sage: W = ZZ^1 sage: V.intersection(W) Free module of degree 1 and rank 0 over Integer Ring Echelon basis matrix: []
We construct subspaces of real and complex double vector spaces and verify that the element types are correct:
sage: V = FreeModule(RDF, 3); V Vector space of dimension 3 over Real Double Field sage: V.0 (1.0, 0.0, 0.0) sage: type(V.0) <type 'sage.modules.real_double_vector.RealDoubleVectorSpaceElement'> sage: W = V.span([V.0]); W Vector space of degree 3 and dimension 1 over Real Double Field Basis matrix: [1.0 0.0 0.0] sage: type(W.0) <type 'sage.modules.real_double_vector.RealDoubleVectorSpaceElement'> sage: V = FreeModule(CDF, 3); V Vector space of dimension 3 over Complex Double Field sage: type(V.0) <type 'sage.modules.complex_double_vector.ComplexDoubleVectorSpaceElement'> sage: W = V.span_of_basis([CDF.0 * V.1]); W Vector space of degree 3 and dimension 1 over Complex Double Field User basis matrix: [ 0 1.0*I 0] sage: type(W.0) <type 'sage.modules.complex_double_vector.ComplexDoubleVectorSpaceElement'>
Basis vectors are immutable:
sage: A = span(ZZ, [[1,2,3], [4,5,6]]) sage: A.0 (1, 2, 3) sage: A.0[0] = 5 Traceback (most recent call last): ... ValueError: vector is immutable; please change a copy instead (use self.copy())
Module-level Functions
base_ring, rank, [sparse=False], [inner_product_matrix=None]) |
Create the free module over the given commutative ring of the given rank.
Input:
Note:
In Sage it is not the case that there is only one
free ambient module of rank
over
. If you create
twice
Sage creates two separate objects. This is because one can
change the inner product on an ambient free module at any time.
First we illustrate creating free modules over various base fields. The base field affects the free module that is created. For example, free modules over a field are vector spaces, and free modules over a principal ideal domain are special in that more functionality is available for them than for completely general free modules.
sage: FreeModule(Integers(8),10) Ambient free module of rank 10 over Ring of integers modulo 8 sage: FreeModule(QQ,10) Vector space of dimension 10 over Rational Field sage: FreeModule(ZZ,10) Ambient free module of rank 10 over the principal ideal domain Integer Ring sage: FreeModule(FiniteField(5),10) Vector space of dimension 10 over Finite Field of size 5 sage: FreeModule(Integers(7),10) Vector space of dimension 10 over Ring of integers modulo 7 sage: FreeModule(PolynomialRing(QQ,'x'),5) Ambient free module of rank 5 over the principal ideal domain Univariate Polynomial Ring in x over Rational Field sage: FreeModule(PolynomialRing(ZZ,'x'),5) Ambient free module of rank 5 over the integral domain Univariate Polynomial Ring in x over Integer Ring
Of course we can make rank 0 free modules:
sage: FreeModule(RealField(100),0) Vector space of dimension 0 over Real Field with 100 bits of precision
Next we create a free module with sparse representation of elements. Functionality with sparse modules is identical to dense modules, but they may use less memory and arithmetic may be faster (or slower!).
sage: M = FreeModule(ZZ,200,sparse=True) sage: M.is_sparse() True sage: type(M.0) <type 'sage.modules.free_module_element.FreeModuleElement_generic_sparse'>
The default is dense.
sage: M = ZZ^200 sage: type(M.0) <type 'sage.modules.vector_integer_dense.Vector_integer_dense'>
Note that matrices associated in some way to sparse free modules are sparse by default:
sage: M = FreeModule(Integers(8), 2) sage: A = M.basis_matrix() sage: A.is_sparse() False sage: Ms = FreeModule(Integers(8), 2, sparse=True) sage: M == Ms # as mathematical objects they are equal True sage: Ms.basis_matrix().is_sparse() True
We can also specify an inner product matrix, which is used when computing inner products of elements.
sage: A = MatrixSpace(ZZ,2)([[1,0],[0,-1]]) sage: M = FreeModule(ZZ,2,inner_product_matrix=A) sage: v, w = M.gens() sage: v.inner_product(w) 0 sage: v.inner_product(v) 1 sage: w.inner_product(w) -1 sage: (v+2*w).inner_product(w) -2
You can also specify the inner product matrix by giving anything that coerces to an appropriate matrix. This is only useful if the inner product matrix takes values in the base ring.
sage: FreeModule(ZZ,2,inner_product_matrix=1).inner_product_matrix() [1 0] [0 1] sage: FreeModule(ZZ,2,inner_product_matrix=[1,2,3,4]).inner_product_matrix() [1 2] [3 4] sage: FreeModule(ZZ,2,inner_product_matrix=[[1,2],[3,4]]).inner_product_matrix() [1 2] [3 4]
K, dimension, [sparse=False], [inner_product_matrix=None]) |
The base can be complicated, as long as it is a field.
sage: V = VectorSpace(FractionField(PolynomialRing(ZZ,'x')),3) sage: V Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in x over Integer Ring sage: V.basis() [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ]
The base must be a field or a TypeError
is raised.
sage: VectorSpace(ZZ,5) Traceback (most recent call last): ... TypeError: K must be a field
V, w) |
R, is_sparse) |
x) |
R, gens, [check=True], [already_echelonized=False]) |
Return the
-span of gens.
sage: V = span(QQ, [[1,2,5], [2,2,2]]); V Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -3] [ 0 1 4] sage: span(QuadraticField(-7,'a'), [V.gen(0)]) Vector space of degree 3 and dimension 1 over Number Field in a with defining polynomial x^2 + 7 Basis matrix: [ 1 0 -3] sage: span(GF(2), [[1,2,3], [2,2,2], [1,2,5]]) Vector space of degree 3 and dimension 1 over Finite Field of size 2 Basis matrix: [1 0 1]
Class: ComplexDoubleVectorSpace_class
self, n) |
Functions: coordinates
Special Functions: __init__
Class: FreeModule_ambient
self, base_ring, rank, [sparse=False], [inner_product_matrix=None]) |
The free module of given rank over the given base_ring.
Input:
sage: FreeModule(ZZ, 4) Ambient free module of rank 4 over the principal ideal domain Integer Ring
Functions: ambient_module,
basis,
change_ring,
coordinate_vector,
echelon_coordinate_vector,
echelon_coordinates,
echelonized_basis,
echelonized_basis_matrix,
is_ambient,
linear_combination_of_basis
self) |
Return self, since self is ambient.
sage: A = QQ^5; A.ambient_module() Vector space of dimension 5 over Rational Field sage: A = ZZ^5; A.ambient_module() Ambient free module of rank 5 over the principal ideal domain Integer Ring
self) |
Return a basis for this ambient free module.
Output:
sage: A = ZZ^3; B = A.basis(); B [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ] sage: B.universe() Ambient free module of rank 3 over the principal ideal domain Integer Ring
self, R) |
Return the ambient free module over R of the same rank as self.
sage: A = ZZ^3; A.change_ring(QQ) Vector space of dimension 3 over Rational Field sage: A = ZZ^3; A.change_ring(GF(5)) Vector space of dimension 3 over Finite Field of size 5
For ambient modules any change of rings is defined.
sage: A = GF(5)**3; A.change_ring(QQ) Vector space of dimension 3 over Rational Field
self, v, [check=True]) |
Write
in terms of the standard basis for self and return the
resulting coeffcients in a vector over the fraction field of the
base ring.
Returns a vector c such that if B is the basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = Integers(16)^3 sage: v = V.coordinate_vector([1,5,9]); v (1, 5, 9) sage: v.parent() Ambient free module of rank 3 over Ring of integers modulo 16
self, v, [check=True]) |
Same as self.coordinate_vector(v)
, since self is an ambient free module.
Input:
self) |
Return a basis for this ambient free module in echelon form.
sage: A = ZZ^3; A.echelonized_basis() [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ]
self) |
Return True
since this module is an ambient module.
sage: A = QQ^5; A.is_ambient() True sage: A = (QQ^5).span([[1,2,3,4,5]]); A.is_ambient() False
self, v) |
Return the linear combination of the basis for self obtained from the elements of the list v.
sage: V = span(ZZ, [[1,2,3], [4,5,6]]) sage: V Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [1 2 3] [0 3 6] sage: V.linear_combination_of_basis([1,1]) (1, 5, 9)
Special Functions: __cmp__,
__init__,
_dense_module,
_latex_,
_repr_,
_sparse_module
self, other) |
Compare self and other.
Modules are ordered by their ambient spaces, then by dimension, then in order by their echelon matrices.
We compare rank three free modules over the integers and rationals:
sage: QQ^3 < CC^3 True sage: CC^3 < QQ^3 False sage: CC^3 > QQ^3 True
sage: Q = QQ; Z = ZZ sage: Q^3 > Z^3 True sage: Q^3 < Z^3 False sage: Z^3 < Q^3 True sage: Z^3 > Q^3 False sage: Q^3 == Z^3 False sage: Q^3 == Q^3 True
sage: V = span(QQ, [[1,2,3], [5,6,7], [8,9,10]]) sage: V Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -1] [ 0 1 2] sage: A = QQ^3 sage: V < A True sage: A < V False
self) |
Return a latex representation of this ambient free module.
sage: latex(QQ^3) \mathbf{Q}^{3}
sage: A = GF(5)^20; latex(A) \mathbf{F}_{5}^{20}
sage: A = PolynomialRing(QQ,3,'x') ^ 20; latex(A) (\mathbf{Q}[x_{0}, x_{1}, x_{2}])^{20}
Class: FreeModule_ambient_domain
self, base_ring, rank, [sparse=False], [inner_product_matrix=None]) |
sage: FreeModule(PolynomialRing(GF(5),'x'), 3) Ambient free module of rank 3 over the principal ideal domain Univariate Polynomial Ring in x over Finite Field of size 5
Functions: ambient_vector_space,
base_field,
coordinate_vector,
vector_space
self) |
Returns the ambient vector space, which is this free module tensored with its fraction field.
sage: M = ZZ^3; M.ambient_vector_space() Vector space of dimension 3 over Rational Field
self) |
Return the fraction field of the base ring of self.
sage: M = ZZ^3; M.base_field() Rational Field sage: M = PolynomialRing(GF(5),'x')^3; M.base_field() Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 5
self, v, [check=True]) |
Write
in terms of the standard basis for self and return the
resulting coeffcients in a vector over the fraction field of the
base ring.
Input:
Returns a vector c such that if B is the basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = ZZ^3 sage: v = V.coordinate_vector([1,5,9]); v (1, 5, 9) sage: v.parent() Vector space of dimension 3 over Rational Field
self, [base_field=None]) |
Returns the vector space obtained from self by tensoring with the fraction field of the base ring and extending to the field.
sage: M = ZZ^3; M.vector_space() Vector space of dimension 3 over Rational Field
Special Functions: __init__,
_repr_
Class: FreeModule_ambient_field
self, base_field, dimension, [sparse=False], [inner_product_matrix=None]) |
Functions: ambient_vector_space,
base_field
self) |
Returns the ambient vector space.
sage: M = QQ^3 sage: M.ambient_vector_space() Vector space of dimension 3 over Rational Field
self) |
Returns the base field of this vector space.
sage: M = QQ^3 sage: M.base_field() Rational Field
Special Functions: __call__,
__init__,
_repr_
self, e, [coerce=True], [copy=True], [check=True]) |
sage: k.<a> = GF(3^4) sage: VS = k.vector_space() sage: VS(a) (0, 1, 0, 0)
Class: FreeModule_ambient_pid
self, base_ring, rank, [sparse=False], [inner_product_matrix=None]) |
Create the ambient free module of given rank over the given principal ideal domain
Input:
sage: ZZ^3 Ambient free module of rank 3 over the principal ideal domain Integer Ring
Special Functions: __init__,
_repr_
Class: FreeModule_generic
self, base_ring, rank, degree, [sparse=False], [inner_product_matrix=None]) |
Create the free module of given rank over the given base_ring.
Input:
Functions: ambient_module,
base_extend,
basis,
basis_matrix,
category,
construction,
coordinate_module,
coordinate_vector,
coordinates,
degree,
dense_module,
dimension,
direct_sum,
discriminant,
echelonized_basis_matrix,
element_class,
free_module,
gen,
gram_matrix,
has_user_basis,
inner_product_matrix,
is_ambient,
is_dense,
is_finite,
is_full,
is_sparse,
is_submodule,
matrix,
ngens,
nonembedded_free_module,
random_element,
rank,
sparse_module,
uses_ambient_inner_product,
zero_vector
self) |
Return the ambient module associated to this module.
sage: R.<x,y> = QQ[] sage: M = FreeModule(R,2) sage: M.ambient_module() Ambient free module of rank 2 over the integral domain Multivariate Polynomial Ring in x, y over Rational Field
sage: V = FreeModule(QQ, 4).span([[1,2,3,4], [1,0,0,0]]); V Vector space of degree 4 and dimension 2 over Rational Field Basis matrix: [ 1 0 0 0] [ 0 1 3/2 2] sage: V.ambient_module() Vector space of dimension 4 over Rational Field
self, R) |
Return the base extension of self to R. This
is the same as self.change_ring(R)
except
that a TypeError is raised if there is no canonical
coerce map from the base ring of self to R.
Input:
self) |
Return the basis of this module.
sage: FreeModule(Integers(12),3).basis() [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ]
self) |
Return the matrix whose rows are the basis for this free module.
sage: FreeModule(Integers(12),3).basis_matrix() [1 0 0] [0 1 0] [0 0 1]
sage: M = FreeModule(GF(7),3).span([[2,3,4],[1,1,1]]); M Vector space of degree 3 and dimension 2 over Finite Field of size 7 Basis matrix: [1 0 6] [0 1 2] sage: M.basis_matrix() [1 0 6] [0 1 2]
sage: M = FreeModule(GF(7),3).span_of_basis([[2,3,4],[1,1,1]]); sage: M.basis_matrix() [2 3 4] [1 1 1]
self) |
Return the category to which this free module belongs. This is the category of all free modules over the base ring.
sage: FreeModule(GF(7),3).category() Category of vector spaces over Finite Field of size 7
self, V) |
Suppose V is a submodule of self (or a module comeasurable
with self), and that self is a free module over
of rank
. Let
be the map from self to
that sends the
basis vectors of self in order to the standard basis of
.
This function returns the image
.
WARNING: If there is no integer
such that
is a submodule
of self, then this function will give total nonsense.
We illustrate this function with some
-submodules of
.
sage: V = (ZZ^3).span([[1/2,3,5], [0,1,-3]]) sage: W = (ZZ^3).span([[1/2,4,2]]) sage: V.coordinate_module(W) Free module of degree 2 and rank 1 over Integer Ring Echelon basis matrix: [1 4] sage: V.0 + 4*V.1 (1/2, 4, 2)
In this example, the coordinate module isn't even in
.
sage: W = (ZZ^3).span([[1/4,2,1]]) sage: V.coordinate_module(W) Free module of degree 2 and rank 1 over Integer Ring Echelon basis matrix: [1/2 2]
The following more elaborate example illustrates using this function to write a submodule in terms of integral cuspidal modular symbols:
sage: M = ModularSymbols(54) sage: S = M.cuspidal_subspace() sage: K = S.integral_structure(); K Free module of degree 19 and rank 8 over Integer Ring Echelon basis matrix: [ 0 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ... sage: L = M[0].integral_structure(); L Free module of degree 19 and rank 2 over Integer Ring Echelon basis matrix: [ 0 1 1 0 -2 1 -1 1 -1 -2 2 0 0 0 0 0 0 0 0] [ 0 0 3 0 -3 2 -1 2 -1 -4 2 -1 -2 1 2 0 0 -1 1] sage: K.coordinate_module(L) Free module of degree 8 and rank 2 over Integer Ring Echelon basis matrix: [ 1 1 1 -1 1 -1 0 0] [ 0 3 2 -1 2 -1 -1 -2] sage: K.coordinate_module(L).basis_matrix() * K.basis_matrix() [ 0 1 1 0 -2 1 -1 1 -1 -2 2 0 0 0 0 0 0 0 0] [ 0 0 3 0 -3 2 -1 2 -1 -4 2 -1 -2 1 2 0 0 -1 1]
self, v, [check=True]) |
Return the a vector whose cofficients give
as a linear combination
of the basis for self.
Input:
sage: M = FreeModule(ZZ, 2); M0,M1=M.gens() sage: W = M.submodule([M0 + M1, M0 - 2*M1]) sage: W.coordinate_vector(2*M0 - M1) (2, -1)
self, v, [check=True]) |
Write
in terms of the basis for self.
Input:
Returns a list
such that if
is the basis for self, then
If
ArithmeticError
exception.
sage: M = FreeModule(ZZ, 2); M0,M1=M.gens() sage: W = M.submodule([M0 + M1, M0 - 2*M1]) sage: W.coordinates(2*M0-M1) [2, -1]
self) |
Return the degree of this free module. This is the dimension of the ambient vector space in which it is embedded.
sage: M = FreeModule(ZZ, 10) sage: W = M.submodule([M.gen(0), 2*M.gen(3) - M.gen(0), M.gen(0) + M.gen(3)]) sage: W.degree() 10 sage: W.rank() 2
self) |
Return corresponding dense module.
We first illustrate conversion with ambient spaces:
sage: M = FreeModule(QQ,3) sage: S = FreeModule(QQ,3, sparse=True) sage: M.sparse_module() Sparse vector space of dimension 3 over Rational Field sage: S.dense_module() Vector space of dimension 3 over Rational Field sage: M.sparse_module() == S True sage: S.dense_module() == M True sage: M.dense_module() == M True sage: S.sparse_module() == S True
Next we create a subspace:
sage: M = FreeModule(QQ,3, sparse=True) sage: V = M.span([ [1,2,3] ] ); V Sparse vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3] sage: V.sparse_module() Sparse vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3]
self) |
Return the dimension of this free module.
sage: M = FreeModule(FiniteField(19), 100) sage: W = M.submodule([M.gen(50)]) sage: W.dimension() 1
self, other) |
Return the direct sum of self and other as a free module.
sage: V = (ZZ^3).span([[1/2,3,5], [0,1,-3]]); V Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [1/2 0 14] [ 0 1 -3] sage: W = (ZZ^3).span([[1/2,4,2]]); W Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [1/2 4 2] sage: V.direct_sum(W) Free module of degree 6 and rank 3 over Integer Ring Echelon basis matrix: [1/2 0 14 0 0 0] [ 0 1 -3 0 0 0] [ 0 0 0 1/2 4 2]
self) |
Return the discriminant of this free module.
sage: M = FreeModule(ZZ, 3) sage: M.discriminant() 1 sage: W = M.span([[1,2,3]]) sage: W.discriminant() 14 sage: W2 = M.span([[1,2,3], [1,1,1]]) sage: W2.discriminant() 6
self) |
Return this free module. (This is used by the FreeModule
functor,
and simply returns self.)
sage: M = FreeModule(ZZ, 3) sage: M.free_module() Ambient free module of rank 3 over the principal ideal domain Integer Ring
self, [i=0]) |
Return ith generator for self, where i is between 0 and rank-1, inclusive.
Input:
self) |
Return the gram matrix associated to this free module, defined to be G = B*A*B.transpose(), where A is the inner product matrix (induced from the ambient space), and B the basis matrix.
sage: V = VectorSpace(QQ,4) sage: u = V([1/2,1/2,1/2,1/2]) sage: v = V([0,1,1,0]) sage: w = V([0,0,1,1]) sage: M = span(ZZ,[u,v,w]) sage: M.inner_product_matrix() == V.inner_product_matrix() True sage: L = M.submodule_with_basis([u,v,w]) sage: L.inner_product_matrix() == M.inner_product_matrix() True sage: L.gram_matrix() [1 1 1] [1 2 1] [1 1 2]
self) |
Return True
if the basis of this free module is specified by the user,
as opposed to being the default echelon form.
sage: V = QQ^3 sage: W = V.subspace([[2,'1/2', 1]]) sage: W.has_user_basis() False sage: W = V.subspace_with_basis([[2,'1/2',1]]) sage: W.has_user_basis() True
self) |
Return the inner product matrix associated to this module. By definition this is the inner product matrix of the ambient space, hence may be of degree greater than the rank of the module.
N.B. The inner product does not have to be symmetric (see examples).
TODO: Differentiate the image ring of the inner product from the base ring of the module and/or ambient space. E.g. On an integral module over ZZ the inner product pairing could naturally take values in ZZ, QQ, RR, or CC.
sage: M = FreeModule(ZZ, 3) sage: M.inner_product_matrix() [1 0 0] [0 1 0] [0 0 1]
The inner product does not have to be symmetric or definite.
sage: N = FreeModule(ZZ,2,inner_product_matrix=[[1,-1],[2,5]]) sage: N.inner_product_matrix() [ 1 -1] [ 2 5] sage: u, v = N.basis() sage: u.inner_product(v) -1 sage: v.inner_product(u) 2
The inner product matrix is defined with respect to the ambient space.
sage: V = QQ^3 sage: u = V([1/2,1,1]) sage: v = V([1,1,1/2]) sage: M = span(ZZ,[u,v]) sage: M.inner_product_matrix() [1 0 0] [0 1 0] [0 0 1] sage: M.inner_product_matrix() == V.inner_product_matrix() True sage: M.gram_matrix() [ 1/2 -3/4] [-3/4 13/4]
self) |
Returns False sense this is not an ambient free module.
sage: M = FreeModule(ZZ, 3).span([[1,2,3]]); M Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [1 2 3] sage: M.is_ambient() False sage: M = (ZZ^2).span([[1,0], [0,1]]) sage: M Free module of degree 2 and rank 2 over Integer Ring Echelon basis matrix: [1 0] [0 1] sage: M.is_ambient() False sage: M == M.ambient_module() True
self) |
Return True
if the underlying representation of this module uses dense vectors,
and False otherwise.
sage: FreeModule(ZZ, 2).is_dense() True sage: FreeModule(ZZ, 2, sparse=True).is_dense() False
self) |
Returns True if the underlying set of this free module is finite.
sage: FreeModule(ZZ, 2).is_finite() False sage: FreeModule(Integers(8), 2).is_finite() True sage: FreeModule(ZZ, 0).is_finite() True
self) |
Return True
if the rank of this module equals its degree.
sage: FreeModule(ZZ, 2).is_full() True sage: M = FreeModule(ZZ, 2).span([[1,2]]) sage: M.is_full() False
self) |
Return True
if the underlying representation of this module uses sparse vectors,
and False otherwise.
sage: FreeModule(ZZ, 2).is_sparse() False sage: FreeModule(ZZ, 2, sparse=True).is_sparse() True
self, other) |
Copied from FreeModule_generic_pid It only works partially since basis() is not implemented in general Trivial cases are already useful for coercion, e.g.
sage: QQ(1/2) * vector(ZZ['x']['y'],[1,2,3,4]) (1/2, 1, 3/2, 2) sage: vector(ZZ['x']['y'],[1,2,3,4]) * QQ(1/2) (1/2, 1, 3/2, 2)
self) |
Return the basis matrix of this module, which is the matrix whose rows are a basis for this module.
sage: M = FreeModule(ZZ, 2) sage: M.matrix() [1 0] [0 1] sage: M.submodule([M.gen(0) + M.gen(1), M.gen(0) - 2*M.gen(1)]).matrix() [1 1] [0 3]
self) |
Returns the number of basis elements of this free module.
sage: FreeModule(ZZ, 2).ngens() 2 sage: FreeModule(ZZ, 0).ngens() 0 sage: FreeModule(ZZ, 2).span([[1,1]]).ngens() 1
self) |
Returns an ambient free module that is isomorphic to this free module.
Thus if this free module is of rank
over a ring
, then this function
returns
, as an ambient free module.
sage: FreeModule(ZZ, 2).span([[1,1]]).nonembedded_free_module() Ambient free module of rank 1 over the principal ideal domain Integer Ring
self, [prob=1.0]) |
Returns a random element of self.
Input:
sage: M = FreeModule(ZZ, 2).span([[1,1]]) sage: M.random_element() (-1, -1) sage: M.random_element() (2, 2) sage: M.random_element() (1, 1)
self) |
Return the rank of this free module.
sage: FreeModule(Integers(6), 10000000).rank() 10000000 sage: FreeModule(ZZ, 2).span([[1,1], [2,2], [3,4]]).rank() 2
self) |
Return corresponding sparse module.
We first illustrate conversion with ambient spaces:
sage: M = FreeModule(Integers(8),3) sage: S = FreeModule(Integers(8),3, sparse=True) sage: M.sparse_module() Ambient sparse free module of rank 3 over Ring of integers modulo 8 sage: S.dense_module() Ambient free module of rank 3 over Ring of integers modulo 8 sage: M.sparse_module() is S True sage: S.dense_module() is M True sage: M.dense_module() is M True sage: S.sparse_module() is S True
Next we convert a subspace:
sage: M = FreeModule(QQ,3) sage: V = M.span([ [1,2,3] ] ); V Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3] sage: V.sparse_module() Sparse vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3]
self) |
Return True
if the inner product on this module is the
one induced by the ambient inner product.
sage: M = FreeModule(ZZ, 2) sage: W = M.submodule([[1,2]]) sage: W.uses_ambient_inner_product() True sage: W.inner_product_matrix() [1 0] [0 1]
sage: W.gram_matrix() [5]
self) |
Returns the zero vector in this free module.
sage: M = FreeModule(ZZ, 2) sage: M.zero_vector() (0, 0) sage: M(0) (0, 0) sage: M.span([[1,1]]).zero_vector() (0, 0) sage: M.zero_submodule().zero_vector() (0, 0)
Special Functions: __call__,
__cmp__,
__contains__,
__init__,
__iter__,
__len__,
_an_element_impl,
_coerce_impl,
_dense_module,
_has_coerce_map_from_space,
_inner_product_is_dot_product,
_magma_init_,
_sparse_module
self, v) |
We create the module
, and the submodule generated by
one vector
, and check whether certain elements are
in the submodule.
sage: R = FreeModule(ZZ, 3) sage: V = R.submodule([R.gen(0) + R.gen(1)]) sage: R.gen(0) + R.gen(1) in V True sage: R.gen(0) + 2*R.gen(1) in V False
sage: w = (1/2)*(R.gen(0) + R.gen(1)) sage: w (1/2, 1/2, 0) sage: w.parent() Vector space of dimension 3 over Rational Field sage: w in V False sage: V.coordinates(w) [1/2]
self) |
Return iterator over the elements of this free module.
sage: V = VectorSpace(GF(4,'a'),2) sage: [x for x in V] [(0, 0), (a, 0), (a + 1, 0), (1, 0), (0, a), (a, a), (a + 1, a), (1, a), (0, a + 1), (a, a + 1), (a + 1, a + 1), (1, a + 1), (0, 1), (a, 1), (a + 1, 1), (1, 1)]
sage: W = V.subspace([V([1,1])]) sage: print [x for x in W] [(0, 0), (a, a), (a + 1, a + 1), (1, 1)]
self, x) |
Canonical coercion of x into this free module. (0, 4/3, 8/3, 4, 16/3)
self, V) |
Return True if V canonically coerces to self.
self) |
Return whether or not the inner product on this module is induced by the dot product on the ambient vector space. This is used internally by the inner_product function for optimization.
sage: FreeModule(ZZ, 3)._inner_product_is_dot_product() True sage: FreeModule(ZZ, 3, inner_product_matrix=1)._inner_product_is_dot_product() True sage: FreeModule(ZZ, 2, inner_product_matrix=[1,0,-1,0])._inner_product_is_dot_product() False
sage: M = FreeModule(QQ, 3) sage: M2 = M.span([[1,2,3]]) sage: M2._inner_product_is_dot_product() True
self) |
sage: magma(FreeModule(Integers(8), 2)) # optional Full RSpace of degree 2 over IntegerRing(8)
sage: magma(FreeModule(QQ, 9)) # optional Full Vector space of degree 9 over Rational Field
sage: magma(FreeModule(QQ['x'], 2)) # optional Full RSpace of degree 2 over Univariate Polynomial Ring over Rational Field
sage: A = MatrixSpace(ZZ,2)([[1,0],[0,-1]]) sage: M = FreeModule(ZZ,2,inner_product_matrix=A) sage: magma(M) # optional Full RSpace of degree 2 over Integer Ring Inner Product Matrix: [ 1 0] [ 0 -1]
Class: FreeModule_generic_field
self, base_field, dimension, degree, [sparse=False], [inner_product_matrix=None]) |
Functions: category,
echelonized_basis_matrix,
intersection,
is_subspace,
quotient,
quotient_abstract,
scale,
span,
span_of_basis,
subspace,
subspace_with_basis,
vector_space,
zero_submodule,
zero_subspace
self) |
Return the category to which this vector space belongs.
sage: V = QQ^4; V.category() Category of vector spaces over Rational Field sage: V = GF(5)**20; V.category() Category of vector spaces over Finite Field of size 5
self) |
Return basis matrix for self in row echelon form.
sage: V = FreeModule(QQ, 3).span_of_basis([[1,2,3],[4,5,6]]) sage: V.basis_matrix() [1 2 3] [4 5 6] sage: V.echelonized_basis_matrix() [ 1 0 -1] [ 0 1 2]
self, other) |
Return the intersection of self and other, which must be R-submodules of a common ambient vector space.
sage: V = VectorSpace(QQ,3) sage: W1 = V.submodule([V.gen(0), V.gen(0) + V.gen(1)]) sage: W2 = V.submodule([V.gen(1), V.gen(2)]) sage: W1.intersection(W2) Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [0 1 0] sage: W2.intersection(W1) Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [0 1 0] sage: V.intersection(W1) Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [1 0 0] [0 1 0] sage: W1.intersection(V) Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [1 0 0] [0 1 0] sage: Z = V.submodule([]) sage: W1.intersection(Z) Vector space of degree 3 and dimension 0 over Rational Field Basis matrix: []
self, other) |
True if this vector space is a subspace of other.
sage: V = VectorSpace(QQ,3) sage: W = V.subspace([V.gen(0), V.gen(0) + V.gen(1)]) sage: W2 = V.subspace([V.gen(1)]) sage: W.is_subspace(V) True sage: W2.is_subspace(V) True sage: W.is_subspace(W2) False sage: W2.is_subspace(W) True
self, sub, [check=True]) |
Return the quotient of self by the given subspace sub.
Input:
sage: A = QQ^3; V = A.span([[1,2,3], [4,5,6]]) sage: Q = V.quotient( [V.0 + V.1] ); Q Vector space quotient V/W of dimension 1 over Rational Field where V: Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -1] [ 0 1 2] W: Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 1 1] sage: Q(V.0 + V.1) (0)
self, sub, [check=True]) |
Returns an ambient free module isomorphic to the quotient space of self modulo sub, together with maps from self to the quotient, and a lifting map in the other direction.
Use self.quotient(sub)
to obtain the quotient module
as an object equipped with natural maps in both directions,
and a canonical coercion.
Input:
sage: V = GF(19)^3 sage: W = V.span_of_basis([ [1,2,3], [1,0,1] ]) sage: U,pi,lift = V.quotient_abstract(W) sage: pi(V.2) (18) sage: pi(V.0) (1) sage: pi(V.0 + V.2) (0)
Another example involving a quotient of one subspace by another.
sage: A = matrix(QQ,4,4,[0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0]) sage: V = (A^3).kernel() sage: W = A.kernel() sage: U, pi, lift = V.quotient_abstract(W) sage: [pi(v) == 0 for v in W.gens()] [True] sage: [pi(lift(b)) == b for b in U.basis()] [True, True]
self, other) |
Return the product of self by the number other, which is the module spanned by other times each basis vector. Since self is a vector space this product equals self if other is nonzero, and is the zero vector space if other is 0.
sage: V = QQ^4 sage: V.scale(5) Vector space of dimension 4 over Rational Field sage: V.scale(0) Vector space of degree 4 and dimension 0 over Rational Field Basis matrix: []
sage: W = V.span([[1,1,1,1]]) sage: W.scale(2) Vector space of degree 4 and dimension 1 over Rational Field Basis matrix: [1 1 1 1] sage: W.scale(0) Vector space of degree 4 and dimension 0 over Rational Field Basis matrix: []
sage: V = QQ^4; V Vector space of dimension 4 over Rational Field sage: V.scale(3) Vector space of dimension 4 over Rational Field sage: V.scale(0) Vector space of degree 4 and dimension 0 over Rational Field Basis matrix: []
self, gens, [check=True], [already_echelonized=False]) |
Return the K-span of the given list of gens, where K is the base field of self. Note that this span is a subspace of the ambient vector space, but need not be a subspace of self.
Input:
sage: V = VectorSpace(GF(7), 3) sage: W = V.subspace([[2,3,4]]); W Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 5 2] sage: W.span([[1,1,1]]) Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 1 1]
self, basis, [check=True], [already_echelonized=False]) |
Return the free K-module with the given basis, where K is the base field of self. Note that this span is a subspace of the ambient vector space, but need not be a suspace of self.
Input:
sage: V = VectorSpace(GF(7), 3) sage: W = V.subspace([[2,3,4]]); W Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 5 2] sage: W.span_of_basis([[2,2,2], [3,3,0]]) Vector space of degree 3 and dimension 2 over Finite Field of size 7 User basis matrix: [2 2 2] [3 3 0]
The basis vectors must be linearly independent or an ArithmeticError exception is raised.
sage: W.span_of_basis([[2,2,2], [3,3,3]]) Traceback (most recent call last): ... ValueError: basis vectors must be linearly independent.
self, gens, [check=True], [already_echelonized=False]) |
Return the subspace of self spanned by the elements of gens.
Input:
First we create a 1-dimensional vector subspace of an ambient
-dimensional
space over the finite field of order
.
sage: V = VectorSpace(GF(7), 3) sage: W = V.subspace([[2,3,4]]); W Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 5 2]
Next we create an invalid subspace, but it's allowed since check=False
.
This is just equivalent to computing the span of the element.
sage: W.subspace([[1,1,0]], check=False) Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 1 0]
With check=True
(the default) the mistake is correctly detected
and reported with an ArithmeticError
exception.
sage: W.subspace([[1,1,0]], check=True) Traceback (most recent call last): ... ArithmeticError: gens does not generate a submodule of self
self, gens, [check=True], [already_echelonized=False]) |
Same as self.submodule_with_basis(...)
.
We create a subspace with a user-defined basis.
sage: V = VectorSpace(GF(7), 3) sage: W = V.subspace_with_basis([[2,2,2], [1,2,3]]); W Vector space of degree 3 and dimension 2 over Finite Field of size 7 User basis matrix: [2 2 2] [1 2 3]
We then create a subspace of the subspace with user-defined basis.
sage: W1 = W.subspace_with_basis([[3,4,5]]); W1 Vector space of degree 3 and dimension 1 over Finite Field of size 7 User basis matrix: [3 4 5]
Notice how the basis for the same subspace is different if we merely
use the subspace
command.
sage: W2 = W.subspace([[3,4,5]]); W2 Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 6 4]
Nonetheless the two subspaces are equal (as mathematical objects):
sage: W1 == W2 True
self, [base_field=None]) |
Return the vector space associated to self. Since self is a vector space this function simply returns self, unless the base field is different.
sage: V = span(QQ, [[1,2,3]]); V Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3] sage: V.vector_space() Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [1 2 3]
self) |
Return the zero submodule of self.
sage: (QQ^4).zero_submodule() Vector space of degree 4 and dimension 0 over Rational Field Basis matrix: []
self) |
Return the zero subspace of self.
sage: (QQ^4).zero_subspace() Vector space of degree 4 and dimension 0 over Rational Field Basis matrix: []
Special Functions: __add__,
__div__,
__init__,
_FreeModule_generic_field__quotient_matrices
self, other) |
Return the sum of self and other.
sage: V = VectorSpace(QQ,3) sage: V0 = V.span([V.gen(0)]) sage: V2 = V.span([V.gen(2)]) sage: V0 + V2 Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [1 0 0] [0 0 1] sage: QQ^3 + 0 Vector space of dimension 3 over Rational Field
self, sub, [check=True]) |
Return the quotient of self by the given subspace sub.
This just calls self.quotient(sub, check)
sage: V = RDF^3; W = V.span([[1,0,-1], [1,-1,0]]) sage: Q = V/W; Q Vector space quotient V/W of dimension 1 over Real Double Field where V: Vector space of dimension 3 over Real Double Field W: Vector space of degree 3 and dimension 2 over Real Double Field Basis matrix: [ 1.0 0.0 -1.0] [ 0.0 1.0 -1.0] sage: type(Q) <class 'sage.modules.quotient_module.FreeModule_ambient_field_quotient'> sage: V([1,2,3]) (1.0, 2.0, 3.0) sage: Q == V.quotient(W) True sage: Q(W.0) (0.0)
self, sub) |
This internal function is used by self.quotient(...)
.
sage: V = QQ^3; W = V.span([[1,0,-1], [1,-1,0]]) sage: A, L = V._FreeModule_generic_field__quotient_matrices(W) sage: A [1] [1] [1] sage: L [1 0 0]
The quotient and lift maps are used to compute in the quotient and to lift:
sage: Q = V/W sage: Q(W.0) (0) sage: Q.lift_map()(Q.0) (1, 0, 0) sage: Q(Q.lift_map()(Q.0)) (1)
An example in characteristic 5:
sage: A = GF(5)^2; B = A.span([[1,3]]); A / B Vector space quotient V/W of dimension 1 over Finite Field of size 5 where V: Vector space of dimension 2 over Finite Field of size 5 W: Vector space of degree 2 and dimension 1 over Finite Field of size 5 Basis matrix: [1 3]
Class: FreeModule_generic_pid
self, base_ring, rank, degree, [sparse=False], [inner_product_matrix=None]) |
Create a free module over a PID.
sage: FreeModule(ZZ, 2) Ambient free module of rank 2 over the principal ideal domain Integer Ring sage: FreeModule(PolynomialRing(GF(7),'x'), 2) Ambient free module of rank 2 over the principal ideal domain Univariate Polynomial Ring in x over Finite Field of size 7
Functions: base_field,
basis_matrix,
denominator,
index_in,
index_in_saturation,
intersection,
is_submodule,
saturation,
scale,
span,
span_of_basis,
submodule,
submodule_with_basis,
vector_space_span,
vector_space_span_of_basis,
zero_submodule
self) |
Return the base field, which is the fraction field of the base ring of this module.
sage: FreeModule(GF(3), 2).base_field() Finite Field of size 3 sage: FreeModule(ZZ, 2).base_field() Rational Field sage: FreeModule(PolynomialRing(GF(7),'x'), 2).base_field() Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 7
self) |
Return the matrix whose rows are the basis for this free module.
sage: M = FreeModule(QQ,2).span_of_basis([[1,-1],[1,0]]); M Vector space of degree 2 and dimension 2 over Rational Field User basis matrix: [ 1 -1] [ 1 0] sage: M.basis_matrix() [ 1 -1] [ 1 0]
self, other) |
Return the lattice index [other:self] of self in other, as an element of the base field. When self is contained in other, the lattice index is the usual index. If the index is infinite, then this function returns infinity.
sage: L1 = span(ZZ, [[1,2]]) sage: L2 = span(ZZ, [[3,6]]) sage: L2.index_in(L1) 3
Note that the free modules being compared need not be integral.
sage: L1 = span(ZZ, [['1/2','1/3'], [4,5]]) sage: L2 = span(ZZ, [[1,2], [3,4]]) sage: L2.index_in(L1) 12/7 sage: L1.index_in(L2) 7/12 sage: L1.discriminant() / L2.discriminant() 49/144
The index of a lattice of infinite index is infinite.
sage: L1 = FreeModule(ZZ, 2) sage: L2 = span(ZZ, [[1,2]]) sage: L2.index_in(L1) +Infinity
self) |
Return the index of this module in its saturation, i.e., its
intersection with
.
sage: W = span(ZZ,[[2,4,6]]) sage: W.index_in_saturation() 2 sage: W = span(ZZ,[[1/2,1/3]]) sage: W.index_in_saturation() 1/6
self, other) |
Return the intersection of self and other.
We intersect two submodules one of which is clearly contained in the other.
sage: A = ZZ^2 sage: M1 = A.span([[1,1]]) sage: M2 = A.span([[3,3]]) sage: M1.intersection(M2) Free module of degree 2 and rank 1 over Integer Ring Echelon basis matrix: [3 3]
We intersection two submodules of
of rank
, whose intersection
has rank
.
sage: A = ZZ^3 sage: M1 = A.span([[1,1,1], [1,2,3]]) sage: M2 = A.span([[2,2,2], [1,0,0]]) sage: M1.intersection(M2) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [2 2 2]
We compute an intersection of two
-modules that are not submodules
of
.
sage: A = ZZ^2 sage: M1 = A.span([[1,2]]).scale(1/6) sage: M2 = A.span([[1,2]]).scale(1/15) sage: M1.intersection(M2) Free module of degree 2 and rank 1 over Integer Ring Echelon basis matrix: [1/3 2/3]
We intersect a
-module with a
-vector space.
sage: A = ZZ^3 sage: L = ZZ^3 sage: V = QQ^3 sage: W = L.span([[1/2,0,1/2]]) sage: K = V.span([[1,0,1], [0,0,1]]) sage: W.intersection(K) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [1/2 0 1/2] sage: K.intersection(W) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [1/2 0 1/2]
self, other) |
True if this module is a submodule of other.
sage: M = FreeModule(ZZ,2) sage: M.is_submodule(M) True sage: N = M.scale(2) sage: N.is_submodule(M) True sage: M.is_submodule(N) False sage: N = M.scale(1/2) sage: N.is_submodule(M) False sage: M.is_submodule(N) True
self) |
Return the saturated submodule of
that spans the same
vector space as self.
We create a 1-dimensional lattice that is obviously not saturated and saturate it.
sage: L = span(ZZ, [[9,9,6]]); L Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [9 9 6] sage: L.saturation() Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [3 3 2]
We create a lattice spanned by two vectors, and saturate.
Comptation of discriminants shows that the index of lattice
in its saturation is
, which is a prime of congruence between
the two generating vectors.
sage: L = span(ZZ, [[1,2,3], [4,5,6]]) sage: L.saturation() Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [ 1 0 -1] [ 0 1 2] sage: L.discriminant() 54 sage: L.saturation().discriminant() 6
Notice that the saturation of a non-integral lattice
is defined,
but the result is integral hence does not contain
:
sage: L = span(ZZ, [['1/2',1,3]]) sage: L.saturation() Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [1 2 6]
self, other) |
Return the product of this module by the number other, which is the module spanned by other times each basis vector.
sage: M = FreeModule(ZZ, 3) sage: M.scale(2) Free module of degree 3 and rank 3 over Integer Ring Echelon basis matrix: [2 0 0] [0 2 0] [0 0 2]
sage: a = QQ('1/3') sage: M.scale(a) Free module of degree 3 and rank 3 over Integer Ring Echelon basis matrix: [1/3 0 0] [ 0 1/3 0] [ 0 0 1/3]
self, gens, [check=True], [already_echelonized=False]) |
Return the R-span of the given list of gens, where R is the base ring of self. Note that this span need not be a submodule of self, nor even of the ambient space. It must, however, be contained in the ambient vector space, i.e., the ambient space tensored with the fraction field of R.
sage: V = FreeModule(ZZ,3) sage: W = V.submodule([V.gen(0)]) sage: W.span([V.gen(1)]) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [0 1 0] sage: W.submodule([V.gen(1)]) Traceback (most recent call last): ... ArithmeticError: gens does not generate a submodule of self
self, basis, [check=True], [already_echelonized=False]) |
Return the free R-module with the given basis, where R is the base ring of self. Note that this R-module need not be a submodule of self, nor even of the ambient space. It must, however, be contained in the ambient vector space, i.e., the ambient space tensored with the fraction field of R.
sage: M = FreeModule(ZZ,3) sage: W = M.span_of_basis([M([1,2,3])])
Next we create two free
-modules, neither of
which is a submodule of
.
sage: W.span_of_basis([M([2,4,0])]) Free module of degree 3 and rank 1 over Integer Ring User basis matrix: [2 4 0]
The following module isn't even in the ambient space.
sage: Q = QQ sage: W.span_of_basis([ Q('1/5')*M([1,2,0]), Q('1/7')*M([1,1,0]) ]) Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [1/5 2/5 0] [1/7 1/7 0]
Of course the input basis vectors must be linearly independent.
sage: W.span_of_basis([ [1,2,0], [2,4,0] ]) Traceback (most recent call last): ... ValueError: basis vectors must be linearly independent.
self, gens, [check=True], [already_echelonized=False]) |
Create the R-submodule of the ambient vector space with given generators, where R is the base ring of self.
Input:
We create a submodule of
:
sage: M = FreeModule(ZZ, 3) sage: B = M.basis() sage: W = M.submodule([B[0]+B[1], 2*B[1]-B[2]]) sage: W Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [ 1 1 0] [ 0 2 -1]
We create a submodule of a submodule.
sage: W.submodule([3*B[0] + 3*B[1]]) Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [3 3 0]
We try to create a submodule that isn't really a submodule, which results in an ArithmeticError exception:
sage: W.submodule([B[0] - B[1]]) Traceback (most recent call last): ... ArithmeticError: gens does not generate a submodule of self
self, basis, [check=True], [already_echelonized=False]) |
Create the R-submodule of the ambient vector space with given basis, where R is the base ring of self.
Input:
First we create a submodule of
:
sage: M = FreeModule(ZZ, 3) sage: B = M.basis() sage: W = M.submodule_with_basis([B[0]+B[1], 2*B[1]-B[2]]) sage: W Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [ 1 1 0] [ 0 2 -1]
self, gens, [check=True]) |
Create the vector subspace of the ambient vector space with given generators.
Input:
We create a
-dimensional subspace of a
.
sage: V = VectorSpace(QQ, 3) sage: B = V.basis() sage: W = V.vector_space_span([B[0]+B[1], 2*B[1]-B[2]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 1/2] [ 0 1 -1/2]
We create a subspace of a vector space over
.
sage: R.<x> = QQ[] sage: K = NumberField(x^2 + 1, 'a'); a = K.gen() sage: V = VectorSpace(K, 3) sage: V.vector_space_span([2*V.gen(0) + 3*V.gen(2)]) Vector space of degree 3 and dimension 1 over Number Field in a with defining polynomial x^2 + 1 Basis matrix: [ 1 0 3/2]
We use the vector_space_span
command to create a vector subspace of the
ambient vector space of a submodule of
.
sage: M = FreeModule(ZZ,3) sage: W = M.submodule([M([1,2,3])]) sage: W.vector_space_span([M([2,3,4])]) Vector space of degree 3 and dimension 1 over Rational Field Basis matrix: [ 1 3/2 2]
self, basis, [check=True]) |
Create the vector subspace of the ambient vector space with given basis.
Input:
sage: V = VectorSpace(QQ, 3) sage: B = V.basis() sage: W = V.vector_space_span_of_basis([B[0]+B[1], 2*B[1]-B[2]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field User basis matrix: [ 1 1 0] [ 0 2 -1]
self) |
Return the zero submodule of this module.
sage: V = FreeModule(ZZ,2) sage: V.zero_submodule() Free module of degree 2 and rank 0 over Integer Ring Echelon basis matrix: []
Special Functions: __add__,
__init__,
__radd__
self, other) |
Return the sum of self and other, where both self and other must be submodules of the ambient vector space.
We add two vector spaces:
sage: V = VectorSpace(QQ, 3) sage: W = V.subspace([V([1,1,0])]) sage: W2 = V.subspace([V([1,-1,0])]) sage: W + W2 Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [1 0 0] [0 1 0]
We add two free
-modules.
sage: M = FreeModule(ZZ, 3) sage: W = M.submodule([M([1,0,2])]) sage: W2 = M.submodule([M([2,0,-4])]) sage: W + W2 Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [1 0 2] [0 0 8]
We can also add free
-modules embedded non-integrally
into an ambient space.
sage: V = VectorSpace(QQ, 3) sage: W = M.span([1/2*V.0 - 1/3*V.1])
Here the command M.span(...)
creates the span of the
indicated vectors over the base ring of
.
sage: W2 = M.span([1/3*V.0 + V.1]) sage: W + W2 Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [ 1/6 7/3 0] [ 0 11/3 0]
We add two modules over
:
sage: A = Matrix(ZZ, 3, 3, [3, 0, -1, 0, -2, 0, 0, 0, -2]) sage: V = (A+2).kernel() sage: W = (A-3).kernel() sage: V+W Free module of degree 3 and rank 3 over Integer Ring Echelon basis matrix: [5 0 0] [0 1 0] [0 0 1]
We add a module to 0:
sage: ZZ^3 + 0 Ambient free module of rank 3 over the principal ideal domain Integer Ring
self, other) |
sage: int(0) + QQ^3 Vector space of dimension 3 over Rational Field sage: sum([QQ^3, QQ^3]) Vector space of degree 3 and dimension 3 over Rational Field Basis matrix: [1 0 0] [0 1 0] [0 0 1]
Class: FreeModule_submodule_field
self, ambient, gens, [check=True], [inner_product_matrix=None], [already_echelonized=False]) |
Create an embedded vector subspace with echelonized basis.
sage: V = QQ^3 sage: W = V.span([[1,2,3],[4,5,6]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -1] [ 0 1 2]
Functions: coordinate_vector,
echelon_coordinates,
has_user_basis
self, v, [check=True]) |
Write
in terms of the user basis for self.
Input:
Returns a vector c such that if B is the basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = QQ^3 sage: W = V.span([[1,2,3],[4,5,6]]); W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -1] [ 0 1 2] sage: W.coordinate_vector([1,5,9]) (1, 5)
sage: V = VectorSpace(QQ,5, sparse=True) sage: W = V.subspace([[0,1,2,0,0], [0,-1,0,0,-1/2]]) sage: W.coordinate_vector([0,0,2,0,-1/2]) (0, 2)
self, v, [check=True]) |
Write
in terms of the user basis for self.
Input:
Returns a list
such that if
is the basis for self, then
If
ArithmeticError
exception.
An embedded vector subspace with echelonized basis.
sage: V = QQ^3 sage: W = V.span([[1,2,3],[4,5,6]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 -1] [ 0 1 2] sage: W.echelon_coordinates([1,5,9]) [1, 5]
self) |
Return True
if the basis of this free module is specified by the user,
as opposed to being the default echelon form.
sage: V = QQ^3 sage: W = V.subspace([[2,'1/2', 1]]) sage: W.has_user_basis() False sage: W = V.subspace_with_basis([[2,'1/2',1]]) sage: W.has_user_basis() True
Special Functions: __init__,
_repr_
Class: FreeModule_submodule_pid
sage: M = ZZ^3 sage: W = M.span_of_basis([[1,2,3],[4,5,19]]); W Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [ 1 2 3] [ 4 5 19]
We can save and load submodules and elements.
sage: loads(W.dumps()) == W True sage: v = W.0 + W.1 sage: loads(v.dumps()) == v True
self, ambient, gens, [check=True], [inner_product_matrix=None], [already_echelonized=False]) |
Create an embedded free module over a PID.
sage: V = ZZ^3 sage: W = V.span([[1,2,3],[4,5,6]]) sage: W Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [1 2 3] [0 3 6]
Functions: coordinate_vector,
has_user_basis
self, v, [check=True]) |
Write
in terms of the user basis for self.
Input:
Returns a vector c such that if B is the basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = ZZ^3 sage: W = V.span_of_basis([[1,2,3],[4,5,6]]) sage: W.coordinate_vector([1,5,9]) (5, -1)
self) |
Return True
if the basis of this free module is specified by the user,
as opposed to being the default echelon form.
sage: A = ZZ^3; A Ambient free module of rank 3 over the principal ideal domain Integer Ring sage: A.has_user_basis() False sage: W = A.span_of_basis([[2,'1/2',1]]) sage: W.has_user_basis() True sage: W = A.span([[2,'1/2',1]]) sage: W.has_user_basis() False
Special Functions: __init__,
_repr_
Class: FreeModule_submodule_with_basis_field
sage: M = QQ^3; W = M.span([[1,2,3],[4,5,19]]); W Vector space of degree 3 and dimension 2 over Rational Field Basis matrix: [ 1 0 23/3] [ 0 1 -7/3]
We can load and save submodules:
sage: loads(W.dumps()) == W True
sage: K.<x> = FractionField(PolynomialRing(QQ,'x')) sage: M = K^3; W = M.span_of_basis([[1,1,x]]) sage: loads(W.dumps()) == W True
self, ambient, basis, [check=True], [echelonize=False], [inner_product_matrix=None], [echelonized_basis=None], [already_echelonized=False]) |
Create a vector space with given basis.
sage: V = QQ^3 sage: W = V.span_of_basis([[1,2,3],[4,5,6]]) sage: W Vector space of degree 3 and dimension 2 over Rational Field User basis matrix: [1 2 3] [4 5 6]
Functions: is_ambient
self) |
Return False since this is not an ambient module.
sage: V = QQ^3 sage: V.is_ambient() True sage: W = V.span_of_basis([[1,2,3],[4,5,6]]) sage: W.is_ambient() False
Special Functions: __init__,
_denominator,
_echelonized_basis,
_repr_
Class: FreeModule_submodule_with_basis_pid
self, ambient, basis, [check=True], [echelonize=False], [inner_product_matrix=None], [echelonized_basis=None], [already_echelonized=False]) |
Create a free module with basis over a PID.
sage: M = ZZ^3 sage: W = M.span_of_basis([[1,2,3],[4,5,6]]); W Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [1 2 3] [4 5 6]
Functions: ambient_module,
ambient_vector_space,
basis,
change_ring,
construction,
coordinate_vector,
echelon_coordinate_vector,
echelon_coordinates,
echelon_to_user_matrix,
echelonized_basis,
echelonized_basis_matrix,
has_user_basis,
linear_combination_of_basis,
user_to_echelon_matrix,
vector_space
self) |
Return the ambient module related to the
-module self, which
was used when creating this module, and is of the form
. Note
that self need not be contained in the ambient module, though self
will be contained in the ambient vector space.
sage: A = ZZ^3 sage: M = A.span_of_basis([[1,2,'3/7'],[4,5,6]]) sage: M Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [ 1 2 3/7] [ 4 5 6] sage: M.ambient_module() Ambient free module of rank 3 over the principal ideal domain Integer Ring sage: M.is_submodule(M.ambient_module()) False
self) |
Return the ambient vector space in which this free module is embedded.
sage: V = ZZ^3 sage: M = V.span_of_basis([[1,2,'1/5']]) sage: M Free module of degree 3 and rank 1 over Integer Ring User basis matrix: [ 1 2 1/5] sage: M.ambient_vector_space() Vector space of dimension 3 over Rational Field
self) |
Return the user basis for this free module.
sage: V = ZZ^3 sage: V.basis() [ (1, 0, 0), (0, 1, 0), (0, 0, 1) ] sage: M = V.span_of_basis([['1/8',2,1]]) sage: M.basis() [ (1/8, 2, 1) ]
self, R) |
Return the free module over R obtained by coercing each element of self into a vector over the fraction field of R, then taking the resulting R-module. Raises a TypeError if coercion is not possible.
Input:
sage: V = QQ^3 sage: W = V.subspace([[2,'1/2', 1]]) sage: W.change_ring(GF(7)) Vector space of degree 3 and dimension 1 over Finite Field of size 7 Basis matrix: [1 2 4]
self) |
Returns the functorial construction of self, namely, the subspace of the ambient module spanned by the given basis.
sage: M = ZZ^3 sage: W = M.span_of_basis([[1,2,3],[4,5,6]]); W Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [1 2 3] [4 5 6] sage: c, V = W.construction() sage: c(V) == W True
self, v, [check=True]) |
Write
in terms of the user basis for self.
Input:
Returns a vector c such that if B is the basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = ZZ^3 sage: M = V.span_of_basis([['1/8',2,1]]) sage: M.coordinate_vector([1,16,8]) (8)
self, v, [check=True]) |
Write
in terms of the user basis for self.
Input:
Returns a vector c such that if B is the echelonized basis for self, then sum c[i] B[i] = v If v is not in self, raises an ArithmeticError exception.
sage: V = ZZ^3 sage: M = V.span_of_basis([['1/2',3,1], [0,'1/6',0]]) sage: B = M.echelonized_basis(); B [ (1/2, 0, 1), (0, 1/6, 0) ] sage: M.echelon_coordinate_vector(['1/2', 3, 1]) (1, 18)
self, v, [check=True]) |
Write
in terms of the echelonized basis for self.
Input:
Returns a list
such that if
is the basis for self, then
If
ArithmeticError
exception.
sage: A = ZZ^3 sage: M = A.span_of_basis([[1,2,'3/7'],[4,5,6]]) sage: M.coordinates([8,10,12]) [0, 2] sage: M.echelon_coordinates([8,10,12]) [8, -2] sage: B = M.echelonized_basis(); B [ (1, 2, 3/7), (0, 3, -30/7) ] sage: 8*B[0] - 2*B[1] (8, 10, 12)
We do an example with a sparse vector space:
sage: V = VectorSpace(QQ,5, sparse=True) sage: W = V.subspace_with_basis([[0,1,2,0,0], [0,-1,0,0,-1/2]]) sage: W.echelonized_basis() [ (0, 1, 0, 0, 1/2), (0, 0, 1, 0, -1/4) ] sage: W.echelon_coordinates([0,0,2,0,-1/2]) [0, 2]
self) |
Return matrix that transforms the echelon basis to the user basis of self.
This is a matrix
such that if
is a vector written with respect to the echelon
basis for self then
is that vector written with respect to the user
basis of self.
sage: V = QQ^3 sage: W = V.span_of_basis([[1,2,3],[4,5,6]]) sage: W.echelonized_basis() [ (1, 0, -1), (0, 1, 2) ] sage: A = W.echelon_to_user_matrix(); A [-5/3 2/3] [ 4/3 -1/3]
The vector
has coordinates
with respect to the echelonized
basis for self. Multiplying
we find the coordinates of this vector with
respect to the user basis.
sage: v = vector(QQ, [1,1]); v (1, 1) sage: v * A (-1/3, 1/3) sage: u0, u1 = W.basis() sage: (-u0 + u1)/3 (1, 1, 1)
self) |
Return the basis for self in echelon form.
sage: V = ZZ^3 sage: M = V.span_of_basis([['1/2',3,1], [0,'1/6',0]]) sage: M.basis() [ (1/2, 3, 1), (0, 1/6, 0) ] sage: B = M.echelonized_basis(); B [ (1/2, 0, 1), (0, 1/6, 0) ] sage: V.span(B) == M True
self) |
Return basis matrix for self in row echelon form.
sage: V = FreeModule(ZZ, 3).span_of_basis([[1,2,3],[4,5,6]]) sage: V.basis_matrix() [1 2 3] [4 5 6] sage: V.echelonized_basis_matrix() [1 2 3] [0 3 6]
self) |
Return True
if the basis of this free module is specified by the user,
as opposed to being the default echelon form.
sage: V = ZZ^3; V.has_user_basis() False sage: M = V.span_of_basis([[1,3,1]]); M.has_user_basis() True sage: M = V.span([[1,3,1]]); M.has_user_basis() False
self, v) |
Return the linear combination of the basis for self obtained from the coordinates of v.
sage: V = span(ZZ, [[1,2,3], [4,5,6]]); V Free module of degree 3 and rank 2 over Integer Ring Echelon basis matrix: [1 2 3] [0 3 6] sage: V.linear_combination_of_basis([1,1]) (1, 5, 9)
self) |
Return matrix that transforms a vector written with respect to the user basis of self to one written with respect to the echelon basis. The matrix acts from the right, as is usual in SAGE.
sage: A = ZZ^3 sage: M = A.span_of_basis([[1,2,3],[4,5,6]]) sage: M.echelonized_basis() [ (1, 2, 3), (0, 3, 6) ] sage: M.user_to_echelon_matrix() [ 1 0] [ 4 -1]
The vector
in
is
with respect to the user basis.
Multiplying the above matrix on the right by this vector yields
,
which has components the coordinates of
with respect to the echelon basis.
sage: v0,v1 = M.basis(); v = v0+v1 sage: e0,e1 = M.echelonized_basis() sage: v (5, 7, 9) sage: 5*e0 + (-1)*e1 (5, 7, 9)
self, [base_field=None]) |
Return the vector spaces associated to this free module via tensor product with the fraction field of the base ring.
sage: A = ZZ^3; A Ambient free module of rank 3 over the principal ideal domain Integer Ring sage: A.vector_space() Vector space of dimension 3 over Rational Field sage: M = A.span_of_basis([['1/3',2,'3/7'],[4,5,6]]); M Free module of degree 3 and rank 2 over Integer Ring User basis matrix: [1/3 2 3/7] [ 4 5 6] sage: M.vector_space() Vector space of degree 3 and dimension 2 over Rational Field User basis matrix: [1/3 2 3/7] [ 4 5 6]
Special Functions: __cmp__,
__init__,
_denominator,
_echelon_to_rref_matrix,
_echelonized_basis,
_latex_,
_repr_,
_rref_to_echelon_matrix,
_rref_to_user_matrix,
_user_to_rref_matrix
self, other) |
Compare self and other.
Modules are ordered by their ambient spaces, then by dimension, then in order by their echelon matrices.
NOTE: Use the is_submodule
to determine if one module
is a submodule of another.
First we compare two equal vector spaces.
sage: V = span(QQ, [[1,2,3], [5,6,7], [8,9,10]]) sage: W = span(QQ, [[5,6,7], [8,9,10]]) sage: V == W True
Next we compare a one dimensional space to the two dimensional space defined above.
sage: M = span(QQ, [[5,6,7]]) sage: V == M False sage: M < V True sage: V < M False
We compare a
-module to the one-dimensional space above.
sage: V = span(ZZ, [[5,6,7]]).scale(1/11); V Free module of degree 3 and rank 1 over Integer Ring Echelon basis matrix: [5/11 6/11 7/11] sage: V < M True sage: M < V False
self) |
Return latex representation of this free module.
sage: A = ZZ^3 sage: M = A.span_of_basis([[1,2,3],[4,5,6]]) sage: M._latex_() '\\mbox{\\rm RowSpan}_{\\mathbf{Z}}\\left(\\begin{array}{rrr}\n1 \& 2 \& 3 \\\\\n4 \& 5 \& 6\n\\end{array}\\right)'
Class: RealDoubleVectorSpace_class
self, n) |
Functions: coordinates
Special Functions: __init__
See About this document... for information on suggesting changes.