Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
""" Vectors with elements in GF(2).
AUTHOR:
- Martin Albrecht (2009-12): initial implementation - Thomas Feulner (2012-11): added :meth:`Vector_mod2_dense.hamming_weight`
EXAMPLES::
sage: VS = GF(2)^3 sage: e = VS.random_element(); e (1, 0, 0) sage: f = VS.random_element(); f (0, 1, 1) sage: e + f (1, 1, 1)
TESTS::
sage: w = vector(GF(2), [-1,0,0,0]) sage: w.set_immutable() sage: isinstance(hash(w), int) True """
#***************************************************************************** # Copyright (C) 2009 Martin Albrecht <M.R.Albrecht@rhul.ac.uk> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # http://www.gnu.org/licenses/ #***************************************************************************** from __future__ import absolute_import
from sage.rings.finite_rings.integer_mod cimport IntegerMod_int, IntegerMod_abstract from sage.rings.integer cimport Integer from sage.rings.rational cimport Rational from sage.structure.element cimport Element, ModuleElement, RingElement, Vector
cimport sage.modules.free_module_element as free_module_element from .free_module_element import vector
from sage.libs.m4ri cimport *
cdef class Vector_mod2_dense(free_module_element.FreeModuleElement): cdef _new_c(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS([0,0,1]) (0, 0, 1) sage: type(_) <type 'sage.modules.vector_mod2_dense.Vector_mod2_dense'> """ cdef Vector_mod2_dense y
cdef bint is_dense_c(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS([0,0,1]).is_dense() True """
cdef bint is_sparse_c(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS([0,0,1]).is_sparse() False """
def __copy__(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10^4) sage: v = VS.random_element() sage: w = copy(v) sage: w == v True sage: v[:10] (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) sage: w[:10] (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) """
cdef _init(self, Py_ssize_t degree, parent): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS([0,0,1]) (0, 0, 1) sage: type(_) <type 'sage.modules.vector_mod2_dense.Vector_mod2_dense'> """ raise MemoryError("Allocation of Vector_mod2_dense failed.")
def __cinit__(self, parent=None, x=None, coerce=True, copy=True): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS((0,0,1/3)) (0, 0, 1) sage: type(_) <type 'sage.modules.vector_mod2_dense.Vector_mod2_dense'> """
def __init__(self, parent, x, coerce=True, copy=True): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),3) sage: VS((0,0,1/3)) (0, 0, 1) sage: type(_) <type 'sage.modules.vector_mod2_dense.Vector_mod2_dense'> sage: VS((0,0,int(3))) (0, 0, 1) sage: VS((0,0,3)) (0, 0, 1) sage: VS((0,0,GF(2)(1))) (0, 0, 1)
TESTS:
Check that ticket :trac:`8601` is fixed::
sage: VS = VectorSpace(GF(2), 3) sage: VS((-1,-2,-3)) (1, 0, 1) sage: V = VectorSpace(GF(2), 2) sage: V([1,3]) (1, 1) sage: V([1,-3]) (1, 1)
Check integer overflow prior to :trac:`21746`::
sage: VS = VectorSpace(GF(2),1) sage: VS([2**64]) (0) sage: VS([3**100/5**100]) (1)
Check division error over rationals::
sage: V = VectorSpace(GF(2), 2) sage: V([1/3, 3/4]) Traceback (most recent call last): ... ZeroDivisionError: inverse does not exist
Check zero initialization::
sage: for _ in range(1,100): ....: assert VectorSpace(GF(2), randint(1,5000))(0).is_zero() sage: (GF(2)**5)(1) Traceback (most recent call last): ... TypeError: can't initialize vector from nonzero non-list sage: (GF(2)**0).zero_vector() () """ cdef Py_ssize_t i # the if/else statement is because in some compilers, (-1)%2 is -1 else: mzd_write_bit(self._entries, 0, i, xi%2)
def __dealloc__(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10^3) sage: import gc sage: for i in range(10): ....: v = VS.random_element() ....: del v ....: _ = gc.collect() """
cpdef int _cmp_(left, right) except -2: """ EXAMPLES:: sage: v = vector(GF(2), [0,0,0,0]) sage: v == 0 True sage: v == 1 False sage: v == v True sage: w = vector(GF(2), [1,0,0,0]) sage: w < v False sage: w > v True sage: w = vector(GF(2), [-1,0,0,0]) sage: w == w True """ if left._degree == 0: return 0 return mzd_cmp(left._entries, (<Vector_mod2_dense>right)._entries)
cdef get_unsafe(self, Py_ssize_t i): """ EXAMPLES::
sage: v = vector(GF(2), [1,2,3]); v (1, 0, 1) sage: v[0] 1 sage: v[2] 1 sage: v[-2] 0 sage: v[0:2] (1, 0) """
cdef int set_unsafe(self, Py_ssize_t i, value) except -1: """ EXAMPLES::
sage: VS = VectorSpace(GF(2),4) sage: v = VS.random_element(); v (1, 0, 0, 0) sage: v[0] = 0; v (0, 0, 0, 0) sage: v[1:3] = [1, 1]; v (0, 1, 1, 0) sage: v[4] = 0 Traceback (most recent call last): ... IndexError: vector index out of range """
def __reduce__(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10^4) sage: e = VS.random_element() sage: loads(dumps(e)) == e True """
cpdef _add_(self, right): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS([0,0,1,1,0,0,1,1,0,0]) sage: f = VS([0,1,0,1,0,1,0,1,0,1]) sage: e + f #indirect doctest (0, 1, 1, 0, 0, 1, 1, 0, 0, 1) """
cpdef _sub_(self, right): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS([0,0,1,1,0,0,1,1,0,0]) sage: f = VS([0,1,0,1,0,1,0,1,0,1]) sage: e - f #indirect doctest (0, 1, 1, 0, 0, 1, 1, 0, 0, 1) """
cpdef int hamming_weight(self): """ Return the number of positions ``i`` such that ``self[i] != 0``.
EXAMPLES::
sage: vector(GF(2), [1,1,0]).hamming_weight() 2 """ cdef int i
cpdef _dot_product_(self, Vector right): """ EXAMPLES:: sage: VS = VectorSpace(GF(2),3) sage: v = VS([1,1,1]); w = VS([0,0,0]) sage: v * w, w * v #indirect doctest (0, 0) sage: v = VS([1,1,1]); w = VS([0,1,0]) sage: v * w, w * v (1, 1) sage: v = VS([1,1,1]); w = VS([0,1,1]) sage: v * w, w * v (0, 0) sage: v = VS([1,1,1]); w = VS([1,1,1]) sage: v * w, w * v (1, 1)
sage: VS = VectorSpace(GF(2),10^4) sage: v = VS(0); w = VS(0) sage: v[1337] = 1; w[1337] = 1 sage: v * w, w * v (1, 1) sage: v[9881] = 1; w[9881] = 1 sage: v * w, w * v (0, 0) sage: v[5172] = 1; w[6178] = 1 sage: v * w, w * v (0, 0) """ cdef Py_ssize_t i cdef IntegerMod_int n
cpdef _pairwise_product_(self, Vector right): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS.random_element(); e (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) sage: f = VS.random_element(); f (1, 1, 0, 1, 1, 1, 0, 0, 0, 1) sage: e.pairwise_product(f) #indirect doctest (1, 0, 0, 0, 1, 1, 0, 0, 0, 1) """ cdef Vector_mod2_dense z, r cdef Py_ssize_t i
cpdef _lmul_(self, Element left): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS.random_element(); e (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) sage: 0 * e (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) sage: 1 * e (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) sage: 2 * e #indirect doctest (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
::
sage: VS = VectorSpace(GF(2),10) sage: e = VS.random_element(); e (1, 1, 0, 1, 1, 1, 0, 0, 0, 1) sage: e * 0 #indirect doctest (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) sage: e * 1 (1, 1, 0, 1, 1, 1, 0, 0, 0, 1) sage: e * 2 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) """ cdef IntegerMod_int a
else:
cpdef _neg_(self): """ EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS.random_element() sage: -e == e True """
def list(self, copy=True): """ Return a list of entries in ``self``.
INPUT:
- ``copy`` - always ``True``
EXAMPLES::
sage: VS = VectorSpace(GF(2),10) sage: e = VS.random_element(); e (1, 0, 0, 0, 1, 1, 1, 0, 0, 1) sage: e.list() [1, 0, 0, 0, 1, 1, 1, 0, 0, 1] """ cdef Py_ssize_t i
def unpickle_v0(parent, entries, degree, is_mutable): """ EXAMPLES::
sage: from sage.modules.vector_mod2_dense import unpickle_v0 sage: VS = VectorSpace(GF(2),10) sage: unpickle_v0(VS, [0,1,2,3,4,5,6,7,8,9], 10, 0) (0, 1, 0, 1, 0, 1, 0, 1, 0, 1) """ # If you think you want to change this function, don't. cdef Vector_mod2_dense v cdef int xi
else: mzd_write_bit(v._entries, 0, i, entries[i]%2)
|