32.3 Elements of free modules

Module: sage.modules.free_module_element

File: sage/modules/free_module_element.pyx (starting at line 1)

Elements of free modules

Author Log:

TODO: Change to use a get_unsafe / set_unsafe, etc., structure exactly like with matrices, since we'll have to define a bunch of special purpose implementations of vectors easily and systematically.

We create a vector space over $ \mathbf{Q}$ and a subspace of this space.

sage: V = QQ^5
sage: W = V.span([V.1, V.2])

Arithmetic operations always return something in the ambient space, since there is a canonical map from $ W$ to $ V$ but not from $ V$ to $ W$.

sage: parent(W.0 + V.1)
Vector space of dimension 5 over Rational Field
sage: parent(V.1 + W.0)
Vector space of dimension 5 over Rational Field
sage: W.0 + V.1
(0, 2, 0, 0, 0)
sage: W.0 - V.0
(-1, 1, 0, 0, 0)

Next we define modules over $ \mathbf{Z}$ and a finite field.

sage: K = ZZ^5
sage: M = GF(7)^5

Arithmetic between the $ \mathbf{Q}$ and $ \mathbf{Z}$ modules is defined, and the result is always over $ \mathbf{Q}$, since there is a canonical coercion map to $ \mathbf{Q}$.

sage: K.0 + V.1
(1, 1, 0, 0, 0)
sage: parent(K.0 + V.1)
Vector space of dimension 5 over Rational Field

Since there is no canonical coercion map to the finite field from $ \mathbf{Q}$ the following arithmetic is not defined:

sage: V.0 + M.0
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for '+': 'Vector space of
dimension 5 over Rational Field' and 'Vector space of dimension 5 over
Finite Field of size 7'

However, there is a map from $ \mathbf{Z}$ to the finite field, so the following is defined, and the result is in the finite field.

sage: w = K.0 + M.0; w
(2, 0, 0, 0, 0)
sage: parent(w)
Vector space of dimension 5 over Finite Field of size 7
sage: parent(M.0 + K.0)
Vector space of dimension 5 over Finite Field of size 7

Matrix vector multiply:

sage: MS = MatrixSpace(QQ,3)
sage: A = MS([0,1,0,1,0,0,0,0,1])
sage: V = QQ^3
sage: v = V([1,2,3])
sage: v * A
(2, 1, 3)

TESTS:

sage: D = 46341
sage: u = 7
sage: R = Integers(D)
sage: p = matrix(R,[[84, 97, 55, 58, 51]])
sage: 2*p.row(0)
(168, 194, 110, 116, 102)

Module-level Functions

free_module_element( )

Return a vector over R with given entries.

CALL FORMATS: 1. vector(object) 2. vector(ring, object) 3. vector(object, ring) 4. vector(numpy_array)

In each case, give sparse=[True|False] as an option.

INPUT:
    elts -- entries of a vector (either a list or dict).
    R -- ring
    sparse -- optional
    
OUTPUT:
    An element of the free module over R of rank len(elts).

sage: v = vector([1,2,3]); v
(1, 2, 3)
sage: v.parent()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
sage: v = vector([1,2,3/5]); v
(1, 2, 3/5)
sage: v.parent()
Vector space of dimension 3 over Rational Field

All entries must canonically coerce to some common ring:

sage: v = vector([17, GF(11)(5), 19/3]); v
Traceback (most recent call last):
...
TypeError: unable to find a common ring for all elements

sage: v = vector([17, GF(11)(5), 19]); v
(6, 5, 8)
sage: v.parent()
Vector space of dimension 3 over Finite Field of size 11
sage: v = vector([17, GF(11)(5), 19], QQ); v
(17, 5, 19)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector((1,2,3), QQ); v
(1, 2, 3)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector(QQ, (1,2,3)); v
(1, 2, 3)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector(vector([1,2,3])); v
(1, 2, 3)
sage: v.parent()
Ambient free module of rank 3 over the principal ideal domain Integer Ring

You can also use free_module_element, which is the same as vector.

sage: free_module_element([1/3, -4/5])
(1/3, -4/5)

Make a vector mod 3 out of a vector over ZZ:

sage: vector(vector([1,2,3]), GF(3))
(1, 2, 0)

Any 1 dimensional numpy array of type float or complex may be passed to vector. The result will vector in the appropriate dimensional vector space over the real double field or the complex double field. The data in the array must be contiguous so columnwise slices of numpy matrices will rase an exception.

sage: import numpy
sage: x=numpy.random.randn(10)
sage: y=vector(x)
sage: v=numpy.random.randn(10)*numpy.complex(0,1)
sage: w=vector(v)

is_FreeModuleElement( )

make_FreeModuleElement_generic_dense( )

