Ticket #14336: m4rie_new_version.patch

File m4rie_new_version.patch, 51.1 KB (added by malb, 8 years ago)
  • module_list.py

    # HG changeset patch
    # User Martin Albrecht <martinralbrecht@googlemail.com>
    # Date 1366293864 -3600
    # Node ID c6b62368932f124230cc408ee26db69bc9ead518
    # Parent  32d2e829ed7c52175c00d8f874b3e952748ba129
    update M4RIE interface to newest upstream release (#14336)
    
    diff --git a/module_list.py b/module_list.py
    a b  
    5050#########################################################
    5151
    5252import ast
    53 m4ri_extra_compile_args = []
     53m4ri_extra_compile_args = ["-std=c99"]
    5454for line in open(SAGE_INC + "/m4ri/m4ri_config.h"):
    5555    if not line.startswith("#define __M4RI_SIMD_CFLAGS"):
    5656        continue
    5757    m4ri_sse2_cflags = ast.literal_eval(line[len("#define __M4RI_SIMD_CFLAGS"):].strip())
    58     m4ri_extra_compile_args = [flag.strip() for flag in m4ri_sse2_cflags.split(" ") if flag.strip()]
     58    m4ri_extra_compile_args.extend( [flag.strip() for flag in m4ri_sse2_cflags.split(" ") if flag.strip()] )
    5959    break
    6060
    6161singular_libs = ['m', 'readline', 'singular', 'givaro', 'ntl', 'gmpxx', 'gmp']
     
    10111011    # TODO -- change to use BLAS at some point.
    10121012    Extension('sage.matrix.matrix_integer_dense',
    10131013              sources = ['sage/matrix/matrix_integer_dense.pyx'],
    1014               extra_compile_args = ['-std=c99'] + m4ri_extra_compile_args,
     1014              extra_compile_args = m4ri_extra_compile_args,
    10151015              depends = [SAGE_INC + '/m4ri/m4ri.h'],
    10161016              # order matters for cygwin!!
    10171017              libraries = ['iml', 'pari', 'gmp', 'm', BLAS, BLAS2]),
     
    10231023    Extension('sage.matrix.matrix_mod2_dense',
    10241024              sources = ['sage/matrix/matrix_mod2_dense.pyx'],
    10251025              libraries = ['gmp','m4ri', 'gd', 'png12', 'z'],
    1026               extra_compile_args = ['-std=c99'] + m4ri_extra_compile_args,
     1026              extra_compile_args = m4ri_extra_compile_args,
    10271027              depends = [SAGE_INC + "/png.h", SAGE_INC + "/m4ri/m4ri.h"]),
    10281028
    10291029    Extension('sage.matrix.matrix_mod2e_dense',
    10301030              sources = ['sage/matrix/matrix_mod2e_dense.pyx'],
    1031               libraries = ['m4rie', 'm4ri', 'givaro', 'ntl', 'gmpxx', 'gmp', 'm', 'stdc++'],
     1031              libraries = ['m4rie', 'm4ri', 'm'],
    10321032              depends = [SAGE_INC + "/m4rie/m4rie.h"],
    10331033              include_dirs = [SAGE_INC + '/m4rie'],
    1034               extra_compile_args = m4ri_extra_compile_args + givaro_extra_compile_args,
    1035               language="c++"),
     1034              extra_compile_args = m4ri_extra_compile_args,
     1035              language="c"),
    10361036
    10371037    Extension('sage.matrix.matrix_modn_dense',
    10381038              sources = ['sage/matrix/matrix_modn_dense.pyx'],
     
    12851285    Extension('sage.modules.vector_mod2_dense',
    12861286              sources = ['sage/modules/vector_mod2_dense.pyx'],
    12871287              libraries = ['gmp','m4ri', 'png12', 'gd'],
    1288               extra_compile_args = ['-std=c99'] + m4ri_extra_compile_args,
     1288              extra_compile_args = m4ri_extra_compile_args,
    12891289              depends = [SAGE_INC + "/png.h", SAGE_INC + "/m4ri/m4ri.h"]),
    12901290   
    12911291    Extension('sage.modules.vector_rational_dense',
  • sage/crypto/mq/sr.py

    diff --git a/sage/crypto/mq/sr.py b/sage/crypto/mq/sr.py
    a b  
    10561056       
    10571057            sage: sr = mq.SR(2, 2, 2, 4)
    10581058            sage: sr.random_state_array()
    1059             [      a^2 + 1 a^3 + a^2 + a]
    1060             [  a^3 + a + 1         a + 1]
     1059            [              a^2       a^3 + a + 1]
     1060            [a^3 + a^2 + a + 1             a + 1]
    10611061        """
    10621062        return random_matrix(self.base_ring(), self._r, self._c, *args, **kwds)
    10631063
     
    10701070       
    10711071            sage: sr = mq.SR(2, 2, 2, 4)
    10721072            sage: sr.random_vector()
    1073             [      a^2 + 1]
    1074             [            a]
    1075             [          a^2]
    1076             [        a + 1]
    1077             [  a^3 + a + 1]
    1078             [      a^3 + 1]
    1079             [a^3 + a^2 + 1]
    1080             [a^3 + a^2 + a]
    1081             [a^3 + a^2 + a]
    1082             [  a^3 + a + 1]
    1083             [      a^3 + 1]
    1084             [a^3 + a^2 + 1]
    1085             [        a + 1]
    1086             [      a^2 + 1]
    1087             [            a]
    1088             [          a^2]
     1073            [              a^2]
     1074            [            a + 1]
     1075            [          a^2 + 1]
     1076            [                a]
     1077            [a^3 + a^2 + a + 1]
     1078            [          a^3 + a]
     1079            [              a^3]
     1080            [        a^3 + a^2]
     1081            [      a^3 + a + 1]
     1082            [          a^3 + 1]
     1083            [    a^3 + a^2 + 1]
     1084            [    a^3 + a^2 + a]
     1085            [            a + 1]
     1086            [          a^2 + 1]
     1087            [                a]
     1088            [              a^2]
    10891089       
    10901090        .. note::
    10911091
     
    11091109       
    11101110            sage: sr = mq.SR()
    11111111            sage: sr.random_element()
     1112            [    a^2]
     1113            [  a + 1]
    11121114            [a^2 + 1]
    11131115            [      a]
    1114             [    a^2]
    1115             [  a + 1]
    11161116            sage: sr.random_element('state_array')
    1117             [a^3 + 1]
     1117            [a^3 + a + 1]
    11181118
    11191119        Passes extra positional or keyword arguments through::
    11201120
     
    20332033            sage: P = sr.vars("P",0)
    20342034            sage: F,s = sr.polynomial_system(P=P,C=C)
    20352035            sage: [(k,v) for k,v in sorted(s.iteritems())] # this can be ignored
    2036             [(k003, 1), (k002, 0), (k001, 0), (k000, 1)]
     2036            [(k003, 1), (k002, 1), (k001, 0), (k000, 1)]
    20372037            sage: F
    20382038            Polynomial Sequence with 36 Polynomials in 28 Variables
    20392039            sage: F.part(0)
     
    22202220            sage: sr = mq.SR()
    22212221            sage: A = sr.random_state_array()
    22222222            sage: A
    2223             [a^2 + 1]
     2223            [a^2]
    22242224            sage: sr.antiphi(sr.phi(A)) == A
    22252225            True
    22262226        """
     
    26252625            sage: sr = mq.SR(gf2=True)
    26262626            sage: A = sr.random_state_array()
    26272627            sage: A
    2628             [a^2 + 1]
     2628            [a^2]
    26292629            sage: sr.antiphi(sr.phi(A)) == A
    26302630            True
    26312631        """
  • sage/libs/m4rie.pxd

    diff --git a/sage/libs/m4rie.pxd b/sage/libs/m4rie.pxd
    a b  
    1111
    1212cdef extern from "m4rie/m4rie.h":
    1313    ctypedef struct gf2e:
    14         m4ri_word **mul
    15         m4ri_word *inv
    16         size_t degree
     14        int degree
    1715        m4ri_word minpoly
    1816
     17        m4ri_word *pow_gen
     18        m4ri_word *red
     19
     20        m4ri_word (*inv)(gf2e *ff, m4ri_word a)
     21        m4ri_word (*mul)(gf2e *ff, m4ri_word a, m4ri_word b)
     22
     23    gf2e *gf2e_init(m4ri_word minpoly)
    1924    void gf2e_free(gf2e *ff)
    2025
    2126#cdef extern from "m4rie/mzed.h":
     
    5257
    5358    void mzed_add_elem(mzed_t *a, const_size_t row, const_size_t col, const_int elem)
    5459
    55     void mzed_add_multiple_of_row(mzed_t *A, size_t ar, mzed_t *B, size_t br, m4ri_word *X, size_t start_col)
     60    void mzed_add_multiple_of_row(mzed_t *A, size_t ar, mzed_t *B, size_t br, m4ri_word x, size_t start_col)
    5661
    57     void mzed_rescale_row(mzed_t *A, size_t r, size_t c, m4ri_word *X)
     62    void mzed_rescale_row(mzed_t *A, size_t r, size_t c, m4ri_word x)
    5863
    5964    void mzed_row_swap(mzed_t *M, const_size_t rowa, const_size_t rowb)
    6065
     
    159164
    160165    int mzd_slice_is_zero(mzd_slice_t *A)
    161166
    162     void mzd_slice_rescale_row(mzd_slice_t *A, size_t r, size_t c, m4ri_word *X)
     167    void mzd_slice_rescale_row(mzd_slice_t *A, size_t r, size_t c, m4ri_word x)
    163168
    164169    void mzd_slice_row_swap(mzd_slice_t *A, size_t rowa, size_t rowb)
    165170
     
    197202    mzd_slice_t *_mzd_slice_mul_karatsuba2(mzd_slice_t *C, mzd_slice_t *A, mzd_slice_t *B)
    198203
    199204    mzd_slice_t *_mzd_slice_mul_karatsuba3(mzd_slice_t *C, mzd_slice_t *A, mzd_slice_t *B)
    200 
    201 cdef extern from "m4rie/finite_field_givaro.h":
    202     ctypedef struct M4RIE__FiniteField "M4RIE::FiniteField":
    203         int (* pol2log)(int r)
    204         int (* log2pol)(int r)
    205        
    206     gf2e *gf2e_init_givgfq(M4RIE__FiniteField *givgfq)
    207 
    208     int mzed_read_elem_log(const_mzed_t *a, const_size_t row, const_size_t col, M4RIE__FiniteField *ff)
    209     void mzed_write_elem_log(mzed_t *a, const_size_t row, const_size_t col, const_int elem, M4RIE__FiniteField *ff)
    210     void mzed_add_elem_log(mzed_t *a, const_size_t row, const_size_t col, const_int elem, M4RIE__FiniteField *ff)
    211        
  • sage/matrix/matrix_mod2e_dense.pxd

    diff --git a/sage/matrix/matrix_mod2e_dense.pxd b/sage/matrix/matrix_mod2e_dense.pxd
    a b  
    11# choose: dense or sparse
    22
    3 from sage.rings.finite_rings.element_givaro cimport GivaroGfq, Cache_givaro
    4 
    53from sage.libs.m4rie cimport mzed_t
    64
    75cimport matrix_dense
    86
    97cdef class Matrix_mod2e_dense(matrix_dense.Matrix_dense):
    108    cdef mzed_t *_entries
    11     cdef Cache_givaro cc
    129    cdef object _one
    1310    cdef object _zero
    1411
  • sage/matrix/matrix_mod2e_dense.pyx

    diff --git a/sage/matrix/matrix_mod2e_dense.pyx b/sage/matrix/matrix_mod2e_dense.pyx
    a b  
    3535    sage: K.<a> = GF(2^8)
    3636    sage: A = random_matrix(K, 3,4)
    3737    sage: A
    38     [                  a^3 + a^2 + 1         a^7 + a^5 + a^4 + a + 1                       a^7 + a^3                   a^6 + a^4 + a]
    39     [      a^5 + a^4 + a^3 + a^2 + 1 a^7 + a^6 + a^5 + a^4 + a^3 + a             a^5 + a^4 + a^3 + a             a^6 + a^4 + a^2 + 1]
    40     [  a^6 + a^5 + a^4 + a^2 + a + 1   a^7 + a^5 + a^3 + a^2 + a + 1       a^7 + a^6 + a^3 + a^2 + a             a^7 + a^5 + a^3 + a]
     38    [          a^6 + a^5 + a^4 + a^2               a^6 + a^3 + a + 1         a^5 + a^3 + a^2 + a + 1               a^7 + a^6 + a + 1]
     39    [                a^7 + a^6 + a^3             a^7 + a^6 + a^5 + 1         a^5 + a^4 + a^3 + a + 1 a^6 + a^5 + a^4 + a^3 + a^2 + 1]
     40    [              a^6 + a^5 + a + 1                   a^7 + a^3 + 1               a^7 + a^3 + a + 1   a^7 + a^6 + a^3 + a^2 + a + 1]
    4141
    4242    sage: A.echelon_form()
    43     [                        1                         0                         0       a^7 + a^6 + a^2 + a]
    44     [                        0                         1                         0     a^6 + a^4 + a^3 + a^2]
    45     [                        0                         0                         1 a^6 + a^4 + a^3 + a^2 + a]
     43    [                        1                         0                         0     a^6 + a^5 + a^4 + a^2]
     44    [                        0                         1                         0   a^7 + a^5 + a^3 + a + 1]
     45    [                        0                         0                         1 a^6 + a^4 + a^3 + a^2 + 1]
    4646
    4747AUTHOR:
    4848
     
    6161REFERENCES:
    6262
    6363.. [BB09] Tomas J. Boothby and Robert W. Bradshaw. *Bitslicing
    64 and the Method of Four Russians Over Larger Finite
    65 Fields*. arXiv:0901.1413v1,
     64   and the Method of Four Russians Over Larger Finite Fields*. arXiv:0901.1413v1,
    66652009. http://arxiv.org/abs/0901.1413
    6766"""
    6867
     
    7675from sage.structure.element cimport ModuleElement, Element, RingElement
    7776
    7877from sage.rings.all import FiniteField as GF
    79 from sage.rings.finite_rings.element_givaro cimport FiniteField_givaroElement, GivRandom, GivRandomSeeded
    8078from sage.misc.randstate cimport randstate, current_randstate
    8179
    8280from sage.matrix.matrix_mod2_dense cimport Matrix_mod2_dense
    8381
    8482from sage.libs.m4ri cimport m4ri_word, mzd_copy, mzd_init
    8583from sage.libs.m4rie cimport *
    86 from sage.libs.m4rie cimport mzed_t, M4RIE__FiniteField
     84from sage.libs.m4rie cimport mzed_t
    8785
    8886
    8987# we must keep a copy of the internal finite field representation
    9088# around to avoid re-creating it over and over again. Furthermore,
    9189# M4RIE assumes pointer equivalence of identical fields.
    9290
    93 _givaro_cache = {}
     91_m4rie_finite_field_cache = {}
    9492
    9593cdef class M4RIE_finite_field:
    9694    """
     
    121119        if self.ff:
    122120            gf2e_free(self.ff)
    123121
     122cdef m4ri_word poly_to_word(f):
     123    return f.integer_representation()
     124
     125cdef object word_to_poly(w, F):
     126    return F.fetch_int(w)
     127
    124128cdef class Matrix_mod2e_dense(matrix_dense.Matrix_dense):
    125129    ########################################################################
    126130    # LEVEL 1 functionality
     
    146150            [0 0 0 0]
    147151
    148152            sage: A.randomize(); A
    149             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    150             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    151             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     153            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     154            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     155            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    152156
    153157            sage: K.<a> = GF(2^3)
    154158            sage: A = Matrix(K,3,4); A
     
    157161            [0 0 0 0]
    158162
    159163            sage: A.randomize(); A
    160             [a^2 + 1       0   a + 1       0]
    161             [      a       a   a + 1       a]
    162             [      1     a^2 a^2 + a       0]
     164            [    a^2 + a     a^2 + 1     a^2 + a     a^2 + a]
     165            [    a^2 + 1 a^2 + a + 1     a^2 + 1         a^2]
     166            [    a^2 + a     a^2 + 1 a^2 + a + 1       a + 1]
    163167        """
    164168        matrix_dense.Matrix_dense.__init__(self, parent)
    165169
     
    167171
    168172        R = parent.base_ring()
    169173
    170         self.cc = <Cache_givaro>R._cache
     174        f = R.polynomial()
     175        cdef m4ri_word poly = sum(int(c)*2**i for i,c in enumerate(f))
    171176       
    172177        if alloc and self._nrows and self._ncols:
    173             if self.cc in _givaro_cache:
    174                 self._entries = mzed_init((<M4RIE_finite_field>_givaro_cache[self.cc]).ff, self._nrows, self._ncols)
     178            if poly in _m4rie_finite_field_cache:
     179                self._entries = mzed_init((<M4RIE_finite_field>_m4rie_finite_field_cache[poly]).ff, self._nrows, self._ncols)
    175180            else:
    176181                FF = PY_NEW(M4RIE_finite_field)
    177                 FF.ff = gf2e_init_givgfq(<M4RIE__FiniteField*>self.cc.objectptr)
     182                FF.ff = gf2e_init(poly)
    178183                self._entries = mzed_init(FF.ff, self._nrows, self._ncols)
    179                 _givaro_cache[self.cc] = FF
     184                _m4rie_finite_field_cache[poly] = FF
    180185
    181186        # cache elements
    182187        self._zero = self._base_ring(0)
     
    230235            [0 0 a]
    231236        """
    232237        cdef int i,j
    233         cdef FiniteField_givaroElement e
    234238
    235239        if entries is None:
    236240            return
     
    256260            if PyErr_CheckSignals(): raise KeyboardInterrupt
    257261            for j from 0 <= j < self._ncols:
    258262                e = R(entries[k])
    259                
    260                 mzed_write_elem_log(self._entries,i,j, e.element, <M4RIE__FiniteField*>self.cc.objectptr)
     263                mzed_write_elem(self._entries, i, j, poly_to_word(e))
    261264                k = k + 1
    262265           
    263266    cdef set_unsafe(self, Py_ssize_t i, Py_ssize_t j, value):
     
    283286            [          a a^3 + a + 1       a + 1       a + 1]
    284287            [        a^2 a^3 + a + 1     a^3 + a     a^3 + a]
    285288        """
    286         mzed_write_elem_log(self._entries, i, j, (<FiniteField_givaroElement>value).element, <M4RIE__FiniteField*>self.cc.objectptr)
     289        mzed_write_elem(self._entries, i, j, poly_to_word(value))
    287290
    288291    cdef get_unsafe(self, Py_ssize_t i, Py_ssize_t j):
    289292        """
     
    298301            sage: K.<a> = GF(2^4)
    299302            sage: A = random_matrix(K,3,4)
    300303            sage: A[2,3]                         # indirect doctest
    301             a^3 + a + 1
     304            a^3 + a^2 + a + 1
    302305            sage: K.<a> = GF(2^3)
    303306            sage: m,n  = 3, 4
    304307            sage: A = random_matrix(K,3,4); A
    305             [a^2 + 1       0   a + 1       0]
    306             [      a       a   a + 1       a]
    307             [      1     a^2 a^2 + a       0]
     308            [    a^2 + a     a^2 + 1     a^2 + a     a^2 + a]
     309            [    a^2 + 1 a^2 + a + 1     a^2 + 1         a^2]
     310            [    a^2 + a     a^2 + 1 a^2 + a + 1       a + 1]
    308311        """
    309         cdef int r = mzed_read_elem_log(self._entries, i, j, <M4RIE__FiniteField*>self.cc.objectptr)
    310         return self.cc._new_c(r)
     312        cdef int r = mzed_read_elem(self._entries, i, j)
     313        return word_to_poly(r, self._base_ring)
    311314
    312315    cpdef ModuleElement _add_(self, ModuleElement right):
    313316        """
     
    321324       
    322325            sage: K.<a> = GF(2^4)
    323326            sage: A = random_matrix(K,3,4); A
    324             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    325             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    326             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     327            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     328            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     329            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    327330           
    328331            sage: B = random_matrix(K,3,4); B
    329             [          a^3 + 1                 0               a^3                 0]
    330             [          a^3 + a                 a     a^3 + a^2 + a           a^3 + a]
    331             [      a^3 + a + 1               a^2 a^3 + a^2 + a + 1           a^2 + 1]
     332            [          a^2 + a           a^2 + 1           a^2 + a     a^3 + a^2 + a]
     333            [          a^2 + 1 a^3 + a^2 + a + 1           a^2 + 1               a^2]
     334            [    a^3 + a^2 + a           a^2 + 1       a^2 + a + 1       a^3 + a + 1]
    332335
    333336            sage: C = A + B; C # indirect doctest
    334             [    a^3 + a^2 a^3 + a^2 + a         a + 1         a + 1]
    335             [      a^3 + 1             1           a^2       a^2 + a]
    336             [      a^2 + 1       a^2 + a a^3 + a^2 + a a^3 + a^2 + a]
     337            [            a a^3 + a^2 + a       a^3 + 1 a^3 + a^2 + 1]
     338            [a^3 + a^2 + 1 a^3 + a^2 + a a^3 + a^2 + a       a^3 + 1]
     339            [a^3 + a^2 + 1     a^3 + a^2     a^3 + a^2           a^2]
    337340        """
    338341        cdef Matrix_mod2e_dense A
    339342        A = Matrix_mod2e_dense.__new__(Matrix_mod2e_dense, self._parent, 0, 0, 0, alloc=False)
     
    352355            sage: m,n  = 3, 4
    353356            sage: MS = MatrixSpace(K,m,n)
    354357            sage: A = random_matrix(K,3,4); A
    355             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    356             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    357             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     358            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     359            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     360            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    358361
    359362            sage: B = random_matrix(K,3,4); B
    360             [          a^3 + 1                 0               a^3                 0]
    361             [          a^3 + a                 a     a^3 + a^2 + a           a^3 + a]
    362             [      a^3 + a + 1               a^2 a^3 + a^2 + a + 1           a^2 + 1]
     363            [          a^2 + a           a^2 + 1           a^2 + a     a^3 + a^2 + a]
     364            [          a^2 + 1 a^3 + a^2 + a + 1           a^2 + 1               a^2]
     365            [    a^3 + a^2 + a           a^2 + 1       a^2 + a + 1       a^3 + a + 1]
    363366
    364367            sage: C = A - B; C  # indirect doctest
    365             [    a^3 + a^2 a^3 + a^2 + a         a + 1         a + 1]
    366             [      a^3 + 1             1           a^2       a^2 + a]
    367             [      a^2 + 1       a^2 + a a^3 + a^2 + a a^3 + a^2 + a]
     368            [            a a^3 + a^2 + a       a^3 + 1 a^3 + a^2 + 1]
     369            [a^3 + a^2 + 1 a^3 + a^2 + a a^3 + a^2 + a       a^3 + 1]
     370            [a^3 + a^2 + 1     a^3 + a^2     a^3 + a^2           a^2]
    368371        """
    369372        return self._add_(right)
    370373
     
    548551            sage: A._multiply_karatsuba(B) == A._multiply_classical(B)
    549552            True
    550553
    551         TESTS::
    552 
    553554            sage: K.<a> = GF(2^10)
    554555            sage: A = random_matrix(K, 50, 50)
    555556            sage: B = random_matrix(K, 50, 50)
    556557            sage: A._multiply_karatsuba(B) == A._multiply_classical(B)
    557             Traceback (most recent call last):
    558             ...
    559             NotImplementedError: Karatsuba multiplication is only implemented for matrices over GF(2^e) with e <= 8.
     558            True
    560559        """
    561560        if self._ncols != right._nrows:
    562561            raise ArithmeticError("left ncols must match right nrows")
    563562
    564         if self._entries.finite_field.degree > __M4RIE_MAX_KARATSUBA_DEGREE:
    565             raise NotImplementedError("Karatsuba multiplication is only implemented for matrices over GF(2^e) with e <= %d."%__M4RIE_MAX_KARATSUBA_DEGREE)
    566 
    567563        cdef Matrix_mod2e_dense ans
    568564       
    569565        ans = self.new_matrix(nrows = self.nrows(), ncols = right.ncols())
     
    642638             sage: K.<a> = GF(4)
    643639             sage: A = random_matrix(K,10,10)
    644640             sage: A
    645              [    0     1     1     0     0     0     a a + 1     1     a]
    646              [    1     1 a + 1     a a + 1     0     1     1     1 a + 1]
    647              [    1     0     a     1     1 a + 1     a     1 a + 1 a + 1]
    648              [    0     a     a     a     0     1     1     1     0     1]
    649              [    1     1     a     a     a a + 1 a + 1 a + 1     1     0]
    650              [a + 1 a + 1     a     a     0 a + 1     0     a     1     1]
    651              [a + 1 a + 1     0 a + 1     0 a + 1 a + 1     a     a     a]
    652              [    0     1     a     0     1     a a + 1 a + 1     a a + 1]
    653              [    0     1     a     1     1 a + 1     1 a + 1     a     a]
    654              [a + 1     a     0     a     a     a     0     a     0 a + 1]
     641             [    0 a + 1 a + 1 a + 1     0     1 a + 1     1 a + 1     1]
     642             [a + 1 a + 1     a     1     a     a     1 a + 1     1     0]
     643             [    a     1 a + 1 a + 1     0 a + 1     a     1     a     a]
     644             [a + 1     a     0     0     1 a + 1 a + 1     0 a + 1     1]
     645             [    a     0 a + 1     a     a     0 a + 1     a     1 a + 1]
     646             [    a     0     a a + 1     a     1 a + 1     a     a     a]
     647             [a + 1     a     0     1     0 a + 1 a + 1     a     0 a + 1]
     648             [a + 1 a + 1     0 a + 1     a     1 a + 1 a + 1 a + 1     0]
     649             [    0     0     0 a + 1     1 a + 1     0 a + 1     1     0]
     650             [    1 a + 1     0     1     a     0     0     a a + 1     a]
    655651             
    656652             sage: a*A # indirect doctest
    657              [    0     a     a     0     0     0 a + 1     1     a a + 1]
    658              [    a     a     1 a + 1     1     0     a     a     a     1]
    659              [    a     0 a + 1     a     a     1 a + 1     a     1    1]
    660              [    0 a + 1 a + 1 a + 1     0     a     a     a     0     a]
    661              [    a     a a + 1 a + 1 a + 1     1     1     1     a     0]
    662              [    1     1 a + 1 a + 1     0     1     0 a + 1     a     a]
    663              [    1     1     0     1     0     1     1 a + 1 a + 1 a + 1]
    664              [    0     a a + 1     0     a a + 1     1     1 a + 1     1]
    665              [    0     a a + 1     a     a     1     a     1 a + 1 a + 1]
    666              [    1 a + 1     0 a + 1 a + 1 a + 1     0 a + 1     0    1]
     653             [    0     1     1     1     0     a     1     a     1     a]
     654             [    1     1 a + 1     a a + 1 a + 1     a     1     a     0]
     655             [a + 1     a     1     1     0     1 a + 1     a a + 1 a + 1]
     656             [    1 a + 1     0     0     a     1     1     0     1     a]
     657             [a + 1     0     1 a + 1 a + 1     0     1 a + 1     a     1]
     658             [a + 1     0 a + 1     1 a + 1     a     1 a + 1 a + 1 a + 1]
     659             [    1 a + 1     0     a     0     1     1 a + 1     0    1]
     660             [    1     1     0     1 a + 1     a     1     1     1     0]
     661             [    0     0     0     1     a     1     0     1     a     0]
     662             [    a     1     0     a a + 1     0     0 a + 1     1 a + 1]
    667663        """
    668         if not isinstance(right, FiniteField_givaroElement):
    669             raise TypeError("right must be element of type 'FiniteField_givaroElement'")
    670 
     664        cdef m4ri_word a = poly_to_word(right)
    671665        cdef Matrix_mod2e_dense C = Matrix_mod2e_dense.__new__(Matrix_mod2e_dense, self._parent, 0, 0, 0)
    672         cdef m4ri_word a = <m4ri_word>(<M4RIE__FiniteField*>self.cc.objectptr).log2pol((<FiniteField_givaroElement>right).element)
    673666        mzed_mul_scalar(C._entries, a, self._entries)
    674667        return C
    675668
     
    679672       
    680673            sage: K.<a> = GF(2^4)
    681674            sage: A = random_matrix(K, 3, 4); A
    682             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    683             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    684             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     675            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     676            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     677            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    685678
    686679            sage: -A
    687             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    688             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    689             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     680            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     681            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     682            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    690683        """
    691684        return self.__copy__()
    692685
     
    717710            sage: K.<a> = GF(2^4)
    718711            sage: m,n  = 3, 4
    719712            sage: A = random_matrix(K,3,4); A
    720             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    721             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    722             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     713            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     714            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     715            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    723716
    724717            sage: A2 = copy(A); A2
    725             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    726             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    727             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     718            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     719            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     720            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    728721
    729722            sage: A[0,0] = 1
    730723            sage: A2[0,0]
    731             a^2 + 1
     724            a^2
    732725        """
    733726        cdef Matrix_mod2e_dense A
    734727        A = Matrix_mod2e_dense.__new__(Matrix_mod2e_dense, self._parent, 0, 0, 0)
     
    745738            sage: K.<a> = GF(2^4)
    746739            sage: m,n  = 3, 4
    747740            sage: A = random_matrix(K,3,4); A
    748             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1]
    749             [        a + 1         a + 1       a^3 + a     a^3 + a^2]
    750             [a^3 + a^2 + a             a             1   a^3 + a + 1]
     741            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1]
     742            [              a^3                 1       a^3 + a + 1     a^3 + a^2 + 1]
     743            [            a + 1           a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
    751744
    752745            sage: A.list() # indirect doctest
    753             [a^2 + 1, a^3 + a^2 + a, a^3 + a + 1, a + 1, a + 1, a + 1, a^3 + a, a^3 + a^2, a^3 + a^2 + a, a, 1, a^3 + a + 1]
     746            [a^2, a^3 + a + 1, a^3 + a^2 + a + 1, a + 1, a^3, 1, a^3 + a + 1, a^3 + a^2 + 1, a + 1, a^3 + 1, a^3 + a + 1, a^3 + a^2 + a + 1]
    754747        """
    755748        cdef int i,j
    756749        l = []
     
    781774            sage: A = Matrix(K,3,3)
    782775
    783776            sage: A.randomize(); A
    784             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1]
    785             [        a + 1         a + 1         a + 1]
    786             [      a^3 + a     a^3 + a^2 a^3 + a^2 + a]
     777            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1]
     778            [            a + 1               a^3                1]
     779            [      a^3 + a + 1     a^3 + a^2 + 1             a + 1]
    787780
    788781            sage: K.<a> = GF(2^4)
    789782            sage: A = random_matrix(K,1000,1000,density=0.1)
    790783            sage: float(A.density())
    791             0.099739...
     784            0.0999...
    792785
    793786            sage: A = random_matrix(K,1000,1000,density=1.0)
    794787            sage: float(A.density())
     
    796789
    797790            sage: A = random_matrix(K,1000,1000,density=0.5)
    798791            sage: float(A.density())
    799             0.49976...
     792            0.4996...
    800793
    801794        Note, that the matrix is updated and not zero-ed out before
    802795        being randomized::
     
    804797            sage: A = matrix(K,1000,1000)
    805798            sage: A.randomize(nonzero=False, density=0.1)
    806799            sage: float(A.density())
    807             0.0937679...
     800            0.0936...
    808801           
    809802            sage: A.randomize(nonzero=False, density=0.05)
    810803            sage: float(A.density())
    811             0.13626...
     804            0.1358539...
    812805        """
    813806        if self._ncols == 0 or self._nrows == 0:
    814807            return
    815808       
    816809        cdef Py_ssize_t i,j
    817         cdef int seed = current_randstate().c_random()
    818         cdef GivRandom generator = GivRandomSeeded(seed)
    819         cdef int tmp
    820 
    821810        self.check_mutability()
    822811        self.clear_cache()
    823812
     813        cdef m4ri_word mask = (1<<(self._parent.base_ring().degree())) - 1
     814
    824815        cdef randstate rstate = current_randstate()
     816        K = self._parent.base_ring()
    825817
    826818        if self._ncols == 0 or self._nrows == 0:
    827819            return
     
    837829                sig_on()
    838830                for i in range(self._nrows):
    839831                    for j in range(self._ncols):
    840                         tmp = self.cc.objectptr.random(generator, tmp)
    841                         mzed_write_elem_log(self._entries, i, j, tmp, <M4RIE__FiniteField*>self.cc.objectptr)
     832                        tmp = rstate.c_random() & mask
     833                        mzed_write_elem(self._entries, i, j, tmp)
    842834                sig_off()
    843835            else:
    844836                sig_on()
    845837                for i in range(self._nrows):
    846838                    for j in range(self._ncols):
    847                         tmp = self.cc.objectptr.random(generator,tmp)
    848                         while self.cc.objectptr.isZero(tmp):
    849                             tmp = self.cc.objectptr.random(generator,tmp)
    850                         mzed_write_elem_log(self._entries, i, j, tmp, <M4RIE__FiniteField*>self.cc.objectptr)
     839                        tmp = rstate.c_random() & mask
     840                        while tmp == 0:
     841                            tmp = rstate.c_random() & mask
     842                        mzed_write_elem(self._entries, i, j, tmp)
    851843                sig_off()
    852844        else:
    853845            if nonzero == False:
     
    855847                for i in range(self._nrows):
    856848                    for j in range(self._ncols):
    857849                        if rstate.c_rand_double() <= _density:
    858                             tmp = self.cc.objectptr.random(generator, tmp)
    859                             mzed_write_elem_log(self._entries, i, j, tmp, <M4RIE__FiniteField*>self.cc.objectptr)
     850                            tmp = rstate.c_random() & mask
     851                            mzed_write_elem(self._entries, i, j, tmp)
    860852                sig_off()
    861853            else:
    862854                sig_on()
    863855                for i in range(self._nrows):
    864856                    for j in range(self._ncols):
    865857                        if rstate.c_rand_double() <= _density:
    866                             tmp = self.cc.objectptr.random(generator,tmp)
    867                             while self.cc.objectptr.isZero(tmp):
    868                                 tmp = self.cc.objectptr.random(generator,tmp)
    869                             mzed_write_elem_log(self._entries, i, j, tmp, <M4RIE__FiniteField*>self.cc.objectptr)
     858                            tmp = rstate.c_random() & mask
     859                            while tmp == 0:
     860                                tmp = rstate.c_random() & mask
     861                            mzed_write_elem(self._entries, i, j, tmp)
    870862                sig_off()
    871863
    872864    def echelonize(self, algorithm='heuristic', reduced=True, **kwds):
     
    890882            sage: K.<a> = GF(2^4)
    891883            sage: m,n  = 3, 5
    892884            sage: A = random_matrix(K, 3, 5); A
    893             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1         a + 1         a + 1]
    894             [        a + 1       a^3 + a     a^3 + a^2 a^3 + a^2 + a             a]
    895             [            1   a^3 + a + 1     a^3 + a^2 a^3 + a^2 + 1           a^2]
     885            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1             a + 1               a^3]
     886            [                1       a^3 + a + 1     a^3 + a^2 + 1             a + 1           a^3 + 1]
     887            [      a^3 + a + 1 a^3 + a^2 + a + 1           a^2 + a           a^2 + 1           a^2 + a]
    896888
    897889            sage: A.echelonize(); A
    898             [            1             0             0             a             a]
    899             [            0             1             0   a^2 + a + 1             a]
    900             [            0             0             1             a a^3 + a^2 + 1]
     890            [            1             0             0         a + 1       a^2 + 1]
     891            [            0             1             0           a^2         a + 1]
     892            [            0             0             1 a^3 + a^2 + a           a^3]
    901893
    902894            sage: K.<a> = GF(2^3)
    903895            sage: m,n  = 3, 5
     
    905897            sage: A = random_matrix(K, 3, 5)
    906898
    907899            sage: copy(A).echelon_form('newton_john')
    908             [          1           0           0         a^2     a^2 + 1]
    909             [          0           1           0         a^2           1]
    910             [          0           0           1 a^2 + a + 1      a + 1]
     900            [          1           0       a + 1           0     a^2 + 1]
     901            [          0           1 a^2 + a + 1           0           a]
     902            [          0           0           0           1 a^2 + a + 1]
    911903           
    912904            sage: copy(A).echelon_form('naive');
    913             [          1           0           0         a^2     a^2 + 1]
    914             [          0           1           0         a^2           1]
    915             [          0           0           1 a^2 + a + 1      a + 1]
     905            [          1           0       a + 1           0     a^2 + 1]
     906            [          0           1 a^2 + a + 1           0           a]
     907            [          0           0           0           1 a^2 + a + 1]
    916908
    917909            sage: copy(A).echelon_form('builtin');
    918             [          1           0           0         a^2     a^2 + 1]
    919             [          0           1           0         a^2           1]
    920             [          0           0           1 a^2 + a + 1      a + 1]
     910            [          1           0       a + 1           0     a^2 + 1]
     911            [          0           1 a^2 + a + 1           0           a]
     912            [          0           0           0           1 a^2 + a + 1]
    921913        """
    922914        if self._nrows == 0 or self._ncols == 0:
    923915            self.cache('in_echelon_form',True)
     
    996988
    997989            sage: K.<a> = GF(2^3)
    998990            sage: A = random_matrix(K,3,3); A
    999             [      0   a + 1      1]
    1000             [a^2 + a a^2 + a a^2 + a]
    1001             [      a a^2 + 1   a + 1]
     991            [        a^2       a + 1 a^2 + a + 1]
     992            [      a + 1           0           1]
     993            [      a + 1     a^2 + 1       a + 1]
    1002994
    1003995            sage: B = ~A; B
    1004             [        a^2           0     a^2 + 1]
    1005             [a^2 + a + 1         a^2 a^2 + a + 1]
    1006             [      a + 1 a^2 + a + 1           a]
     996            [a^2 + a + 1         a^2         a^2]
     997            [      a + 1 a^2 + a + 1      a + 1]
     998            [          a     a^2 + a a^2 + a + 1]
    1007999           
    10081000            sage: A*B
    10091001            [1 0 0]
     
    10321024
    10331025            sage: K.<a> = GF(2^3)
    10341026            sage: A = random_matrix(K,3,3); A
    1035             [      0   a + 1      1]
    1036             [a^2 + a a^2 + a a^2 + a]
    1037             [      a a^2 + 1   a + 1]
     1027            [        a^2       a + 1 a^2 + a + 1]
     1028            [      a + 1           0           1]
     1029            [      a + 1     a^2 + 1       a + 1]
    10381030
    10391031            sage: A.rescale_row(0, a , 0); A
    1040             [      0 a^2 + a       a]
    1041             [a^2 + a a^2 + a a^2 + a]
    1042             [      a a^2 + 1   a + 1]
     1032            [  a + 1 a^2 + a a^2 + 1]
     1033            [  a + 1       0       1]
     1034            [  a + 1 a^2 + 1   a + 1]
    10431035
    10441036            sage: A.rescale_row(0,0,0); A
    10451037            [      0       0       0]
    1046             [a^2 + a a^2 + a a^2 + a]
    1047             [      a a^2 + 1   a + 1]
     1038            [  a + 1       0       1]
     1039            [  a + 1 a^2 + 1   a + 1]
    10481040        """       
    1049         cdef m4ri_word x = <m4ri_word>(<M4RIE__FiniteField*>self.cc.objectptr).log2pol((<FiniteField_givaroElement>multiple).element)
    1050         cdef m4ri_word *X = self._entries.finite_field.mul[x]
    1051         mzed_rescale_row(self._entries, row, start_col, X)
     1041        cdef m4ri_word x = poly_to_word(multiple)
     1042        mzed_rescale_row(self._entries, row, start_col, x)
    10521043
    10531044
    10541045    cdef add_multiple_of_row_c(self,  Py_ssize_t row_to, Py_ssize_t row_from, multiple, Py_ssize_t start_col):
     
    10661057
    10671058            sage: K.<a> = GF(2^3)
    10681059            sage: A = random_matrix(K,3,3); A
    1069             [      0   a + 1      1]
    1070             [a^2 + a a^2 + a a^2 + a]
    1071             [      a a^2 + 1   a + 1]
     1060            [        a^2       a + 1 a^2 + a + 1]
     1061            [      a + 1           0           1]
     1062            [      a + 1     a^2 + 1       a + 1]
    10721063
    10731064            sage: A.add_multiple_of_row(0,1,a,0); A
    1074             [a^2 + a + 1         a^2     a^2 + a]
    1075             [    a^2 + a     a^2 + a     a^2 + a]
    1076             [          a     a^2 + 1       a + 1]
     1065            [      a   a + 1 a^2 + 1]
     1066            [  a + 1       0       1]
     1067            [  a + 1 a^2 + 1   a + 1]
    10771068        """
    10781069       
    1079         cdef m4ri_word x = <m4ri_word>(<M4RIE__FiniteField*>self.cc.objectptr).log2pol((<FiniteField_givaroElement>multiple).element)
    1080         cdef m4ri_word *X = self._entries.finite_field.mul[x]
    1081         mzed_add_multiple_of_row(self._entries, row_to, self._entries, row_from, X, start_col)
     1070        cdef m4ri_word x = poly_to_word(multiple)
     1071        mzed_add_multiple_of_row(self._entries, row_to, self._entries, row_from, x, start_col)
    10821072
    10831073
    10841074    cdef swap_rows_c(self, Py_ssize_t row1, Py_ssize_t row2):
     
    10951085            sage: K.<a> = GF(2^3)
    10961086            sage: A = random_matrix(K,3,3)
    10971087            sage: A
    1098             [      0   a + 1      1]
    1099             [a^2 + a a^2 + a a^2 + a]
    1100             [      a a^2 + 1   a + 1]
     1088            [        a^2       a + 1 a^2 + a + 1]
     1089            [      a + 1           0           1]
     1090            [      a + 1     a^2 + 1       a + 1]
    11011091
    11021092            sage: A.swap_rows(0,1); A
    1103             [a^2 + a a^2 + a a^2 + a]
    1104             [      0   a + 1      1]
    1105             [      a a^2 + 1   a + 1]
     1093            [      a + 1           0           1]
     1094            [        a^2       a + 1 a^2 + a + 1]
     1095            [      a + 1     a^2 + 1       a + 1]
    11061096
    11071097        """
    11081098        mzed_row_swap(self._entries, row1, row2)
     
    11211111            sage: K.<a> = GF(2^3)
    11221112            sage: A = random_matrix(K,3,3)
    11231113            sage: A
    1124             [      0   a + 1      1]
    1125             [a^2 + a a^2 + a a^2 + a]
    1126             [      a a^2 + 1   a + 1]
     1114            [        a^2       a + 1 a^2 + a + 1]
     1115            [      a + 1           0           1]
     1116            [      a + 1     a^2 + 1       a + 1]
    11271117
    11281118            sage: A.swap_columns(0,1); A
    1129             [  a + 1       0      1]
    1130             [a^2 + a a^2 + a a^2 + a]
    1131             [a^2 + 1       a   a + 1]
     1119            [      a + 1         a^2 a^2 + a + 1]
     1120            [          0       a + 1           1]
     1121            [    a^2 + 1       a + 1       a + 1]
    11321122
    11331123            sage: A = random_matrix(K,4,16)
    11341124
     
    11611151            sage: MS = MatrixSpace(K,3,3)
    11621152            sage: A = random_matrix(K,3,3)
    11631153            sage: B = A.augment(MS(1)); B
    1164             [      a^2 + 1 a^3 + a^2 + a   a^3 + a + 1             1             0             0]
    1165             [        a + 1         a + 1         a + 1             0             1             0]
    1166             [      a^3 + a     a^3 + a^2 a^3 + a^2 + a             0             0             1]
     1154            [              a^2       a^3 + a + 1 a^3 + a^2 + a + 1                 1                 0                 0]
     1155            [            a + 1               a^3                 1                 0                 1                 0]
     1156            [      a^3 + a + 1     a^3 + a^2 + 1             a + 1                 0                 0                 1]
    11671157
    11681158            sage: B.echelonize(); B
    1169             [            1             0             0 a^3 + a^2 + 1 a^3 + a^2 + 1       a^2 + a]
    1170             [            0             1             0       a^3 + 1       a^2 + 1       a^2 + 1]
    1171             [            0             0             1           a^2       a^2 + a         a + 1]
     1159            [                1                 0                 0           a^2 + a           a^3 + 1           a^3 + a]
     1160            [                0                 1                 0     a^3 + a^2 + a a^3 + a^2 + a + 1           a^2 + a]
     1161            [                0                 0                 1             a + 1               a^3               a^3]
    11721162
    11731163            sage: C = B.matrix_from_columns([3,4,5]); C
    1174             [a^3 + a^2 + 1 a^3 + a^2 + 1       a^2 + a]
    1175             [      a^3 + 1       a^2 + 1       a^2 + 1]
    1176             [          a^2       a^2 + a         a + 1]
     1164            [          a^2 + a           a^3 + 1           a^3 + a]
     1165            [    a^3 + a^2 + a a^3 + a^2 + a + 1           a^2 + a]
     1166            [            a + 1               a^3               a^3]
    11771167
    11781168            sage: C == ~A
    11791169            True
     
    11871177            sage: A = random_matrix(K,2,3)
    11881178            sage: B = random_matrix(K,2,0)
    11891179            sage: A.augment(B)
    1190             [a^3 + 1       0     a^3]
    1191             [      0 a^3 + a      a]
     1180            [          a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
     1181            [          a^2 + a           a^2 + 1           a^2 + a]
    11921182
    11931183            sage: B.augment(A)
    1194             [a^3 + 1       0     a^3]
    1195             [      0 a^3 + a      a]
     1184            [          a^3 + 1       a^3 + a + 1 a^3 + a^2 + a + 1]
     1185            [          a^2 + a           a^2 + 1           a^2 + a]
    11961186
    11971187            sage: M = Matrix(K, 0, 0, 0)
    11981188            sage: N = Matrix(K, 0, 19, 0)
     
    12331223
    12341224            sage: K.<a> = GF(2^4)
    12351225            sage: A = random_matrix(K,2,2); A
    1236             [      a^2 + 1 a^3 + a^2 + a]
    1237             [  a^3 + a + 1         a + 1]
     1226            [              a^2       a^3 + a + 1]
     1227            [a^3 + a^2 + a + 1             a + 1]
    12381228           
    12391229            sage: B = random_matrix(K,2,2); B
    1240             [a^3 + 1       0]
    1241             [    a^3       0]
     1230            [          a^3             1]
     1231            [  a^3 + a + 1 a^3 + a^2 + 1]
    12421232
    12431233            sage: A.stack(B)
    1244             [      a^2 + 1 a^3 + a^2 + a]
    1245             [  a^3 + a + 1         a + 1]
    1246             [      a^3 + 1             0]
    1247             [          a^3             0]
     1234            [              a^2       a^3 + a + 1]
     1235            [a^3 + a^2 + a + 1             a + 1]
     1236            [              a^3                 1]
     1237            [      a^3 + a + 1     a^3 + a^2 + 1]
    12481238
    12491239            sage: B.stack(A)
    1250             [      a^3 + 1             0]
    1251             [          a^3             0]
    1252             [      a^2 + 1 a^3 + a^2 + a]
    1253             [  a^3 + a + 1         a + 1]
     1240            [              a^3                 1]
     1241            [      a^3 + a + 1     a^3 + a^2 + 1]
     1242            [              a^2       a^3 + a + 1]
     1243            [a^3 + a^2 + a + 1             a + 1]
    12541244
    12551245        TESTS::
    12561246
    12571247            sage: A = random_matrix(K,0,3)
    12581248            sage: B = random_matrix(K,3,3)
    12591249            sage: A.stack(B)
    1260             [                0     a^3 + a^2 + a     a^3 + a^2 + a]
    1261             [    a^3 + a^2 + a         a^3 + a^2       a^3 + a + 1]
    1262             [a^3 + a^2 + a + 1               a^3               a^2]
     1250            [            a + 1           a^3 + 1       a^3 + a + 1]
     1251            [a^3 + a^2 + a + 1           a^2 + a           a^2 + 1]
     1252            [          a^2 + a     a^3 + a^2 + a           a^2 + 1]
    12631253
    12641254            sage: B.stack(A)
    1265             [                0     a^3 + a^2 + a     a^3 + a^2 + a]
    1266             [    a^3 + a^2 + a         a^3 + a^2       a^3 + a + 1]
    1267             [a^3 + a^2 + a + 1               a^3               a^2]
     1255            [            a + 1           a^3 + 1       a^3 + a + 1]
     1256            [a^3 + a^2 + a + 1           a^2 + a           a^2 + 1]
     1257            [          a^2 + a     a^3 + a^2 + a           a^2 + 1]
    12681258
    12691259            sage: M = Matrix(K, 0, 0, 0)
    12701260            sage: N = Matrix(K, 19, 0, 0)
     
    14191409       
    14201410            sage: K.<a> = GF(2^2)
    14211411            sage: A = random_matrix(K, 5, 5); A
    1422             [    0     1     1     0     0]
    1423             [    0     a a + 1     1     a]
    1424             [    1     1 a + 1     a a + 1]
    1425             [    0     1     1     1 a + 1]
    1426             [    1     0     a     1     1]
     1412            [    0 a + 1 a + 1 a + 1     0]
     1413            [    1 a + 1     1 a + 1     1]
     1414            [a + 1 a + 1     a     1     a]
     1415            [    a     1 a + 1     1     0]
     1416            [    a     1 a + 1 a + 1     0]
    14271417
    14281418            sage: A1,A0 = A.slice()
    14291419            sage: A0
    1430             [0 0 0 0 0]
    1431             [0 1 1 0 1]
    1432             [0 0 1 1 1]
    1433             [0 0 0 0 1]
    1434             [0 0 1 0 0]
     1420            [0 1 1 1 0]
     1421            [0 1 0 1 0]
     1422            [1 1 1 0 1]
     1423            [1 0 1 0 0]
     1424            [1 0 1 1 0]
    14351425
    14361426            sage: A1
    1437             [0 1 1 0 0]
    1438             [0 0 1 1 0]
    1439             [1 1 1 0 1]
    1440             [0 1 1 1 1]
    1441             [1 0 0 1 1]
     1427            [0 1 1 1 0]
     1428            [1 1 1 1 1]
     1429            [1 1 0 1 0]
     1430            [0 1 1 1 0]
     1431            [0 1 1 1 0]
    14421432
    14431433            sage: A0[2,4]*a + A1[2,4], A[2,4]
    1444             (a + 1, a + 1)
     1434            (a, a)
    14451435
    14461436            sage: K.<a> = GF(2^3)
    14471437            sage: A = random_matrix(K, 5, 5); A
    1448             [    a^2 + 1           0       a + 1           0          a]
    1449             [          a       a + 1           a           1         a^2]
    1450             [    a^2 + a           0           0     a^2 + 1       a + 1]
    1451             [    a^2 + 1           0     a^2 + 1       a + 1           1]
    1452             [a^2 + a + 1           1 a^2 + a + 1           0     a^2 + 1]
     1438            [      a + 1     a^2 + a           1           a     a^2 + a]
     1439            [      a + 1     a^2 + a         a^2         a^2     a^2 + 1]
     1440            [a^2 + a + 1 a^2 + a + 1           0 a^2 + a + 1     a^2 + 1]
     1441            [    a^2 + a           0 a^2 + a + 1           a           a]
     1442            [        a^2       a + 1           a     a^2 + 1 a^2 + a + 1]
    14531443
    14541444            sage: A0,A1,A2 = A.slice()
    14551445            sage: A0
    14561446            [1 0 1 0 0]
    1457             [0 1 0 1 0]
    1458             [0 0 0 1 1]
    1459             [1 0 1 1 1]
    1460             [1 1 1 0 1]
     1447            [1 0 0 0 1]
     1448            [1 1 0 1 1]
     1449            [0 0 1 0 0]
     1450            [0 1 0 1 1]
    14611451
    14621452        Slicing and clinging are inverse operations::
    14631453
  • sage/matrix/matrix_space.py

    diff --git a/sage/matrix/matrix_space.py b/sage/matrix/matrix_space.py
    a b  
    962962                # elif R.order() < matrix_modn_dense.MAX_MODULUS:
    963963                #     return matrix_modn_dense.Matrix_modn_dense
    964964                return matrix_generic_dense.Matrix_generic_dense
    965             elif sage.rings.finite_rings.all.is_FiniteField(R) and R.characteristic() == 2 and R.order() <= 1024:
     965            elif sage.rings.finite_rings.all.is_FiniteField(R) and R.characteristic() == 2 and R.order() <= 65536:
    966966                return matrix_mod2e_dense.Matrix_mod2e_dense
    967967            elif sage.rings.polynomial.multi_polynomial_ring_generic.is_MPolynomialRing(R) and R.base_ring() in _Fields:
    968968                return matrix_mpolynomial_dense.Matrix_mpolynomial_dense
  • sage/rings/polynomial/multi_polynomial_sequence.py

    diff --git a/sage/rings/polynomial/multi_polynomial_sequence.py b/sage/rings/polynomial/multi_polynomial_sequence.py
    a b  
    130130    sage: A.rank()
    131131    4056
    132132    sage: A[4055]*v
    133     (k001*k002 + k001*k003)
     133    (k001*k003)
    134134
    135135TEST::
    136136
     
    447447            sage: P = F.ring()
    448448            sage: I = F.ideal()
    449449            sage: I.elimination_ideal(P('s000*s001*s002*s003*w100*w101*w102*w103*x100*x101*x102*x103'))
    450             Ideal (k002 + (a^3 + a^2 + 1)*k003 + (a^3),
    451                    k001 + (a^3 + a^2 + a + 1)*k003 + (a^3 + a^2 + a),
    452                    k000 + (a + 1)*k003 + (a^2 + a + 1),
    453                    k103 + (a^3 + a)*k003 + (a^3 + a),
    454                    k102 + (a^2 + a + 1)*k003 + (a^3 + a^2 + a),
    455                    k101 + (a^3)*k003 + (a^3),
    456                    k100 + (a^3 + a + 1)*k003 + (a^2 + 1),
    457                    k003^2 + (a + 1)*k003 + (a^2 + a + 1))
    458             of Multivariate Polynomial Ring in
    459             k100, k101, k102, k103, x100, x101, x102, x103, w100, w101, w102, w103,
    460             s000, s001, s002, s003, k000, k001, k002, k003 over Finite Field in a of size 2^4
     450            Ideal (k002 + (a^3 + a + 1)*k003 + (a^2 + 1),
     451                   k001 + (a^3)*k003, k000 + (a)*k003 + (a^2),
     452                   k103 + k003 + (a^2 + a + 1),
     453                   k102 + (a^3 + a + 1)*k003 + (a + 1),
     454                   k101 + (a^3)*k003 + (a^2 + a + 1),
     455                   k100 + (a)*k003 + (a),
     456                   k003^2 + (a)*k003 + (a^2))
     457            of Multivariate Polynomial Ring in k100, k101, k102, k103, x100, x101, x102, x103,
     458            w100, w101, w102, w103, s000, s001, s002, s003, k000, k001, k002, k003 over Finite Field in a of size 2^4
    461459        """
    462460        return self._ring.ideal(tuple(self))
    463461
  • sage/rings/polynomial/pbori.pyx

    diff --git a/sage/rings/polynomial/pbori.pyx b/sage/rings/polynomial/pbori.pyx
    a b  
    50405040            sage: F,s = sr.polynomial_system()
    50415041            sage: I = F.ideal()
    50425042            sage: I.groebner_basis()
    5043             Polynomial Sequence with 35 Polynomials in 36 Variables
     5043            Polynomial Sequence with 36 Polynomials in 36 Variables
    50445044
    50455045        TESTS:
    50465046
     
    52315231            sage: F,s = sr.polynomial_system()
    52325232            sage: I = F.ideal()
    52335233            sage: I.interreduced_basis()
    5234             [k100 + k003,
    5235             k101 + k003,
    5236             k102 + k003 + 1,
    5237             k103, x100 + k003,
    5238             x101, x102 + 1,
    5239             x103, w100 + 1,
    5240             w101 + k003, w102,
    5241             w103 + k003 + 1,
    5242             s000 + k003 + 1,
    5243             s001, s002 + 1,
    5244             s003,
    5245             k000 + 1,
    5246             k001 + k003 + 1,
    5247             k002]
     5234            [k100 + 1, k101 + k001 + 1, k102, k103 + 1, x100 + k001 + 1, x101 + k001, x102, x103 + k001, w100 + 1, w101 + k001 + 1, w102 + 1, w103 + 1, s000 + k001, s001 + k001 + 1, s002, s003 + k001 + 1, k000 + 1, k002 + 1, k003 + 1]
    52485235        """
    52495236        R = self.ring()
    52505237