@@ -12,15 +12,16 @@ from cpython.sequence cimport *
12
12
from cysignals.signals cimport sig_str, sig_off
13
13
14
14
from sage.structure.sage_object cimport SageObject
15
+ from sage.structure.element cimport Element, Matrix
15
16
from sage.libs.flint.nmod_mat cimport *
16
17
17
18
from .args cimport SparseEntry, MatrixArgs_init
18
19
19
20
import sage.matrix.matrix_space as matrix_space
20
-
21
+ from sage.rings.finite_rings.integer_mod cimport IntegerMod_int, IntegerMod_int64
21
22
22
23
cdef class Matrix_nmod_dense(Matrix_dense):
23
- def __cinit__ (self , parent , entries = None , bint coerce = True ):
24
+ def __cinit__ (self , parent , * args , ** kwds ):
24
25
self ._modulus = parent._base._pyx_order
25
26
sig_str(" FLINT exception" )
26
27
nmod_mat_init(self ._matrix, self ._nrows, self ._ncols, self ._modulus.int64)
@@ -42,7 +43,10 @@ cdef class Matrix_nmod_dense(Matrix_dense):
42
43
nmod_mat_print_pretty(self ._matrix)
43
44
44
45
cdef set_unsafe(self , Py_ssize_t i, Py_ssize_t j, object x):
45
- self .set_unsafe_si(i, j, x.ivalue)
46
+ if self ._modulus.element_class() is IntegerMod_int:
47
+ self .set_unsafe_si(i, j, (< IntegerMod_int> x).ivalue)
48
+ else :
49
+ self .set_unsafe_si(i, j, (< IntegerMod_int64> x).ivalue)
46
50
47
51
cdef void set_unsafe_si(self , Py_ssize_t i, Py_ssize_t j, long value):
48
52
nmod_mat_set_entry(self ._matrix, i, j, value)
@@ -68,9 +72,37 @@ cdef class Matrix_nmod_dense(Matrix_dense):
68
72
P = self ._parent
69
73
else :
70
74
P = matrix_space.MatrixSpace(self ._parent._base, nrows, ncols, sparse = False )
71
- cdef Matrix_nmod_dense ans = Matrix_nmod_dense.__new__ (Matrix_nmod_dense, P, None , None , None )
75
+ cdef Matrix_nmod_dense ans = Matrix_nmod_dense.__new__ (Matrix_nmod_dense, P)
72
76
return ans
73
77
78
+ cpdef _add_(self , _right):
79
+ cdef Matrix_nmod_dense right = _right
80
+ cdef Matrix_nmod_dense M = self ._new(self ._nrows, self ._ncols)
81
+ nmod_mat_add(M._matrix, self ._matrix, right._matrix)
82
+ return M
83
+
84
+ cpdef _sub_(self , _right):
85
+ cdef Matrix_nmod_dense right = _right
86
+ cdef Matrix_nmod_dense M = self ._new(self ._nrows, self ._ncols)
87
+ nmod_mat_sub(M._matrix, self ._matrix, right._matrix)
88
+ return M
89
+
90
+ cdef Matrix _matrix_times_matrix_(left, Matrix _right):
91
+ if left._ncols != _right._nrows:
92
+ raise IndexError (" Number of columns of self must equal number of rows of right." )
93
+ cdef Matrix_nmod_dense right = _right
94
+ cdef Matrix_nmod_dense M = left._new(left._nrows, right._ncols)
95
+ nmod_mat_mul(M._matrix, left._matrix, right._matrix)
96
+ return M
97
+
98
+ cpdef _lmul_(self , Element right):
99
+ cdef Matrix_nmod_dense M = self ._new(self ._nrows, self ._ncols)
100
+ print (" Hello" )
101
+ if self ._modulus.element_class() is IntegerMod_int:
102
+ nmod_mat_scalar_mul(M._matrix, self ._matrix, (< IntegerMod_int?> right).ivalue)
103
+ else :
104
+ nmod_mat_scalar_mul(M._matrix, self ._matrix, (< IntegerMod_int64?> right).ivalue)
105
+ return M
74
106
75
107
def strong_echelon_form (self ):
76
108
if self ._nrows >= self ._ncols:
0 commit comments