Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/libs/linbox/linbox.pyx
8817 views
1
## NOTE: The sig_on()/sig_off() stuff can't go in here -- it has to be in the
2
## code that calls these functions. Otherwise strangely objects get left
3
## in an incorrect state.
4
5
from sage.rings.integer cimport Integer
6
from sage.misc.misc import verbose, get_verbose, cputime, UNAME
7
8
##########################################################################
9
## Sparse matrices modulo p.
10
##########################################################################
11
12
include 'sage/modules/vector_modn_sparse_c.pxi'
13
include 'sage/ext/stdsage.pxi'
14
15
cdef extern from "linbox/linbox-sage.h":
16
ctypedef struct vector_uint "std::vector<unsigned int>":
17
void (*push_back)(unsigned int)
18
int (*get "operator[]") (size_t i)
19
int (*size)()
20
21
int linbox_modn_sparse_matrix_rank(unsigned long modulus, size_t nrows, size_t ncols, void* rows, int reorder) #, int **pivots)
22
vector_uint linbox_modn_sparse_matrix_solve(unsigned long modulus, size_t numrows, size_t numcols, void *a, void *b, int method)
23
24
cdef class Linbox_modn_sparse:
25
cdef set(self, int modulus, size_t nrows, size_t ncols, c_vector_modint *rows):
26
self.rows = rows
27
self.nrows = nrows
28
self.ncols = ncols
29
self.modulus = modulus
30
31
cdef object rank(self, int gauss):
32
#cdef int *_pivots
33
cdef int r
34
r = linbox_modn_sparse_matrix_rank(self.modulus, self.nrows, self.ncols, self.rows, gauss)
35
36
#pivots = [_pivots[i] for i in range(r)]
37
#free(_pivots)
38
return r#, pivots
39
40
cdef void solve(self, c_vector_modint **x, c_vector_modint *b, int method):
41
"""
42
"""
43
cdef vector_uint X
44
X = linbox_modn_sparse_matrix_solve(self.modulus, self.nrows, self.ncols, self.rows, b, method)
45
46
for i from 0 <= i < X.size():
47
set_entry(x[0], i, X.get(i))
48
49
50
##########################################################################
51
## Sparse matrices over ZZ
52
##########################################################################
53
54
55
##########################################################################
56
## Dense matrices over ZZ
57
##########################################################################
58
59
cdef extern from "linbox/linbox-sage.h":
60
void linbox_integer_dense_minpoly(mpz_t* &minpoly, size_t &degree, size_t n, mpz_t** matrix)
61
62
void linbox_integer_dense_charpoly(mpz_t* &charpoly, size_t &degree, size_t n, mpz_t** matrix)
63
64
void linbox_integer_dense_delete_array(mpz_t* f)
65
66
int linbox_integer_dense_matrix_matrix_multiply(mpz_t** ans, mpz_t **A, mpz_t **B, size_t A_nr, size_t A_nc, size_t B_nc)
67
68
unsigned long linbox_integer_dense_rank(mpz_t** matrix, size_t nrows,
69
size_t ncols)
70
71
void linbox_integer_dense_det(mpz_t ans, mpz_t** matrix,
72
size_t nrows, size_t ncols)
73
74
void linbox_integer_dense_smithform(mpz_t **v,
75
mpz_t **matrix,
76
size_t nrows, size_t ncols)
77
78
cdef class Linbox_integer_dense:
79
cdef set(self, mpz_t** matrix, size_t nrows, size_t ncols):
80
self.nrows = nrows
81
self.ncols = ncols
82
self.matrix = matrix
83
84
def minpoly(self):
85
"""
86
OUTPUT:
87
coefficients of minpoly as a Python list
88
"""
89
cdef mpz_t* poly
90
cdef size_t degree
91
verbose("using linbox poly comp")
92
linbox_integer_dense_minpoly(poly, degree, self.nrows, self.matrix)
93
verbose("computed poly -- now converting back to Sage")
94
95
v = []
96
cdef Integer k
97
cdef size_t n
98
for n from 0 <= n <= degree:
99
k = Integer()
100
mpz_set(k.value, poly[n])
101
mpz_clear(poly[n])
102
v.append(k)
103
linbox_integer_dense_delete_array(poly)
104
return v
105
return self._poly(True)
106
107
def charpoly(self):
108
"""
109
OUTPUT:
110
coefficients of charpoly or minpoly as a Python list
111
"""
112
cdef mpz_t* poly
113
cdef size_t degree
114
verbose("using linbox poly comp")
115
linbox_integer_dense_charpoly(poly, degree, self.nrows, self.matrix)
116
verbose("computed poly -- now converting back to Sage")
117
118
v = []
119
cdef Integer k
120
cdef size_t n
121
for n from 0 <= n <= degree:
122
k = Integer()
123
mpz_set(k.value, poly[n])
124
mpz_clear(poly[n])
125
v.append(k)
126
linbox_integer_dense_delete_array(poly)
127
return v
128
return self._poly(True)
129
130
cdef matrix_matrix_multiply(self,
131
mpz_t **ans,
132
mpz_t **B,
133
size_t B_nr, size_t B_nc):
134
cdef int e
135
e = linbox_integer_dense_matrix_matrix_multiply(ans, self.matrix, B, self.nrows, self.ncols, B_nc)
136
if e:
137
raise RuntimeError, "error doing matrix matrix multiply over ZZ using linbox"
138
139
140
cdef unsigned long rank(self) except -1:
141
return linbox_integer_dense_rank(self.matrix, self.nrows, self.ncols)
142
143
def det(self):
144
cdef Integer z
145
z = Integer()
146
linbox_integer_dense_det(z.value, self.matrix, self.nrows, self.ncols)
147
return z
148
149
def smithform(self):
150
raise NotImplementedError
151
#cdef mpz_t* v
152
#linbox_integer_dense_smithform(&v, self.matrix, self.nrows, self.ncols)
153
#z = []
154
#cdef Integer k
155
#cdef size_t n
156
#for n from 0 <= n < self.ncols:
157
# k = Integer()
158
# mpz_set(k.value, v[n])
159
# mpz_clear(v[n])
160
# z.append(k)
161
#linbox_integer_dense_delete_array(v)
162
#return z
163
164
165