make_FreeModuleElement_generic_sparse( )

prepare( )

prepare_dict( )

vector( )

Return a vector over R with given entries.

CALL FORMATS: 1. vector(object) 2. vector(ring, object) 3. vector(object, ring) 4. vector(numpy_array)

In each case, give sparse=[True|False] as an option.

INPUT:
    elts -- entries of a vector (either a list or dict).
    R -- ring
    sparse -- optional
    
OUTPUT:
    An element of the free module over R of rank len(elts).

sage: v = vector([1,2,3]); v
(1, 2, 3)
sage: v.parent()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
sage: v = vector([1,2,3/5]); v
(1, 2, 3/5)
sage: v.parent()
Vector space of dimension 3 over Rational Field

All entries must canonically coerce to some common ring:

sage: v = vector([17, GF(11)(5), 19/3]); v
Traceback (most recent call last):
...
TypeError: unable to find a common ring for all elements

sage: v = vector([17, GF(11)(5), 19]); v
(6, 5, 8)
sage: v.parent()
Vector space of dimension 3 over Finite Field of size 11
sage: v = vector([17, GF(11)(5), 19], QQ); v
(17, 5, 19)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector((1,2,3), QQ); v
(1, 2, 3)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector(QQ, (1,2,3)); v
(1, 2, 3)
sage: v.parent()
Vector space of dimension 3 over Rational Field
sage: v = vector(vector([1,2,3])); v
(1, 2, 3)
sage: v.parent()
Ambient free module of rank 3 over the principal ideal domain Integer Ring

You can also use free_module_element, which is the same as vector.

sage: free_module_element([1/3, -4/5])
(1/3, -4/5)

Make a vector mod 3 out of a vector over ZZ:

sage: vector(vector([1,2,3]), GF(3))
(1, 2, 0)

Any 1 dimensional numpy array of type float or complex may be passed to vector. The result will vector in the appropriate dimensional vector space over the real double field or the complex double field. The data in the array must be contiguous so columnwise slices of numpy matrices will rase an exception.

sage: import numpy
sage: x=numpy.random.randn(10)
sage: y=vector(x)
sage: v=numpy.random.randn(10)*numpy.complex(0,1)
sage: w=vector(v)

Class: FreeModuleElement

class FreeModuleElement
File: sage/modules/free_module_element.pyx (starting at line 258)

An element of a generic free module.

Functions: additive_order,$  $ change_ring,$  $ cross_product,$  $ degree,$  $ denominator,$  $ dense_vector,$  $ dict,$  $ dot_product,$  $ element,$  $ get,$  $ inner_product,$  $ is_dense,$  $ is_sparse,$  $ is_vector,$  $ iteritems,$  $ lift,$  $ list,$  $ list_from_positions,$  $ Mod,$  $ nonzero_positions,$  $ normalize,$  $ pairwise_product,$  $ plot,$  $ set,$  $ sparse_vector,$  $ support

additive_order( )

Return the additive order of self.

sage: v = vector(Integers(4), [1,2])
sage: v.additive_order()
4

sage: v = vector([1,2,3])
sage: v.additive_order()
+Infinity

sage: v = vector(Integers(30), [6, 15]); v
(6, 15)
sage: v.additive_order()
10
sage: 10*v
(0, 0)

cross_product( )

Return the cross product of self and right, which is only defined for vectors of length 3.

This product is performed under the assumption that the basis vectors are orthonormal.

sage: v = vector([1,2,3]); w = vector([0,5,-9])
sage: v.cross_product(v)
(0, 0, 0)
sage: u = v.cross_product(w); u
(-33, 9, 5)
sage: u.dot_product(v)
0
sage: u.dot_product(w)
0

dot_product( )

Return the dot product of self and right, which is the sum of the product of the corresponding entries.

INPUT:
    right -- vector of the same degree as self.  it need not
             be in the same vector space as self, as long as
             the coefficients can be multiplied.

sage: V = FreeModule(ZZ, 3)
sage: v = V([1,2,3])
sage: w = V([4,5,6])
sage: v.dot_product(w)
32

sage: W = VectorSpace(GF(3),3)
sage: w = W([0,1,2])
sage: w.dot_product(v)
2
sage: w.dot_product(v).parent()
Finite Field of size 3

Implicit coercion is well defined (irregardless of order), so we get 2 even if we do the dot product in the other order.

sage: v.dot_product(w)  
2

get( )

get is meant to be more efficient than getitem, because it does not do any error checking.

inner_product( )

Returns the inner product of self and other, with respect to the inner product defined on the parent of self.

