| 146 | return sp.expand(D) |
| 147 | |
| 148 | def _detBS(M): |
| 149 | newM = M.copy() |
| 150 | sign = 1 |
| 151 | dim = newM.shape[0] |
| 152 | for k in range(dim-1): |
| 153 | if newM[k, k].is_zero: |
| 154 | for m in range(k+1, dim-1): |
| 155 | if newM[m, k] != 0: |
| 156 | row_m = newM.row(m) |
| 157 | newM[m, :] = newM.row(k) |
| 158 | newM[k, :] = row_m |
| 159 | sign = -sign |
| 160 | break |
| 161 | if m == dim-1: |
| 162 | return sp.S(0) |
| 163 | for i in range(k+1, dim): |
| 164 | for j in range(k+1, dim): |
| 165 | newM[i, j] = newM[k, k] * newM[i, j] - newM[i, k] * newM[k, j] |
| 166 | if k: |
| 167 | newM[i, j] = sp.factor(newM[i, j] / newM[k-1, k-1]) |
| 168 | newM[i, k] = 0 |
| 169 | D = sign * newM[dim-1, dim-1] |
| 170 | return sp.simplify(D) |
| 171 | |
| 172 | def _Roots(expr, var): |
| 173 | if isinstance(expr, sp.Basic) and isinstance(var, sp.Symbol): |