Path: blob/master/sage/modules/vector_integer_dense.pyx
4036 views
"""1Vectors with integer entries23AUTHOR:45- William Stein (2007)67EXAMPLES::89sage: v = vector(ZZ,[1,2,3,4,5])10sage: v11(1, 2, 3, 4, 5)12sage: 3*v13(3, 6, 9, 12, 15)14sage: v*715(7, 14, 21, 28, 35)16sage: -v17(-1, -2, -3, -4, -5)18sage: v - v19(0, 0, 0, 0, 0)20sage: v + v21(2, 4, 6, 8, 10)22sage: v * v # dot product.23552425We make a large zero vector::2627sage: k = ZZ^100000; k28Ambient free module of rank 100000 over the principal ideal domain Integer Ring29sage: v = k(0)30sage: v[:10]31(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)3233TESTS::3435sage: v = vector(ZZ, [1,2,3,4])36sage: loads(dumps(v)) == v37True38"""3940###############################################################################41# Sage: System for Algebra and Geometry Experimentation42# Copyright (C) 2007 William Stein <[email protected]>43# Distributed under the terms of the GNU General Public License (GPL)44# http://www.gnu.org/licenses/45###############################################################################4647include '../ext/interrupt.pxi'48include '../ext/stdsage.pxi'4950from sage.structure.element cimport Element, ModuleElement, RingElement, Vector5152from sage.rings.integer cimport Integer5354cimport free_module_element5556from free_module_element import vector5758cdef inline _Integer_from_mpz(mpz_t e):59cdef Integer z = PY_NEW(Integer)60mpz_set(z.value, e)61return z6263cdef class Vector_integer_dense(free_module_element.FreeModuleElement):64cdef _new_c(self):65cdef Vector_integer_dense y66y = PY_NEW(Vector_integer_dense)67y._init(self._degree, self._parent)68return y6970cdef bint is_dense_c(self):71return 172cdef bint is_sparse_c(self):73return 07475def __copy__(self):76cdef Vector_integer_dense y77y = self._new_c()78cdef Py_ssize_t i79for i from 0 <= i < self._degree:80mpz_init_set(y._entries[i], self._entries[i])81return y8283cdef _init(self, Py_ssize_t degree, parent):84self._degree = degree85self._parent = parent86self._is_mutable = 187self._entries = <mpz_t *> sage_malloc(sizeof(mpz_t) * degree)88if self._entries == NULL:89raise MemoryError9091def __cinit__(self, parent=None, x=None, coerce=True,copy=True):92self._entries = NULL93self._is_mutable = 194if not parent is None:95self._init(parent.degree(), parent)9697def __init__(self, parent, x, coerce=True, copy=True):98cdef Py_ssize_t i99cdef Integer z100# we have to do this to avoid a garbage collection error in dealloc101for i from 0 <= i < self._degree:102mpz_init(self._entries[i])103if isinstance(x, (list, tuple)):104if len(x) != self._degree:105raise TypeError("x must be a list of the right length")106for i from 0 <= i < self._degree:107z = Integer(x[i])108mpz_set(self._entries[i], z.value)109return110if x != 0:111raise TypeError("can't initialize vector from nonzero non-list")112113def __dealloc__(self):114cdef Py_ssize_t i115if self._entries:116for i from 0 <= i < self._degree:117mpz_clear(self._entries[i])118sage_free(self._entries)119120cdef int _cmp_c_impl(left, Element right) except -2:121"""122EXAMPLES::123124sage: v = vector(ZZ, [0,0,0,0])125sage: v == 0126True127sage: v == 1128False129sage: v == v130True131sage: w = vector(ZZ, [-1,0,0,0])132sage: w < v133True134sage: w > v135False136"""137cdef Py_ssize_t i138cdef int c139for i from 0 <= i < left.degree():140c = mpz_cmp(left._entries[i], (<Vector_integer_dense>right)._entries[i])141if c < 0:142return -1143elif c > 0:144return 1145return 0146147def __len__(self):148return self._degree149150def __setitem__(self, i, value):151"""152EXAMPLES::153154sage: v = vector([1,2,3]); v155(1, 2, 3)156sage: v[0] = 2157sage: v[1:3] = [1, 4]; v158(2, 1, 4)159"""160if not self._is_mutable:161raise ValueError("vector is immutable; please change a copy instead (use copy())")162cdef Integer z163cdef Py_ssize_t k, d, n164if isinstance(i, slice):165start, stop = i.start, i.stop166d = self.degree()167R = self.base_ring()168n = 0169for k from start <= k < stop:170if k >= d:171return172if k >= 0:173self[k] = R(value[n])174n = n + 1175else:176if i < 0 or i >= self._degree:177raise IndexError178else:179z = Integer(value)180mpz_set(self._entries[i], z.value)181182def __getitem__(self, i):183"""184Returns `i`-th entry or slice of self.185186EXAMPLES::187188sage: v = vector([1,2,3]); v189(1, 2, 3)190sage: v[0]1911192sage: v[-2]1932194sage: v[0:2]195(1, 2)196sage: v[5]197Traceback (most recent call last):198...199IndexError: index out of range200sage: v[-5]201Traceback (most recent call last):202...203IndexError: index out of range204"""205cdef Integer z = PY_NEW(Integer)206if isinstance(i, slice):207start, stop, step = i.indices(len(self))208return vector(self.base_ring(), self.list()[start:stop])209else:210if i < 0:211i += self._degree212if i < 0 or i >= self._degree:213raise IndexError('index out of range')214else:215mpz_set(z.value, self._entries[i])216return z217218def list(self,copy=True):219"""220The list of entries of the vector.221222INPUT:223224- ``copy``, ignored optional argument.225226EXAMPLES::227228sage: v = vector([1,2,3,4])229sage: a = v.list(copy=False); a230[1, 2, 3, 4]231sage: a[0] = 0232sage: v233(1, 2, 3, 4)234"""235cdef int i236return [_Integer_from_mpz(self._entries[i]) for i in237xrange(self._degree)]238239def __reduce__(self):240return (unpickle_v1, (self._parent, self.list(), self._degree, self._is_mutable))241242cpdef ModuleElement _add_(self, ModuleElement right):243cdef Vector_integer_dense z, r244r = right245z = self._new_c()246cdef Py_ssize_t i247for i from 0 <= i < self._degree:248mpz_init(z._entries[i])249mpz_add(z._entries[i], self._entries[i], r._entries[i])250return z251252253cpdef ModuleElement _sub_(self, ModuleElement right):254cdef Vector_integer_dense z, r255r = right256z = self._new_c()257cdef Py_ssize_t i258for i from 0 <= i < self._degree:259mpz_init(z._entries[i])260mpz_sub(z._entries[i], self._entries[i], r._entries[i])261return z262263cpdef Element _dot_product_(self, Vector right):264"""265Dot product of dense vectors over the integers.266267EXAMPLES::268269sage: v = vector(ZZ, [1,2,-3]); w = vector(ZZ,[4,3,2])270sage: v*w2714272sage: w*v2734274"""275cdef Vector_integer_dense r = right276cdef Integer z277z = PY_NEW(Integer)278cdef mpz_t t279mpz_init(t)280mpz_set_si(z.value, 0)281cdef Py_ssize_t i282for i from 0 <= i < self._degree:283mpz_mul(t, self._entries[i], r._entries[i])284mpz_add(z.value, z.value, t)285mpz_clear(t)286return z287288cpdef Vector _pairwise_product_(self, Vector right):289"""290EXAMPLES::291292sage: v = vector(ZZ, [1,2,-3]); w = vector(ZZ,[4,3,2])293sage: v.pairwise_product(w)294(4, 6, -6)295"""296cdef Vector_integer_dense z, r297r = right298z = self._new_c()299cdef Py_ssize_t i300for i from 0 <= i < self._degree:301mpz_init(z._entries[i])302mpz_mul(z._entries[i], self._entries[i], r._entries[i])303return z304305cpdef ModuleElement _rmul_(self, RingElement left):306cdef Vector_integer_dense z307cdef Integer a308a = left309z = self._new_c()310cdef Py_ssize_t i311for i from 0 <= i < self._degree:312mpz_init(z._entries[i])313mpz_mul(z._entries[i], self._entries[i], a.value)314return z315316cpdef ModuleElement _lmul_(self, RingElement right):317cdef Vector_integer_dense z318cdef Integer a319a = right320z = self._new_c()321cdef Py_ssize_t i322for i from 0 <= i < self._degree:323mpz_init(z._entries[i])324mpz_mul(z._entries[i], self._entries[i], a.value)325return z326327cpdef ModuleElement _neg_(self):328cdef Vector_integer_dense z329z = self._new_c()330cdef Py_ssize_t i331for i from 0 <= i < self._degree:332mpz_init(z._entries[i])333mpz_neg(z._entries[i], self._entries[i])334return z335336def _singular_(self, singular=None):337r"""338Return \Singular representation of this integer vector.339340INPUT:341342- singular -- \Singular interface instance (default: None)343344EXAMPLES::345346sage: A = random_matrix(ZZ,1,3)347sage: v = A.row(0)348sage: vs = singular(v); vs349-8,3502,3510352sage: vs.type()353'intvec'354"""355if singular is None:356from sage.interfaces.singular import singular as singular_default357singular = singular_default358359name = singular._next_var_name()360values = str(self.list())[1:-1]361singular.eval("intvec %s = %s"%(name, values))362363from sage.interfaces.singular import SingularElement364return SingularElement(singular, 'foobar', name, True)365366def unpickle_v0(parent, entries, degree):367# If you think you want to change this function, don't.368# Instead make a new version with a name like369# make_FreeModuleElement_generic_dense_v1370# and changed the reduce method below.371cdef Vector_integer_dense v372v = PY_NEW(Vector_integer_dense)373v._init(degree, parent)374cdef Integer z375for i from 0 <= i < degree:376z = Integer(entries[i])377mpz_init_set(v._entries[i], z.value)378return v379380def unpickle_v1(parent, entries, degree, is_mutable):381cdef Vector_integer_dense v382v = PY_NEW(Vector_integer_dense)383v._init(degree, parent)384cdef Integer z385for i from 0 <= i < degree:386z = Integer(entries[i])387mpz_init_set(v._entries[i], z.value)388v._is_mutable = is_mutable389return v390391392