31 ERROR(
"expected nonnegative integer");
34 size_t nrows =
static_cast<size_t>(n);
43 if (nrows < 0 || ncols < 0) {
44 ERROR(
"expected nonnegative integers");
48 size_t nr =
static_cast<size_t>(nrows);
49 size_t nc =
static_cast<size_t>(ncols);
80 ERROR(
"MutableMatrix promote not implemented yet");
110 size_t nrows = M->
n_rows();
111 return static_cast<int>(nrows);
116 size_t ncols = M->
n_cols();
117 return static_cast<int>(ncols);
122 int nrows =
static_cast<int>(M->
n_rows());
123 int ncols =
static_cast<int>(M->
n_cols());
125 for (
long i = 0; i < nelems; i++)
139 bool doing_fraction =
false;
142 int nrows =
static_cast<int>(M->
n_rows());
143 int ncols =
static_cast<int>(M->
n_cols());
148 doing_fraction =
true;
149 threshold =
static_cast<int>(density * 10000);
152 if (special_type == 0)
154 for (
int i = 0; i < ncols; i++)
155 for (
int j = 0; j < nrows; j++)
160 if (u > threshold)
continue;
166 else if (special_type == 1)
168 for (
int i = 0; i < ncols; i++)
170 int top = (i >= nrows ? nrows : i);
171 for (
int j = 0; j < top; j++)
176 if (u > threshold)
continue;
188 if (r < 0 || r >= M->
n_rows())
190 ERROR(
"matrix row index %d out of range 0 .. %d", r, M->
n_rows() - 1);
193 if (c < 0 || c >= M->
n_cols())
195 ERROR(
"matrix column index %d out of range 0 .. %d", c, M->
n_cols() - 1);
210 if(nrows < 0 || ncols < 0)
212 ERROR(
"internal error: matrix has a negative size %d by %d",
217 engine_RawRingElementArrayArray entries =
219 entries->len = nrows;
220 for(
int r = 0; r < nrows; r++)
222 engine_RawRingElementArray currRow =
224 currRow->len = ncols;
225 entries->array[r] = currRow;
227 for(
int r = 0; r < nrows; r++)
229 for(
int c = 0; c < ncols; c++)
233 entries->array[r]->array[c] =
255 ERROR(
"expected same ring");
258 if (r < 0 || r >= M->
n_rows())
260 ERROR(
"row index %d out of range 0..%d", r, M->
n_rows() - 1);
263 if (c < 0 || c >= M->
n_cols())
265 ERROR(
"column index %d out of range 0..%d", c, M->
n_cols() - 1);
276 if (i < 0 || j < 0 || i >= M->
n_rows() || j >= M->
n_rows())
278 ERROR(
"row index out of range");
289 if (i < 0 || j < 0 || i >= M->
n_cols() || j >= M->
n_cols())
291 ERROR(
"column index out of range");
306 (void) opposite_mult;
310 ERROR(
"expected same ring");
313 if (i < 0 || j < 0 || i >= M->
n_rows() || j >= M->
n_rows())
315 ERROR(
"row index out of range");
330 (void) opposite_mult;
334 ERROR(
"expected same ring");
337 if (i < 0 || j < 0 || i >= M->
n_cols() || j >= M->
n_cols())
339 ERROR(
"column index out of range");
353 (void) opposite_mult;
357 ERROR(
"expected same ring");
360 if (i < 0 || i >= M->
n_rows())
362 ERROR(
"row index out of range");
375 (void) opposite_mult;
379 ERROR(
"expected same ring");
382 if (i < 0 || i >= M->
n_cols())
384 ERROR(
"column index out of range");
419 (void) opposite_mult;
424 ERROR(
"expected elements in the same ring");
447 (void) opposite_mult;
452 ERROR(
"expected elements in the same ring");
469 ERROR(
"not re-implemented yet");
479 size_t nrows = M->
n_rows();
480 if (start < 0 || start + perm->len > nrows)
482 ERROR(
"row indices out of range");
485 for (
int i = 0; i < perm->len; i++)
487 int r = start + perm->array[i];
488 if (r < 0 || r >= nrows)
490 ERROR(
"row indices out of range");
503 size_t ncols = M->
n_cols();
504 if (start < 0 || start + perm->len > ncols)
506 ERROR(
"column indices out of range");
509 for (
int i = 0; i < perm->len; i++)
511 int r = start + perm->array[i];
512 if (r < 0 || r >= ncols)
514 ERROR(
"column indices out of range");
567 engine_RawRingElementArray values)
617 return fp_LLL(M, U, strategy);
620 long a = mpz_get_si(mpq_numref(threshold));
621 long b = mpz_get_si(mpq_denref(threshold));
622 return ntl_LLL(M, U, a, b, strategy);
629#warning "implement smith"
631 ERROR(
"not implemented yet");
639#warning "implement hermite"
641 ERROR(
"not implemented yet");
676 return LU->LUincremental(perm, v, i);
713 if (R != b->
get_ring() || R !=
x->get_ring())
715 ERROR(
"expected matrices with same base ring");
720 ERROR(
"expected matrices with the same number of rows");
723 return A->solve(b,
x);
738 return A->
eigenvalues(eigenvalues, is_symm_or_hermitian);
753 return A->
eigenvectors(eigenvalues, eigenvectors, is_symm_or_hermitian);
765 M2_bool use_divide_and_conquer)
769 return A->
SVD(Sigma, U, VT, use_divide_and_conquer);
787 if (R != b->
get_ring() || R !=
x->get_ring())
789 ERROR(
"expected matrices with same base ring");
794 ERROR(
"expected matrices with the same number of rows");
812 return A->
QR(Q, R, return_QR);
853 if (B==
nullptr)
ERROR(
"matrix not invertible");
994 std::vector<M2::ARingZZpFFPACK::ElementType> &elems)
996 size_t len = elems.size();
997 engine_RawRingElementArray
result =
999 result->len =
static_cast<int>(len);
1000 for (
size_t i = 0; i < len; i++)
1018 ERROR(
"expected a dense mutable matrix over the ffpack finite field");
1022 std::vector<M2::ARingZZpFFPACK::ElementType> charpoly;
1025 FFPACK::CharPoly(B->
get_Mat()->ring().field(), charpoly, A->
n_rows(),
1028 for (
size_t i = 0; i < charpoly.size(); i++) std::cout << charpoly[i] <<
" ";
1029 std::cout << std::endl;
1035 ERROR(
"not implemented: configure M2 with --enable-ffpack-fflas");
1052 ERROR(
"expected a dense mutable matrix over the ffpack finite field");
1058 Element *elemsA = B->
get_Mat()->array();
1064 Element *X =
new Element[n * (n + 1)];
1065 size_t *P =
new size_t[n];
1068 FFPACK::Protected::Hybrid_KGF_LUK_MinPoly(
1069 B->
get_Mat()->ring().field(), minpoly, n, elemsA, n, X, n, P);
1074 for (
size_t i = 0; i < minpoly.size(); i++) std::cout << minpoly[i] <<
" ";
1075 std::cout << std::endl;
1081 ERROR(
"not implemented: configure M2 with --enable-ffpack-fflas");
1096 ERROR(
"expected ring over an RR or CC");
1099 return M->
clean(epsilon);
1112 ERROR(
"expected ring over an RR or CC");
1125 ERROR(
"expected ring over an RR or CC");
1141 ERROR(
"expected ring over an RR or CC");
1145 mpfr_init2(norm, mpfr_get_prec(
p));
1146 mpfr_ui_div(norm, 1,
p, MPFR_RNDN);
1147 if (!mpfr_zero_p(norm))
1149 ERROR(
"Lp norm only implemented for p = infinity");
1160 if (!norm)
return nullptr;
Lenstra-Lenstra-Lovász integer lattice basis reduction, in place on a MutableMatrix.
M2::ARingZZpFFPACK — Z/p via FFLAS-FFPACK's Givaro::Modular<double> field.
Append-only GC-backed byte buffer used throughout the engine for text output.
static M2_arrayintOrNull DO(MutableMatrix *M)
static bool LLL(MutableMatrix *M, MutableMatrix *U, gmp_QQ threshold)
FieldType::Element ElementType
const Ring * get_ring() const
Matrix * clean(gmp_RR epsilon) const
gmp_RRorNull norm(gmp_RR p) const
unsigned int hash() const
virtual size_t n_rows() const
virtual size_t n_rows() const =0
virtual bool dot_product(size_t i, size_t j, ring_elem &result) const =0
virtual const RingElement * determinant() const =0
virtual MutableMatrix * copy(bool prefer_dense) const =0
virtual MutableMatrix * nullSpace() const =0
virtual void triangularSolve(MutableMatrix *x, int m, int strategy)=0
virtual bool column2by2(size_t c1, size_t c2, ring_elem a1, ring_elem a2, ring_elem b1, ring_elem b2)=0
MutableMat< MatType > * cast_to_MutableMat()
virtual MutableMatrix * mult(const RingElement *f) const =0
virtual Matrix * to_matrix() const =0
virtual bool row_op(size_t i, ring_elem r, size_t j)=0
virtual bool scale_column(size_t i, ring_elem r)=0
virtual size_t n_cols() const =0
virtual bool interchange_rows(size_t i, size_t j)=0
virtual bool interchange_columns(size_t i, size_t j)=0
virtual bool QR(MutableMatrix *Q, MutableMatrix *R, bool return_QR) const =0
virtual bool is_equal(const MutableMatrix *B) const =0
virtual bool get_entry(size_t r, size_t c, ring_elem &result) const =0
virtual void addMultipleTo(const MutableMatrix *A, const MutableMatrix *B)=0
virtual size_t rank() const =0
Fast linear algebra routines (well, fast for some rings).
virtual M2_arrayintOrNull rankProfile(bool row_profile) const =0
virtual bool SVD(MutableMatrix *Sigma, MutableMatrix *U, MutableMatrix *Vt, bool use_divide_and_conquer) const =0
virtual MutableMatrix * invert() const =0
virtual gmp_RRorNull norm() const =0
virtual bool eigenvectors(MutableMatrix *eigenvals, MutableMatrix *eigenvecs, bool is_symm_or_hermitian) const =0
static MutableMatrix * zero_matrix(const Ring *R, size_t nrows, size_t ncols, bool dense)
virtual bool is_zero() const =0
static MutableMatrix * from_matrix(const Matrix *N, bool is_dense)
virtual bool row2by2(size_t r1, size_t r2, ring_elem a1, ring_elem a2, ring_elem b1, ring_elem b2)=0
virtual bool column_permute(size_t start_col, M2_arrayint perm)=0
virtual MutableMatrix * solveInvertible(const MutableMatrix *B) const =0
virtual bool is_dense() const =0
virtual bool delete_rows(size_t i, size_t j)=0
virtual void reduce_by_pivots()=0
void text_out(buffer &o) const
virtual MutableMatrix * transpose() const =0
virtual bool scale_row(size_t i, ring_elem r)=0
virtual MutableMatrix * submatrix(M2_arrayint rows, M2_arrayint cols) const =0
bool set_values(M2_arrayint rows, M2_arrayint cols, engine_RawRingElementArray values)
virtual bool insert_columns(size_t i, size_t n_to_add)=0
virtual bool eigenvalues(MutableMatrix *eigenvals, bool is_symm_or_hermitian) const =0
virtual bool column_op(size_t i, ring_elem r, size_t j)=0
virtual bool row_permute(size_t start_row, M2_arrayint perm)=0
virtual const Ring * get_ring() const =0
virtual void clean(gmp_RR epsilon)=0
virtual bool insert_rows(size_t i, size_t n_to_add)=0
virtual void subtractMultipleTo(const MutableMatrix *A, const MutableMatrix *B)=0
virtual M2_arrayintOrNull LU(MutableMatrix *L, MutableMatrix *U) const =0
virtual bool delete_columns(size_t i, size_t j)=0
virtual bool set_entry(size_t r, size_t c, const ring_elem a)=0
virtual bool least_squares(const MutableMatrix *b, MutableMatrix *x, bool assume_full_rank) const =0
virtual MutableMatrix * solveLinear(const MutableMatrix *B) const =0
virtual MutableMatrix * rowReducedEchelonForm() const =0
static MutableMatrix * identity(const Ring *R, size_t nrows, bool dense)
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
virtual void increase_maxnorm(gmp_RRmutable norm, const ring_elem f) const
virtual unsigned long get_precision() const
virtual ring_elem zeroize_tiny(gmp_RR epsilon, const ring_elem f) const
virtual bool is_zero(const ring_elem f) const =0
virtual ring_elem random() const
ring_elem get_value() const
static RingElement * make_raw(const Ring *R, ring_elem f)
const Ring * get_ring() const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
MutableMatrix * internMutableMatrix(MutableMatrix *G)
intern_* helpers that register long-lived engine objects with bdwgc finalisers.
bool fp_LLL(MutableMatrix *M, MutableMatrix *U, int strategy)
Engine-side wrapper around the external fplll lattice-reduction library.
FF_LUComputation — Bareiss-style fraction-free LU over an integral domain.
mpfr_srcptr moveTo_gmpRR(mpfr_ptr _z)
Inline helpers that move GMP / MPFR / MPFI limbs from malloc-managed storage into the bdwgc heap.
DMat< M2::ARingZZp > DMatZZp
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmemarraytype(S, len)
#define getmemstructtype(S)
M2_arrayint M2_arrayintOrNull
engine_RawRingElementArray engine_RawRingElementArrayOrNull
engine_RawRingElementArrayArray engine_RawRingElementArrayArrayOrNull
MutableMatrix — abstract base of every mutable matrix the engine hands across the boundary.
Matrix — the engine's immutable homomorphism F -> G between free modules.
M2_bool rawMutableMatrixIsDense(const MutableMatrix *M)
const RingElement * IM2_MutableMatrix_get_entry(const MutableMatrix *M, int r, int c)
engine_RawRingElementArrayOrNull rawLinAlgMinPoly(MutableMatrix *A)
M2_bool IM2_MutableMatrix_insert_columns(MutableMatrix *M, int i, int n_to_add)
M2_string IM2_MutableMatrix_to_string(const MutableMatrix *M)
MutableMatrix * rawMutableMatrixClean(gmp_RR epsilon, MutableMatrix *M)
const RingElement * rawRingElementClean(gmp_RR epsilon, const RingElement *f)
M2_bool IM2_MutableMatrix_set_entry(MutableMatrix *M, int r, int c, const RingElement *a)
M2_bool rawEigenvalues(MutableMatrix *A, MutableMatrix *eigenvalues, M2_bool is_symm_or_hermitian)
long rawLinAlgRank(MutableMatrix *M)
M2_bool IM2_MutableMatrix_sort_columns(MutableMatrix *M, int lo, int hi)
M2_bool IM2_MutableMatrix_column_scale(MutableMatrix *M, const RingElement *r, int i, M2_bool opposite_mult)
M2_bool IM2_SmithNormalForm(MutableMatrix *M)
M2_bool IM2_MutableMatrix_column_swap(MutableMatrix *M, int i, int j)
M2_bool IM2_MutableMatrix_delete_columns(MutableMatrix *M, int i, int j)
M2_bool rawLLL(MutableMatrix *M, MutableMatrix *U, gmp_QQ threshold, int strategy)
M2_bool IM2_MutableMatrix_insert_rows(MutableMatrix *M, int i, int n_to_add)
M2_bool IM2_MutableMatrix_row_operation(MutableMatrix *M, int i, const RingElement *r, int j, M2_bool opposite_mult)
M2_bool IM2_MutableMatrix_is_zero(const MutableMatrix *M)
MutableMatrix * rawMutableMatrixLift(int *success_return, const Ring *R, const MutableMatrix *f)
const Matrix * IM2_MutableMatrix_to_matrix(const MutableMatrix *M)
const Matrix * rawMatrixClean(gmp_RR epsilon, const Matrix *M)
M2_bool rawLinAlgSubMult(MutableMatrix *C, const MutableMatrix *A, const MutableMatrix *B)
void rawTriangularSolve(MutableMatrix *Lv, MutableMatrix *x, int m, int strategy)
M2_bool rawQR(const MutableMatrix *A, MutableMatrix *Q, MutableMatrix *R, M2_bool return_QR)
MutableMatrix * rawLinAlgNullSpace(MutableMatrix *A)
engine_RawRingElementArrayOrNull rawLinAlgCharPoly(MutableMatrix *A)
MutableMatrix * rawMutableMatrixPromote(const Ring *S, const MutableMatrix *f)
M2_bool IM2_HermiteNormalForm(MutableMatrix *M)
M2_bool rawLeastSquares(MutableMatrix *A, MutableMatrix *b, MutableMatrix *x, M2_bool assume_full_rank)
MutableMatrix * rawLinAlgMult(const MutableMatrix *A, const MutableMatrix *B)
gmp_RRorNull rawMutableMatrixNorm(gmp_RR p, const MutableMatrix *M)
MutableMatrix * IM2_MutableMatrix_submatrix(const MutableMatrix *M, M2_arrayint rows, M2_arrayint cols)
M2_bool IM2_MutableMatrix_column_permute(MutableMatrix *M, int start, M2_arrayint perm)
int IM2_MutableMatrix_n_rows(const MutableMatrix *M)
static gmp_RRmutable get_norm_start(gmp_RR p, const Ring *R)
MutableMatrix * IM2_MutableMatrix_copy(MutableMatrix *M, M2_bool prefer_dense)
gmp_RRorNull rawMatrixNorm(gmp_RR p, const Matrix *M)
M2_bool IM2_MutableMatrix_reduce_by_pivots(MutableMatrix *M)
M2_bool IM2_MutableMatrix_row_scale(MutableMatrix *M, const RingElement *r, int i, M2_bool opposite_mult)
engine_RawRingElementArray convertRingelemsToArray(const Ring *R, std::vector< M2::ARingZZpFFPACK::ElementType > &elems)
M2_bool IM2_MutableMatrix_set_values(MutableMatrix *M, M2_arrayint rows, M2_arrayint cols, engine_RawRingElementArray values)
M2_bool rawLinAlgAddMult(MutableMatrix *C, const MutableMatrix *A, const MutableMatrix *B)
MutableMatrix * IM2_MutableMatrix_make(const Ring *R, int nrows, int ncols, M2_bool is_dense)
MutableMatrix * rawLinAlgInverse(MutableMatrix *A)
const RingElement * rawLinAlgDeterminant(MutableMatrix *A)
M2_bool IM2_MutableMatrix_row_2by2(MutableMatrix *M, int r1, int r2, const RingElement *a1, const RingElement *a2, const RingElement *b1, const RingElement *b2, M2_bool opposite_mult)
MutableMatrix * IM2_MutableMatrix_submatrix1(const MutableMatrix *M, M2_arrayint cols)
MutableMatrix * rawLinAlgSolveInvertible(const MutableMatrix *A, const MutableMatrix *B, int *success)
MutableMatrix * rawLinAlgRREF(MutableMatrix *A)
M2_arrayintOrNull rawLinAlgRankProfile(MutableMatrix *A, M2_bool row_profile)
M2_arrayintOrNull rawLUincremental(M2_arrayintOrNull P, MutableMatrix *LU, const MutableMatrix *v, int i)
void rawMutableMatrixFillRandom(MutableMatrix *M, long nelems)
M2_bool IM2_MutableMatrix_is_equal(const MutableMatrix *M, const MutableMatrix *N)
M2_bool rawSVD(MutableMatrix *A, MutableMatrix *Sigma, MutableMatrix *U, MutableMatrix *VT, M2_bool use_divide_and_conquer)
M2_bool IM2_MutableMatrix_column_operation(MutableMatrix *M, int i, const RingElement *r, int j, M2_bool opposite_mult)
MutableMatrix * IM2_MutableMatrix_identity(const Ring *R, int n, M2_bool is_dense)
M2_bool IM2_MutableMatrix_row_swap(MutableMatrix *M, int i, int j)
engine_RawRingElementArrayArrayOrNull IM2_MutableMatrix_get_entries(const MutableMatrix *M)
unsigned int rawMutableMatrixHash(const MutableMatrix *M)
M2_arrayintOrNull rawLU(const MutableMatrix *A, MutableMatrix *L, MutableMatrix *U)
M2_bool IM2_MutableMatrix_row_permute(MutableMatrix *M, int start, M2_arrayint perm)
M2_bool IM2_MutableMatrix_column_2by2(MutableMatrix *M, int c1, int c2, const RingElement *a1, const RingElement *a2, const RingElement *b1, const RingElement *b2, M2_bool opposite_mult)
void rawMutableMatrixFillRandomDensity(MutableMatrix *M, double density, int special_type)
M2_arrayintOrNull IM2_FF_LU(MutableMatrix *M)
gmp_RRorNull rawRingElementNorm(gmp_RR p, const RingElement *f)
int IM2_MutableMatrix_n_cols(const MutableMatrix *M)
MutableMatrix * IM2_MutableMatrix_from_matrix(const Matrix *M, M2_bool is_dense)
MutableMatrix * rawMutableMatrixTranspose(MutableMatrix *M)
M2_bool IM2_MutableMatrix_delete_rows(MutableMatrix *M, int i, int j)
M2_bool rawEigenvectors(MutableMatrix *A, MutableMatrix *eigenvalues, MutableMatrix *eigenvectors, M2_bool is_symm_or_hermitian)
const RingElement * IM2_Matrix_dot_product(const MutableMatrix *M, int c1, int c2)
MutableMatrix * rawLinAlgSolve(const MutableMatrix *A, const MutableMatrix *B, int *success)
Engine-boundary C API for the engine's in-place MutableMatrix, including dense linear algebra.
bool ntl_LLL(MutableMatrix *M, MutableMatrix *U, long numer, long denom, int strategy)
Engine bridge into NTL — type conversions and the NTL-backed LLL entry point.
int32_t rawRandomInt(int32_t max)
Engine-boundary C API for the engine's PRNG and rational / real / complex random draws.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
Ring — the legacy abstract base class for every coefficient and polynomial ring.
ring_elem — the universal value type carried by every Ring* in the engine.
std::vector< T > M2_arrayint_to_stdvector(M2_arrayint arr)
Conversion helpers between M2 boundary types and standard C++ containers.