Space of morphisms of vector spaces (linear transformations)¶
AUTHOR:
Rob Beezer: (2011-06-29)
A VectorSpaceHomspace
object represents the set of all
possible homomorphisms from one vector space to another.
These mappings are usually known as linear transformations.
For more information on the use of linear transformations,
consult the documentation for vector space morphisms at
sage.modules.vector_space_morphism
. Also, this is
an extremely thin veneer on free module homspaces
(sage.modules.free_module_homspace
) and free module
morphisms (sage.modules.free_module_morphism
) -
objects which might also be useful, and places
where much of the documentation resides.
EXAMPLES:
Creation and basic examination is simple.
sage: V = QQ^3
sage: W = QQ^2
sage: H = Hom(V, W)
sage: H
Set of Morphisms (Linear Transformations) from
Vector space of dimension 3 over Rational Field to
Vector space of dimension 2 over Rational Field
sage: H.domain()
Vector space of dimension 3 over Rational Field
sage: H.codomain()
Vector space of dimension 2 over Rational Field
>>> from sage.all import *
>>> V = QQ**Integer(3)
>>> W = QQ**Integer(2)
>>> H = Hom(V, W)
>>> H
Set of Morphisms (Linear Transformations) from
Vector space of dimension 3 over Rational Field to
Vector space of dimension 2 over Rational Field
>>> H.domain()
Vector space of dimension 3 over Rational Field
>>> H.codomain()
Vector space of dimension 2 over Rational Field
Homspaces have a few useful properties. A basis is provided by a list of matrix representations, where these matrix representatives are relative to the bases of the domain and codomain.
sage: K = Hom(GF(3)^2, GF(3)^2)
sage: B = K.basis()
sage: for f in B:
....: print(f)
....: print("\n")
Vector space morphism represented by the matrix:
[1 0]
[0 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
Vector space morphism represented by the matrix:
[0 1]
[0 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
Vector space morphism represented by the matrix:
[0 0]
[1 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
Vector space morphism represented by the matrix:
[0 0]
[0 1]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
>>> from sage.all import *
>>> K = Hom(GF(Integer(3))**Integer(2), GF(Integer(3))**Integer(2))
>>> B = K.basis()
>>> for f in B:
... print(f)
... print("\n")
Vector space morphism represented by the matrix:
[1 0]
[0 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
<BLANKLINE>
Vector space morphism represented by the matrix:
[0 1]
[0 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
<BLANKLINE>
Vector space morphism represented by the matrix:
[0 0]
[1 0]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
<BLANKLINE>
Vector space morphism represented by the matrix:
[0 0]
[0 1]
Domain: Vector space of dimension 2 over Finite Field of size 3
Codomain: Vector space of dimension 2 over Finite Field of size 3
<BLANKLINE>
The zero and identity mappings are properties of the space. The identity mapping will only be available if the domain and codomain allow for endomorphisms (equal vector spaces with equal bases).
sage: H = Hom(QQ^3, QQ^3)
sage: g = H.zero()
sage: g([1, 1/2, -3])
(0, 0, 0)
sage: f = H.identity()
sage: f([1, 1/2, -3])
(1, 1/2, -3)
>>> from sage.all import *
>>> H = Hom(QQ**Integer(3), QQ**Integer(3))
>>> g = H.zero()
>>> g([Integer(1), Integer(1)/Integer(2), -Integer(3)])
(0, 0, 0)
>>> f = H.identity()
>>> f([Integer(1), Integer(1)/Integer(2), -Integer(3)])
(1, 1/2, -3)
The homspace may be used with various representations of a
morphism in the space to create the morphism. We demonstrate
three ways to create the same linear transformation between
two two-dimensional subspaces of QQ^3
. The V.n
notation
is a shortcut to the generators of each vector space, better
known as the basis elements. Note that the matrix representations
are relative to the bases, which are purposely fixed when the
subspaces are created (“user bases”).
sage: U = QQ^3
sage: V = U.subspace_with_basis([U.0+U.1, U.1-U.2])
sage: W = U.subspace_with_basis([U.0, U.1+U.2])
sage: H = Hom(V, W)
>>> from sage.all import *
>>> U = QQ**Integer(3)
>>> V = U.subspace_with_basis([U.gen(0)+U.gen(1), U.gen(1)-U.gen(2)])
>>> W = U.subspace_with_basis([U.gen(0), U.gen(1)+U.gen(2)])
>>> H = Hom(V, W)
First, with a matrix. Note that the matrix representation
acts by matrix multiplication with the vector on the left.
The input to the linear transformation, (3, 1, 2)
,
is converted to the coordinate vector (3, -2)
, then
matrix multiplication yields the vector (-3, -2)
,
which represents the vector (-3, -2, -2)
in the codomain.
sage: m = matrix(QQ, [[1, 2], [3, 4]])
sage: f1 = H(m)
sage: f1
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
sage: f1([3,1,2])
(-3, -2, -2)
>>> from sage.all import *
>>> m = matrix(QQ, [[Integer(1), Integer(2)], [Integer(3), Integer(4)]])
>>> f1 = H(m)
>>> f1
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
>>> f1([Integer(3),Integer(1),Integer(2)])
(-3, -2, -2)
Second, with a list of images of the domain’s basis elements.
sage: img = [1*(U.0) + 2*(U.1+U.2), 3*U.0 + 4*(U.1+U.2)]
sage: f2 = H(img)
sage: f2
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
sage: f2([3,1,2])
(-3, -2, -2)
>>> from sage.all import *
>>> img = [Integer(1)*(U.gen(0)) + Integer(2)*(U.gen(1)+U.gen(2)), Integer(3)*U.gen(0) + Integer(4)*(U.gen(1)+U.gen(2))]
>>> f2 = H(img)
>>> f2
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
>>> f2([Integer(3),Integer(1),Integer(2)])
(-3, -2, -2)
Third, with a linear function taking the domain to the codomain.
sage: g = lambda x: vector(QQ, [-2*x[0]+3*x[1], -2*x[0]+4*x[1], -2*x[0]+4*x[1]])
sage: f3 = H(g)
sage: f3
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
sage: f3([3,1,2])
(-3, -2, -2)
>>> from sage.all import *
>>> g = lambda x: vector(QQ, [-Integer(2)*x[Integer(0)]+Integer(3)*x[Integer(1)], -Integer(2)*x[Integer(0)]+Integer(4)*x[Integer(1)], -Integer(2)*x[Integer(0)]+Integer(4)*x[Integer(1)]])
>>> f3 = H(g)
>>> f3
Vector space morphism represented by the matrix:
[1 2]
[3 4]
Domain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[ 1 1 0]
[ 0 1 -1]
Codomain: Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 0 0]
[0 1 1]
>>> f3([Integer(3),Integer(1),Integer(2)])
(-3, -2, -2)
The three linear transformations look the same, and are the same.
sage: f1 == f2
True
sage: f2 == f3
True
>>> from sage.all import *
>>> f1 == f2
True
>>> f2 == f3
True
- class sage.modules.vector_space_homspace.VectorSpaceHomspace(X, Y, category=None, check=True, base=None)[source]¶
Bases:
FreeModuleHomspace
- sage.modules.vector_space_homspace.is_VectorSpaceHomspace(x)[source]¶
Return
True
ifx
is a vector space homspace.INPUT:
x
– anything
EXAMPLES:
To be a vector space morphism, the domain and codomain must both be vector spaces, in other words, modules over fields. If either set is just a module, then the
Hom()
constructor will build a space of free module morphisms.sage: H = Hom(QQ^3, QQ^2) sage: type(H) <class 'sage.modules.vector_space_homspace.VectorSpaceHomspace_with_category'> sage: sage.modules.vector_space_homspace.is_VectorSpaceHomspace(H) doctest:warning... DeprecationWarning: the function is_VectorSpaceHomspace is deprecated; use 'isinstance(..., VectorSpaceHomspace)' instead See https://github.com/sagemath/sage/issues/37924 for details. True sage: K = Hom(QQ^3, ZZ^2) sage: type(K) <class 'sage.modules.free_module_homspace.FreeModuleHomspace_with_category'> sage: sage.modules.vector_space_homspace.is_VectorSpaceHomspace(K) False sage: L = Hom(ZZ^3, QQ^2) sage: type(L) <class 'sage.modules.free_module_homspace.FreeModuleHomspace_with_category'> sage: sage.modules.vector_space_homspace.is_VectorSpaceHomspace(L) False sage: sage.modules.vector_space_homspace.is_VectorSpaceHomspace('junk') False
>>> from sage.all import * >>> H = Hom(QQ**Integer(3), QQ**Integer(2)) >>> type(H) <class 'sage.modules.vector_space_homspace.VectorSpaceHomspace_with_category'> >>> sage.modules.vector_space_homspace.is_VectorSpaceHomspace(H) doctest:warning... DeprecationWarning: the function is_VectorSpaceHomspace is deprecated; use 'isinstance(..., VectorSpaceHomspace)' instead See https://github.com/sagemath/sage/issues/37924 for details. True >>> K = Hom(QQ**Integer(3), ZZ**Integer(2)) >>> type(K) <class 'sage.modules.free_module_homspace.FreeModuleHomspace_with_category'> >>> sage.modules.vector_space_homspace.is_VectorSpaceHomspace(K) False >>> L = Hom(ZZ**Integer(3), QQ**Integer(2)) >>> type(L) <class 'sage.modules.free_module_homspace.FreeModuleHomspace_with_category'> >>> sage.modules.vector_space_homspace.is_VectorSpaceHomspace(L) False >>> sage.modules.vector_space_homspace.is_VectorSpaceHomspace('junk') False