@@ -441,15 +441,18 @@ cpdef __matrix_from_rows_of_matrices(X):
441
441
442
442
443
443
cdef class Matrix_modn_dense_template(Matrix_dense):
444
- def __cinit__ (self ):
444
+ def __cinit__ (self , * args , bint zeroed_alloc = True , ** kwds ):
445
445
cdef long p = self ._base_ring.characteristic()
446
446
self .p = p
447
447
if p >= MAX_MODULUS:
448
448
raise OverflowError (" p (=%s ) must be < %s ." % (p, MAX_MODULUS))
449
449
450
- self ._entries = < celement * > check_allocarray(self ._nrows * self ._ncols, sizeof(celement))
450
+ if zeroed_alloc:
451
+ self ._entries = < celement * > check_calloc(self ._nrows * self ._ncols, sizeof(celement))
452
+ else :
453
+ self ._entries = < celement * > check_allocarray(self ._nrows * self ._ncols, sizeof(celement))
454
+
451
455
self ._matrix = < celement ** > check_allocarray(self ._nrows, sizeof(celement* ))
452
-
453
456
cdef unsigned int k
454
457
cdef Py_ssize_t i
455
458
k = 0
@@ -518,27 +521,28 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
518
521
"""
519
522
ma = MatrixArgs_init(parent, entries)
520
523
cdef long i, j
521
- it = ma.iter(False )
524
+ it = ma.iter(convert = False , sparse = True )
522
525
R = ma.base
523
526
p = R.characteristic()
524
- for i in range (ma.nrows):
525
- v = self ._matrix[i]
526
- for j in range (ma.ncols):
527
- x = next(it)
528
- if type (x) is int :
529
- tmp = (< long > x) % p
530
- v[j] = tmp + (tmp< 0 )* p
531
- elif type (x) is IntegerMod_int and (< IntegerMod_int> x)._parent is R:
532
- v[j] = < celement> (< IntegerMod_int> x).ivalue
533
- elif type (x) is Integer:
534
- if coerce :
535
- v[j] = mpz_fdiv_ui((< Integer> x).value, p)
536
- else :
537
- v[j] = mpz_get_ui((< Integer> x).value)
538
- elif coerce :
539
- v[j] = R(x)
527
+
528
+ for t in it:
529
+ se = < SparseEntry> t
530
+ x = se.entry
531
+ v = self ._matrix[se.i]
532
+ if type (x) is int :
533
+ tmp = (< long > x) % p
534
+ v[se.j] = tmp + (tmp< 0 )* p
535
+ elif type (x) is IntegerMod_int and (< IntegerMod_int> x)._parent is R:
536
+ v[se.j] = < celement> (< IntegerMod_int> x).ivalue
537
+ elif type (x) is Integer:
538
+ if coerce :
539
+ v[se.j] = mpz_fdiv_ui((< Integer> x).value, p)
540
540
else :
541
- v[j] = < celement> x
541
+ v[se.j] = mpz_get_ui((< Integer> x).value)
542
+ elif coerce :
543
+ v[se.j] = R(x)
544
+ else :
545
+ v[se.j] = < celement> x
542
546
543
547
cdef long _hash_(self ) except - 1 :
544
548
"""
@@ -786,7 +790,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
786
790
cdef Matrix_modn_dense_template M
787
791
cdef celement p = self .p
788
792
789
- M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None )
793
+ M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None , zeroed_alloc = False )
790
794
791
795
sig_on()
792
796
for i in range (self ._nrows* self ._ncols):
@@ -825,7 +829,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
825
829
cdef celement p = self .p
826
830
cdef celement a = left
827
831
828
- M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None )
832
+ M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None , zeroed_alloc = False )
829
833
830
834
sig_on()
831
835
for i in range (self ._nrows* self ._ncols):
@@ -844,7 +848,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
844
848
False
845
849
"""
846
850
cdef Matrix_modn_dense_template A
847
- A = self .__class__ .__new__ (self .__class__, self ._parent, 0 , 0 , 0 )
851
+ A = self .__class__ .__new__ (self .__class__,self ._parent,None , None , None , zeroed_alloc = False )
848
852
memcpy(A._entries, self ._entries, sizeof(celement)* self ._nrows* self ._ncols)
849
853
if self ._subdivisions is not None :
850
854
A.subdivide(* self .subdivisions())
@@ -883,7 +887,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
883
887
cdef celement k, p
884
888
cdef Matrix_modn_dense_template M
885
889
886
- M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None )
890
+ M = self .__class__ .__new__ (self .__class__, self ._parent,None ,None ,None , zeroed_alloc = False )
887
891
p = self .p
888
892
cdef celement* other_ent = (< Matrix_modn_dense_template> right)._entries
889
893
@@ -920,7 +924,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
920
924
cdef celement k, p
921
925
cdef Matrix_modn_dense_template M
922
926
923
- M = self .__class__ .__new__ (self .__class__, self ._parent, None , None , None )
927
+ M = self .__class__ .__new__ (self .__class__, self ._parent, None , None , None , zeroed_alloc = False )
924
928
p = self .p
925
929
cdef celement* other_ent = (< Matrix_modn_dense_template> right)._entries
926
930
0 commit comments