sage: I = matrix(ZZ,3,[2,0,-1,0,2,0,-1,0,6])
sage: M = FreeModule(ZZ, 3, inner_product_matrix = I)
sage: (M.0).inner_product(M.0)
2
sage: K = M.span_of_basis([[0/2,-1/2,-1/2], [0,1/2,-1/2],[2,0,0]])
sage: (K.0).inner_product(K.0)
2

lift( )

sage: V = vector(Integers(7), [5, 9, 13, 15]) ; V
(5, 2, 6, 1)
sage: V.lift()
(5, 2, 6, 1)
sage: parent(V.lift())
Ambient free module of rank 4 over the principal ideal domain Integer Ring

Mod( )

sage: V = vector(ZZ, [5, 9, 13, 15])
sage: V.Mod(7)
(5, 2, 6, 1)
sage: parent(V.Mod(7))
Vector space of dimension 4 over Ring of integers modulo 7

nonzero_positions( )

Return the sorted list of integers i such that self[i] != 0.

normalize( )

Return this vector divided through by the first nonzero entry of this vector.

sage: v = vector(QQ,[0,4/3,5,1,2])
sage: v.normalize()
(0, 1, 15/4, 3/4, 3/2)

pairwise_product( )

Return the dot product of self and right, which is a vector of of the product of the corresponding entries.

INPUT:
    right -- vector of the same degree as self.  it need not
             be in the same vector space as self, as long as
             the coefficients can be multiplied.

sage: V = FreeModule(ZZ, 3)
sage: v = V([1,2,3])
sage: w = V([4,5,6])
sage: v.pairwise_product(w)
(4, 10, 18)
sage: sum(v.pairwise_product(w)) == v.dot_product(w)
True

sage: W = VectorSpace(GF(3),3)
sage: w = W([0,1,2])
sage: w.pairwise_product(v)
(0, 2, 0)
sage: w.pairwise_product(v).parent()
Vector space of dimension 3 over Finite Field of size 3

Implicit coercion is well defined (irregardless of order), so we get 2 even if we do the dot product in the other order.

sage: v.pairwise_product(w).parent()  
Vector space of dimension 3 over Finite Field of size 3

TESTS:

sage: x, y = var('x, y')

sage: parent(vector(ZZ,[1,2]).pairwise_product(vector(ZZ,[1,2]))) 
Ambient free module of rank 2 over the principal ideal domain Integer Ring 
sage: parent(vector(ZZ,[1,2]).pairwise_product(vector(QQ,[1,2]))) 
Vector space of dimension 2 over Rational Field 
sage: parent(vector(QQ,[1,2]).pairwise_product(vector(ZZ,[1,2]))) 
Vector space of dimension 2 over Rational Field 
sage: parent(vector(QQ,[1,2]).pairwise_product(vector(QQ,[1,2]))) 
Vector space of dimension 2 over Rational Field

sage: parent(vector(QQ,[1,2,3,4]).pairwise_product(vector(ZZ[x],[1,2,3,4]))) 
Ambient free module of rank 4 over the principal ideal domain Univariate
Polynomial Ring in x over Rational Field 
sage: parent(vector(ZZ[x],[1,2,3,4]).pairwise_product(vector(QQ,[1,2,3,4]))) 
Ambient free module of rank 4 over the principal ideal domain Univariate
Polynomial Ring in x over Rational Field

