Changes in [2847:5077101063da:2642:300aa7dcd3bd]
- Files:
-
- 3 deleted
- 8 edited
-
sage/ext/multi_modular.h (deleted)
-
sage/ext/multi_modular.pxd (deleted)
-
sage/ext/multi_modular.pyx (deleted)
-
sage/matrix/matrix_integer_dense.pxd (modified) (2 diffs)
-
sage/matrix/matrix_integer_dense.pyx (modified) (4 diffs)
-
sage/matrix/matrix_modn_dense.pxd (modified) (1 diff)
-
sage/matrix/matrix_modn_dense.pyx (modified) (16 diffs)
-
sage/matrix/matrix_rational_dense.pyx (modified) (1 diff)
-
sage/matrix/matrix_window_modn_dense.pxd (modified) (1 diff)
-
sage/matrix/matrix_window_modn_dense.pyx (modified) (3 diffs)
-
setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
sage/matrix/matrix_integer_dense.pxd
r2653 r1769 1 1 include "../ext/cdefs.pxi" 2 3 cdef extern from "../ext/multi_modular.h":4 ctypedef unsigned long mod_int5 2 6 3 cimport matrix_dense … … 12 9 cdef object _pivots 13 10 cdef int mpz_height(self, mpz_t height) except -1 14 cdef _mod_int_c(self, mod_int modulus)15 11 16 12 cdef void _zero_out_matrix(self) -
sage/matrix/matrix_integer_dense.pyx
r2654 r2629 20 20 ctypedef unsigned int uint 21 21 22 from sage.ext.multi_modular cimport MultiModularBasis23 cdef MultiModularBasis mm24 mm = MultiModularBasis()25 26 22 from sage.rings.integer cimport Integer 27 23 from sage.rings.rational_field import QQ 28 24 from sage.rings.integer_ring import ZZ 29 from sage.rings.integer_mod_ring import IntegerModRing30 25 from sage.rings.polynomial_ring import PolynomialRing 31 26 from sage.structure.element cimport ModuleElement … … 40 35 import matrix_space 41 36 37 # for multi-modular methods 38 # TODO: make this a const, adjust for machine word size, put somewhere more reasonable 39 start_prime = 32771 42 40 43 41 cdef class Matrix_integer_dense(matrix_dense.Matrix_dense): # dense or sparse … … 607 605 608 606 def _multiply_multi_modular(left, Matrix_integer_dense right): 609 610 cdef Integer h611 cdef mod_int *moduli612 cdef int i, n613 614 607 h = left.height() * right.height() 615 n = mm.moduli_list_c(&moduli, h.value) 616 res = [] 617 for i from 0 <= i < n: 618 res.append(left._mod_int_c(moduli[i]) * right._mod_int_c(moduli[i])) 619 sage_free(moduli) 620 return left._lift_crt(res) 608 product = start_prime 609 # moduli = [ start_prime ] 610 residues = [ left._mod_int(start_prime) * right._mod_int(start_prime) ] 611 cur_prime = start_prime 612 while product < height: 613 cur_prime = next_prime(cur_prime) 614 product *= cur_prime 615 # moduli.append(cur_prime) 616 res.append(left._mod_int(cur_prime) * right_res._mod_int(cur_prime)) 617 return left._lift_crt(residues) 621 618 622 619 def _mod_int(self, modulus): 623 return self._mod_int_c(modulus) 624 625 cdef _mod_int_c(self, mod_int p): 620 cdef int p 626 621 cdef Py_ssize_t i, j 622 p = modulus 627 623 cdef Matrix_modn_dense res 628 624 cdef mpz_t* self_row 629 cdef mod_int* res_row630 res = Matrix_modn_dense.__new__( Matrix_modn_dense, matrix_space.MatrixSpace(IntegerModRing(p), self._nrows, self._ncols, sparse=False), None, None, None)625 cdef uint* res_row 626 res = Matrix_modn_dense.__new__(matrix_space.MatrixSpace(ZZ, self._nrows, self._ncols, sparse=False), None, None, None) 631 627 for i from 0 <= i < self._nrows: 632 628 self_row = self._matrix[i] … … 636 632 return res 637 633 638 def _lift_crt(self, residues): 639 640 cdef size_t n, i, j, k 641 cdef Py_ssize_t nr, nc 642 643 n = len(residues) 644 nr = residues[0].nrows() 645 nc = residues[0].ncols() 646 647 for b in residues: 648 if not PY_TYPE_CHECK(b, Matrix_modn_dense): 649 raise TypeError, "Can only perform CRT on list of type Matrix_modn_dense." 650 cdef PyObject** res 651 res = FAST_SEQ_UNSAFE(residues) 652 653 cdef mod_int **row_list 654 row_list = <mod_int**>sage_malloc(sizeof(mod_int*) * n) 655 if row_list == NULL: 656 raise MemoryError, "out of memory allocating multi-modular coefficent list" 657 658 cdef Matrix_integer_dense M 659 M = Matrix_integer_dense.__new__(Matrix_integer_dense, self.matrix_space(nr, nc), None, None, None) 660 661 _sig_on 662 for i from 0 <= i < nr: 663 for k from 0 <= k < n: 664 row_list[k] = (<Matrix_modn_dense>res[k]).matrix[i] 665 mm.mpz_crt_vec(M._matrix[i], row_list, n, nc) 666 _sig_off 667 668 sage_free(row_list) 669 return M 670 634 def _lift_crt(residues): 635 raise NotImplementedError 671 636 672 637 def _echelon_in_place_classical(self): -
sage/matrix/matrix_modn_dense.pxd
r2847 r1772 1 1 cimport matrix_dense 2 2 3 cdef extern from "../ext/multi_modular.h": 4 ctypedef unsigned long mod_int 5 mod_int MOD_INT_MAX 6 mod_int MOD_INT_OVERFLOW 3 ctypedef unsigned int uint 7 4 8 5 cdef class Matrix_modn_dense(matrix_dense.Matrix_dense): 9 cdef mod_int **matrix10 cdef mod_int *_entries11 cdef mod_int p12 cdef mod_int gather6 cdef uint **matrix 7 cdef uint *_entries 8 cdef uint p 9 cdef uint gather 13 10 14 #cdef set_matrix(Matrix_modn_dense self, mod_int **m)15 #cdef mod_int **get_matrix(Matrix_modn_dense self)16 #cdef mod_int entry(self, mod_int i, mod_int j)17 cdef _rescale_row_c(self, Py_ssize_t row, mod_int multiple, Py_ssize_t start_col)18 cdef _rescale_col_c(self, Py_ssize_t col, mod_int multiple, Py_ssize_t start_row)11 #cdef set_matrix(Matrix_modn_dense self, uint **m) 12 #cdef uint **get_matrix(Matrix_modn_dense self) 13 #cdef uint entry(self, uint i, uint j) 14 cdef _rescale_row_c(self, Py_ssize_t row, uint multiple, Py_ssize_t start_col) 15 cdef _rescale_col_c(self, Py_ssize_t col, uint multiple, Py_ssize_t start_row) 19 16 cdef _add_multiple_of_row_c(self, Py_ssize_t row_to, Py_ssize_t row_from, 20 mod_int multiple, Py_ssize_t start_col)17 uint multiple, Py_ssize_t start_col) 21 18 cdef _add_multiple_of_column_c(self, Py_ssize_t col_to, Py_ssize_t col_from, 22 mod_int multiple, Py_ssize_t start_row)19 uint multiple, Py_ssize_t start_row) 23 20 24 21 -
sage/matrix/matrix_modn_dense.pyx
r2847 r2629 112 112 matrix_dense.Matrix_dense.__init__(self, parent) 113 113 114 cdef mod_int p114 cdef uint p 115 115 p = self._base_ring.characteristic() 116 116 self.p = p 117 if p >= MOD_INT_MAX:118 raise OverflowError, "p (=%s) must be < %s"%(p, MOD_INT_MAX)119 self.gather = MOD_INT_OVERFLOW /(p*p)117 if p >= 46340: 118 raise OverflowError, "p (=%s) must be < 46340"%p 119 self.gather = 2**32/(p*p) 120 120 121 self._entries = < mod_int *> sage_malloc(sizeof(mod_int)*self._nrows*self._ncols)121 self._entries = <uint *> sage_malloc(sizeof(uint)*self._nrows*self._ncols) 122 122 if self._entries == NULL: 123 123 raise MemoryError, "Error allocating matrix" 124 124 125 self.matrix = < mod_int **> sage_malloc(sizeof(mod_int*)*self._nrows)125 self.matrix = <uint **> sage_malloc(sizeof(uint*)*self._nrows) 126 126 if self.matrix == NULL: 127 127 sage_free(self._entries) 128 128 raise MemoryError, "Error allocating memory" 129 129 130 cdef mod_int k130 cdef uint k 131 131 cdef Py_ssize_t i 132 132 k = 0 … … 143 143 def __init__(self, parent, entries, copy, coerce): 144 144 145 cdef mod_int e145 cdef uint e 146 146 cdef Py_ssize_t i, j, k 147 cdef mod_int *v147 cdef uint *v 148 148 149 149 # scalar? … … 164 164 165 165 k = 0 166 cdef mod_int n166 cdef uint n 167 167 R = self.base_ring() 168 168 … … 229 229 A = Matrix_modn_dense.__new__(Matrix_modn_dense, self._parent, 230 230 0, 0, 0) 231 memcpy(A._entries, self._entries, sizeof( mod_int)*self._nrows*self._ncols)231 memcpy(A._entries, self._entries, sizeof(uint)*self._nrows*self._ncols) 232 232 A.p = self.p 233 233 A.gather = self.gather … … 257 257 258 258 cdef Py_ssize_t start_row, c, r, nr, nc, i 259 cdef mod_int p, a, a_inverse, b260 cdef mod_int **m259 cdef uint p, a, a_inverse, b 260 cdef uint **m 261 261 262 262 start_row = 0 … … 295 295 self._rescale_row_c(row, multiple, start_col) 296 296 297 cdef _rescale_row_c(self, Py_ssize_t row, mod_int multiple, Py_ssize_t start_col):298 cdef mod_int r, p299 cdef mod_int* v297 cdef _rescale_row_c(self, Py_ssize_t row, uint multiple, Py_ssize_t start_col): 298 cdef uint r, p 299 cdef uint* v 300 300 cdef Py_ssize_t i 301 301 p = self.p … … 307 307 self._rescale_col_c(col, multiple, start_row) 308 308 309 cdef _rescale_col_c(self, Py_ssize_t col, mod_int multiple, Py_ssize_t start_row):309 cdef _rescale_col_c(self, Py_ssize_t col, uint multiple, Py_ssize_t start_row): 310 310 """ 311 311 EXAMPLES: … … 339 339 [ 2 5 34] 340 340 """ 341 cdef mod_int r, p342 cdef mod_int* v341 cdef uint r, p 342 cdef uint* v 343 343 cdef Py_ssize_t i 344 344 p = self.p … … 350 350 self._add_multiple_of_row_c(row_to, row_from, multiple, start_col) 351 351 352 cdef _add_multiple_of_row_c(self, Py_ssize_t row_to, Py_ssize_t row_from, mod_int multiple,352 cdef _add_multiple_of_row_c(self, Py_ssize_t row_to, Py_ssize_t row_from, uint multiple, 353 353 Py_ssize_t start_col): 354 cdef mod_int p355 cdef mod_int *v_from, *v_to354 cdef uint p 355 cdef uint *v_from, *v_to 356 356 357 357 p = self.p … … 368 368 self._add_multiple_of_column_c(col_to, col_from, s, start_row) 369 369 370 cdef _add_multiple_of_column_c(self, Py_ssize_t col_to, Py_ssize_t col_from, mod_int multiple,370 cdef _add_multiple_of_column_c(self, Py_ssize_t col_to, Py_ssize_t col_from, uint multiple, 371 371 Py_ssize_t start_row): 372 cdef mod_int p373 cdef mod_int **m372 cdef uint p 373 cdef uint **m 374 374 375 375 m = self.matrix … … 382 382 383 383 cdef swap_rows_c(self, Py_ssize_t row1, Py_ssize_t row2): 384 cdef mod_int* temp384 cdef uint* temp 385 385 temp = self.matrix[row1] 386 386 self.matrix[row1] = self.matrix[row2] … … 389 389 cdef swap_columns_c(self, Py_ssize_t col1, Py_ssize_t col2): 390 390 cdef Py_ssize_t i, nr 391 cdef mod_int t392 cdef mod_int **m391 cdef uint t 392 cdef uint **m 393 393 m = self.matrix 394 394 nr = self._nrows … … 412 412 n = self._nrows 413 413 414 cdef mod_int **h414 cdef uint **h 415 415 h = self.matrix 416 416 417 cdef mod_int p, r, t, t_inv, u417 cdef uint p, r, t, t_inv, u 418 418 cdef Py_ssize_t i, j, m 419 419 p = self.p … … 477 477 n = self._nrows 478 478 479 cdef mod_int p, t479 cdef uint p, t 480 480 p = self.p 481 481 … … 529 529 # A = matrix(Integers(389),4,range(16)); A._echelon_strassen(4) 530 530 # *** glibc detected *** free(): invalid next size (fast): 0x0000000000fb15e0 *** 531 # error in set_to memcpy on 64-bit 532 def matrix_window(self, Py_ssize_t row=0, Py_ssize_t col=0, 531 def xxx_matrix_window(self, Py_ssize_t row=0, Py_ssize_t col=0, 533 532 Py_ssize_t nrows=-1, Py_ssize_t ncols=-1): 534 533 """ … … 551 550 <type 'sage.matrix.matrix_modn_dense.Matrix_modn_dense'> 552 551 """ 553 print "making matrix window"554 552 if nrows == -1: 555 553 nrows = self._nrows - row -
sage/matrix/matrix_rational_dense.pyx
r2654 r2628 439 439 A, A_denom = left._clear_denom() 440 440 B, B_denom = right._clear_denom() 441 AB = A ._multiply_multi_modular(B)441 AB = A*B # A._multiply_multi_modular(B) 442 442 D = A_denom * B_denom 443 443 res = Matrix_rational_dense.__new__(Matrix_rational_dense, left.matrix_space(AB._nrows, AB._ncols), 0, 0, 0) -
sage/matrix/matrix_window_modn_dense.pxd
r2847 r1872 1 1 from matrix_window cimport MatrixWindow 2 2 3 cdef extern from "../ext/multi_modular.h": 4 ctypedef unsigned long mod_int 5 mod_int MOD_INT_MAX 3 ctypedef unsigned int uint 6 4 7 5 cdef class MatrixWindow_modn_dense(MatrixWindow): -
sage/matrix/matrix_window_modn_dense.pyx
r2847 r1993 8 8 from sage.matrix.matrix_modn_dense cimport Matrix_modn_dense 9 9 10 # TODO: what if we used the actual pointers for our loop variables?11 10 12 11 cdef class MatrixWindow_modn_dense(matrix_window.MatrixWindow): … … 24 23 """ 25 24 cdef Py_ssize_t i, j 26 cdef mod_int** self_rows27 cdef mod_int** A_rows25 cdef uint** self_rows 26 cdef uint** A_rows 28 27 if self._nrows != A._nrows or self._ncols != A._ncols: 29 28 raise ArithmeticError, "incompatible dimensions" … … 31 30 A_rows = ( <Matrix_modn_dense> A._matrix ).matrix 32 31 for i from 0 <= i < self._nrows: 33 memcpy(self_rows[i+self._row] + self._col, A_rows[i+A._row] + A._col, self._ncols * sizeof( mod_int*))32 memcpy(self_rows[i+self._row] + self._col, A_rows[i+A._row] + A._col, self._ncols * sizeof(uint*)) 34 33 35 34 cdef set_to_zero(MatrixWindow_modn_dense self): 36 35 cdef Py_ssize_t i, j 37 cdef mod_int** rows36 cdef uint** rows 38 37 rows = ( <Matrix_modn_dense> self._matrix ).matrix 39 38 for i from self._row <= i < self._row + self._nrows: 40 memset(rows[i] + self._col, 0, self._ncols * sizeof( mod_int*))39 memset(rows[i] + self._col, 0, self._ncols * sizeof(uint*)) 41 40 42 41 cdef add(self, MatrixWindow A): 43 42 cdef Py_ssize_t i, j 44 cdef mod_int p45 cdef mod_int* self_row46 cdef mod_int* A_row43 cdef uint p 44 cdef uint** self_matrix 45 cdef uint** A_matrix 47 46 if self._nrows != A._nrows or self._ncols != A._ncols: 48 47 raise ArithmeticError, "incompatible dimensions" 48 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 49 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 49 50 p = ( <Matrix_modn_dense> self._matrix ).p 50 51 for i from 0 <= i < self._nrows: 51 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col52 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col53 52 for j from 0 <= j < self._ncols: 54 self_row[j] += A_row[j] 55 if self_row[j] >= p: 56 self_row[j] -= p 53 # I really want to do in place operations here... 54 self_matrix[i+self._row][j+self._col] = self_matrix[i+self._row][j+self._col] + A_matrix[i+A._row][j+A._col] 55 if self_matrix[i+self._row][j+self._col] >= p: 56 self_matrix[i+self._row][j+self._col] = self_matrix[i+self._row][j+self._col] - p 57 57 58 58 cdef subtract(self, MatrixWindow A): 59 59 cdef Py_ssize_t i, j 60 cdef mod_int p61 cdef mod_int* self_row62 cdef mod_int* A_row60 cdef uint p 61 cdef uint** self_matrix 62 cdef uint** A_matrix 63 63 if self._nrows != A._nrows or self._ncols != A._ncols: 64 64 raise ArithmeticError, "incompatible dimensions" 65 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 66 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 65 67 p = ( <Matrix_modn_dense> self._matrix ).p 66 68 for i from 0 <= i < self._nrows: 67 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col68 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col69 69 for j from 0 <= j < self._ncols: 70 if self_row[j] >= A_row[j]:71 self_row[j] -= A_row[j]72 else:73 self_ row[j] += p - A_row[j]70 # I really want to do in place operations here... 71 self_matrix[i+self._row][j+self._col] = p + self_matrix[i+self._row][j+self._col] - A_matrix[i+A._row][j+A._col] 72 if self_matrix[i+self._row][j+self._col] >= p: 73 self_matrix[i+self._row][j+self._col] = self_matrix[i+self._row][j+self._col] - p 74 74 75 75 cdef set_to_sum(self, MatrixWindow A, MatrixWindow B): 76 76 cdef Py_ssize_t i, j 77 cdef mod_int p78 cdef mod_int* self_row79 cdef mod_int* A_row80 cdef mod_int* B_row77 cdef uint p 78 cdef uint** self_matrix 79 cdef uint** A_matrix 80 cdef uint** B_matrix 81 81 if self._nrows != A._nrows or self._ncols != A._ncols: 82 82 raise ArithmeticError, "incompatible dimensions" 83 83 if self._nrows != B._nrows or self._ncols != B._ncols: 84 84 raise ArithmeticError, "incompatible dimensions" 85 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 86 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 87 B_matrix = ( <Matrix_modn_dense> B._matrix ).matrix 85 88 p = ( <Matrix_modn_dense> self._matrix ).p 86 89 for i from 0 <= i < self._nrows: 87 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col88 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col89 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i + B._row] + B._col90 90 for j from 0 <= j < self._ncols: 91 self_row[j] = A_row[j] + B_row[j] 92 if self_row[j] >= p: 93 self_row[j] -= p 91 self_matrix[i+self._row][j+self._col] = A_matrix[i+A._row][j+A._col] + B_matrix[i+B._row][j+B._col] 92 if self_matrix[i+self._row][j+self._col] >= p: 93 # I really want to do in place operations here... 94 self_matrix[i+self._row][j+self._col] = self_matrix[i+self._row][j+self._col] - p 94 95 95 96 cdef set_to_diff(self, MatrixWindow A, MatrixWindow B): 96 97 cdef Py_ssize_t i, j 97 cdef mod_int p98 cdef mod_int* self_row99 cdef mod_int* A_row100 cdef mod_int* B_row98 cdef uint p 99 cdef uint** self_matrix 100 cdef uint** A_matrix 101 cdef uint** B_matrix 101 102 if self._nrows != A._nrows or self._ncols != A._ncols: 102 103 raise ArithmeticError, "incompatible dimensions" 103 104 if self._nrows != B._nrows or self._ncols != B._ncols: 104 105 raise ArithmeticError, "incompatible dimensions" 106 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 107 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 108 B_matrix = ( <Matrix_modn_dense> B._matrix ).matrix 105 109 p = ( <Matrix_modn_dense> self._matrix ).p 106 110 for i from 0 <= i < self._nrows: 107 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col108 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col109 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i + B._row] + B._col110 111 for j from 0 <= j < self._ncols: 111 if A_row[j] > B_row[j]:112 self_row[j] = A_row[j] - B_row[j]113 else:114 self_ row[j] = p + A_row[j] - B_row[j]112 self_matrix[i+self._row][j+self._col] = p + A_matrix[i+A._row][j+A._col] - B_matrix[i+B._row][j+B._col] 113 if self_matrix[i+self._row][j+self._col] >= p: 114 # I really want to do in place operations here... 115 self_matrix[i+self._row][j+self._col] = self_matrix[i+self._row][j+self._col] - p 115 116 116 117 cdef set_to_prod(self, MatrixWindow A, MatrixWindow B): 117 cdef Py_ssize_t i, j, k, gather, top, A_ncols 118 cdef mod_int p, s 119 cdef mod_int* self_row 120 cdef mod_int* A_row 121 cdef mod_int** B_matrix_off 118 # TODO: gather 119 cdef Py_ssize_t i, j, k 120 cdef uint p, s 121 cdef uint** self_matrix 122 cdef uint** A_matrix 123 cdef uint** B_matrix 122 124 if A._ncols != B._nrows or self._nrows != A._nrows or self._ncols != B._ncols: 123 125 raise ArithmeticError, "incompatible dimensions" 124 B_matrix_off = ( <Matrix_modn_dense> B._matrix ).matrix + B._row 126 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 127 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 128 B_matrix = ( <Matrix_modn_dense> B._matrix ).matrix 125 129 p = ( <Matrix_modn_dense> self._matrix ).p 126 gather = ( <Matrix_modn_dense> self._matrix ).gather 127 A_ncols = A._ncols 128 129 if gather <= 1: 130 for i from 0 <= i < A._nrows: 131 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col 132 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col 133 for j from 0 <= j < B._ncols: 134 s = 0 135 for k from 0 <= k < A._ncols: 136 s = (s + A_row[k] * B_matrix_off[k][j+B._col]) % p 137 self_row[j] = s 138 else: 139 for i from 0 <= i < A._nrows: 140 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i + self._row] + self._col 141 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i + A._row] + A._col 142 for j from 0 <= j < B._ncols: 143 s = 0 144 k = 0 145 while k < A_ncols: 146 top = k + gather 147 if top > A_ncols: 148 top = A_ncols 149 for k from k <= k < top: # = min(k+gather, A._ncols) 150 s += A_row[k] * B_matrix_off[k][j+B._col] 151 s %= p 152 self_row[j] = s 130 for i from 0 <= i < A._nrows: 131 for j from 0 <= j < B._ncols: 132 s = 0 133 for k from 0 <= k < A._ncols: 134 s = (s + A_matrix[i+A._row][k+A._col] * B_matrix[k+B._row][j+B._col]) % p 135 self_matrix[i+self._row][j+self._col] = s % p 153 136 154 137 cdef add_prod(self, MatrixWindow A, MatrixWindow B): 155 138 # TODO: gather 156 cdef Py_ssize_t i, j, k , A_ncols157 cdef mod_int p, s158 cdef mod_int* self_row159 cdef mod_int* A_row160 cdef mod_int* B_row139 cdef Py_ssize_t i, j, k 140 cdef uint p, s 141 cdef uint** self_matrix 142 cdef uint** A_matrix 143 cdef uint** B_matrix 161 144 if A._ncols != B._nrows or self._nrows != A._nrows or self._ncols != B._ncols: 162 145 raise ArithmeticError, "incompatible dimensions" 146 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 147 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 148 B_matrix = ( <Matrix_modn_dense> B._matrix ).matrix 163 149 p = ( <Matrix_modn_dense> self._matrix ).p 164 gather = ( <Matrix_modn_dense> self._matrix ).gather 165 A_ncols = A._ncols 166 167 if gather <= 1: 168 for i from 0 <= i < A._nrows: 169 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i+self._row] + self._col 170 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i+B._row] + B._col 171 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i+A._row] + A._col 172 for j from 0 <= j < B._ncols: 173 s = self_row[j] 174 for k from 0 <= k < A._ncols: 175 s = ( s + A_row[k] * B_row[j] ) % p 176 self_row[j] = s 177 178 else: 179 for i from 0 <= i < A._nrows: 180 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i+self._row] + self._col 181 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i+B._row] + B._col 182 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i+A._row] + A._col 183 for j from 0 <= j < B._ncols: 184 s = self_row[j] 185 k = 0 186 while k < A_ncols: 187 top = k + gather 188 if top > A_ncols: 189 top = A_ncols 190 for k from k <= k < top: # = min(k+gather, A._ncols) 191 s += A_row[k] * B_matrix_off[k][j+B._col] 192 s %= p 193 self_row[j] = s 194 150 for i from 0 <= i < A._nrows: 151 for j from 0 <= j < B._ncols: 152 s = self_matrix[i+self._row][j+self._col] 153 for k from 0 <= k < A._ncols: 154 s = ( s + A_matrix[i+A._row][k+A._col] * B_matrix[k+B._row][j+B._col] ) % p 155 self_matrix[i+self._row][j+self._col] = s % p 195 156 196 157 cdef subtract_prod(self, MatrixWindow A, MatrixWindow B): 197 158 # TODO: gather 198 cdef Py_ssize_t i, j, k , A_ncols199 cdef mod_int p, s200 cdef mod_int* self_row201 cdef mod_int* A_row202 cdef mod_int* B_row159 cdef Py_ssize_t i, j, k 160 cdef uint p, s 161 cdef uint** self_matrix 162 cdef uint** A_matrix 163 cdef uint** B_matrix 203 164 if A._ncols != B._nrows or self._nrows != A._nrows or self._ncols != B._ncols: 204 165 raise ArithmeticError, "incompatible dimensions" 166 self_matrix = ( <Matrix_modn_dense> self._matrix ).matrix 167 A_matrix = ( <Matrix_modn_dense> A._matrix ).matrix 168 B_matrix = ( <Matrix_modn_dense> B._matrix ).matrix 205 169 p = ( <Matrix_modn_dense> self._matrix ).p 206 A_ncols = A._ncols 207 208 if gather <= 1: 209 for i from 0 <= i < A._nrows: 210 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i+self._row] + self._col 211 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i+B._row] + B._col 212 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i+A._row] + A._col 213 for j from 0 <= j < B._ncols: 214 s = self_row[j] 215 for k from 0 <= k < A._ncols: 216 s = s + p - ( A_row[k] * B_row[j] ) % p 217 self_row[j] = s 218 219 else: 220 for i from 0 <= i < A._nrows: 221 self_row = ( <Matrix_modn_dense> self._matrix ).matrix[i+self._row] + self._col 222 A_row = ( <Matrix_modn_dense> A._matrix ).matrix[i+B._row] + B._col 223 B_row = ( <Matrix_modn_dense> B._matrix ).matrix[i+A._row] + A._col 224 for j from 0 <= j < B._ncols: 225 s = self_row[j] + p * gather # because they're unsigned 226 k = 0 227 while k < A_ncols: 228 top = k + gather 229 if top > A_ncols: 230 top = A_ncols 231 for k from k <= k < top: # = min(k+gather, A._ncols) 232 s -= A_row[k] * B_matrix_off[k][j+B._col] 233 s = s % p + p * gather # because they're unsigne 234 self_row[j] = s % p 170 for i from 0 <= i < A._nrows: 171 for j from 0 <= j < B._ncols: 172 s = self_matrix[i+self._row][j+self._col] 173 for k from 0 <= k < A._ncols: 174 s = s + p - ( A_matrix[i+A._row][k+A._col] * B_matrix[k+B._row][j+B._col] ) % p 175 self_matrix[i+self._row][j+self._col] = s % p 235 176 236 177 cdef int element_is_zero(self, Py_ssize_t i, Py_ssize_t j): -
setup.py
r2847 r2632 314 314 Extension('sage.ext.arith_gmp', 315 315 sources = ['sage/ext/arith_gmp.pyx'], 316 libraries=['gmp']), \317 318 Extension('sage.ext.multi_modular',319 sources = ['sage/ext/multi_modular.pyx'],320 316 libraries=['gmp']), \ 321 317
Note: See TracChangeset
for help on using the changeset viewer.