sage: parent(vector(QQ,[1,2,3,4]).pairwise_product(vector(ZZ[x][y],[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field 
sage: parent(vector(ZZ[x][y],[1,2,3,4]).pairwise_product(vector(QQ,[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field

sage: parent(vector(QQ[x],[1,2,3,4]).pairwise_product(vector(ZZ[x][y],[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field 
sage: parent(vector(ZZ[x][y],[1,2,3,4]).pairwise_product(vector(QQ[x],[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field

sage: parent(vector(QQ[y],[1,2,3,4]).pairwise_product(vector(ZZ[x][y],[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field 
sage: parent(vector(ZZ[x][y],[1,2,3,4]).pairwise_product(vector(QQ[y],[1,2,3,4]))) 
Ambient free module of rank 4 over the integral domain Univariate
Polynomial Ring in y over Univariate Polynomial Ring in x over Rational
Field

sage: parent(vector(ZZ[x],[1,2,3,4]).pairwise_product(vector(ZZ[y],[1,2,3,4]))) 
Traceback (most recent call last): 
... 
TypeError: no common canonical parent for objects with parents: 'Ambient
free module of rank 4 over the integral domain Univariate Polynomial Ring
in x over Integer Ring' and 'Ambient free module of rank 4 over the
integral domain Univariate Polynomial Ring in y over Integer Ring'
sage: parent(vector(ZZ[x],[1,2,3,4]).pairwise_product(vector(QQ[y],[1,2,3,4]))) 
Traceback (most recent call last): 
... 
TypeError: no common canonical parent for objects with parents: 'Ambient
free module of rank 4 over the integral domain Univariate Polynomial Ring
in x over Integer Ring' and 'Ambient free module of rank 4 over the
principal ideal domain Univariate Polynomial Ring in y over Rational Field'
sage: parent(vector(QQ[x],[1,2,3,4]).pairwise_product(vector(ZZ[y],[1,2,3,4]))) 
Traceback (most recent call last): 
... 
TypeError: no common canonical parent for objects with parents: 'Ambient
free module of rank 4 over the principal ideal domain Univariate Polynomial
Ring in x over Rational Field' and 'Ambient free module of rank 4 over the
integral domain Univariate Polynomial Ring in y over Integer Ring'
sage: parent(vector(QQ[x],[1,2,3,4]).pairwise_product(vector(QQ[y],[1,2,3,4]))) 
Traceback (most recent call last): 
... 
TypeError: no common canonical parent for objects with parents: 'Ambient
free module of rank 4 over the principal ideal domain Univariate Polynomial
Ring in x over Rational Field' and 'Ambient free module of rank 4 over the
principal ideal domain Univariate Polynomial Ring in y over Rational Field'

plot( )

INPUT:
    xmin -- (default: 0) start x position to start plotting
    xmax -- (default: 1) stop x position to stop plotting
    eps -- (default: determined by xmax) we view this vector
           as defining a function at the points xmin, xmin +
           eps, xmin + 2*eps, ...,
    res -- (default: all points) total number of points to include
           in the graph 
    connect -- (default: True) if True draws a line; otherwise draw
               a list of points.
    step -- (default: False) if True draw a step function plot.

sage: eps=0.1
sage: v = vector(RDF, [sin(n*eps) for n in range(100)])
sage: plot(v, eps=eps, xmax=5, hue=0).show()
sage: v.plot(eps=eps, xmax=5, hue=0).show()

set( )

set is meant to be more efficient than setitem, because it does not do any error checking or coercion. Use with care.

support( )

Return the integers i such that self[i] != 0. This is the same as the nonzero_positions function.

Special Functions: __abs__,$  $ __delitem__,$  $ __delslice__,$  $ __eq__,$  $ __ge__,$  $ __getitem__,$  $ __getslice__,$  $ __gt__,$  $ __invert__,$  $ __le__,$  $ __len__,$  $ __lt__,$  $ __mod__,$  $ __ne__,$  $ __pos__,$  $ __pow__,$  $ __rmod__,$  $ __rpow__,$  $ __setitem__,$  $ __setslice__,$  $ _hash,$  $ _latex_,$  $ _repr_,$  $ _vector_

_hash( )

_latex_( )

Return a latex representation of self. For example, if self is the free module element (1,2,3,4), then following latex is generated: "(1,2,3,4)" (without the quotes).

_repr_( )

_vector_( )

Class: FreeModuleElement_generic_dense

class FreeModuleElement_generic_dense
File: sage/modules/free_module_element.pyx (starting at line 863)

A generic dense element of a free module. a

Functions: list

Special Functions: __copy__,$  $ __delitem__,$  $ __delslice__,$  $ __getitem__,$  $ __reduce__,$  $ __setitem__,$  $ __setslice__,$  $ _hash

__copy__( )

__reduce__( )

_hash( )

Class: FreeModuleElement_generic_sparse

class FreeModuleElement_generic_sparse
File: sage/modules/free_module_element.pyx (starting at line 1101)

A generic sparse free module element is a dictionary with keys ints i and entries in the base ring.

Pickling works:

sage: v = FreeModule(ZZ, 3, sparse=True).0
sage: loads(dumps(v)) == v
True
sage: v = FreeModule(Integers(8)['x,y'], 5, sparse=True).1
sage: loads(dumps(v)) - v
(0, 0, 0, 0, 0)

sage: a = vector([-1,0,1/1],sparse=True); b = vector([-1/1,0,0],sparse=True)
sage: a.parent()
Sparse vector space of dimension 3 over Rational Field
sage: b - a
(0, 0, -1)

Functions: denominator,$  $ dict,$  $ get,$  $ iteritems,$  $ list,$  $ nonzero_positions,$  $ set

get( )

Like __getitem__ but with no type or bounds checking. Returns 0 if access is out of bounds.

nonzero_positions( )

Returns the set of pairs (i,j) such that self[i,j] != 0.

set( )

Like __setitem__ but with no type or bounds checking.

Special Functions: __copy__,$  $ __delitem__,$  $ __getitem__,$  $ __reduce__,$  $ __setitem__

__copy__( )

__reduce__( )

See About this document... for information on suggesting changes.