## File: solve.h

package info (click to toggle)
libm4ri 20200125-1
 `123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142` ``````/** * \file solve.h * * \brief System solving with matrix routines. * * \author Jean-Guillaume Dumas * */ #ifndef M4RI_SOLVE_H #define M4RI_SOLVE_H /******************************************************************* * * M4RI: Linear Algebra over GF(2) * * Copyright (C) 2008 Jean-Guillaume.Dumas@imag.fr * * Distributed under the terms of the GNU General Public License (GPL) * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * The full text of the GPL is available at: * * http://www.gnu.org/licenses/ * ********************************************************************/ #include #include /** * \brief Solves A X = B with A and B matrices. * * The solution X is stored inplace on B. * * \param A Input matrix (overwritten). * \param B Input matrix, being overwritten by the solution matrix X * \param cutoff Minimal dimension for Strassen recursion (default: 0). * \param inconsistency_check decide wether or not to perform a check * for incosistency (faster without but output not defined if * system is not consistent). * \return 0 if a solution was found, -1 otherwise */ int mzd_solve_left(mzd_t *A, mzd_t *B, int const cutoff, int const inconsistency_check); /** * \brief Solves (P L U Q) X = B * * A is an input matrix supposed to store both: * \li an upper right triangular matrix U * \li a lower left unitary triangular matrix L. * * The solution X is stored inplace on B * * This version assumes that the matrices are at an even position on * the m4ri_radix grid and that their dimension is a multiple of m4ri_radix. * * \param A Input upper/lower triangular matrices. * \param rank is rank of A. * \param P Input row permutation matrix. * \param Q Input column permutation matrix. * \param B Input matrix, being overwritten by the solution matrix X. * \param cutoff Minimal dimension for Strassen recursion (default: 0). * \param inconsistency_check decide whether or not to perform a check * for incosistency (faster without but output not defined if * system is not consistent). \return 0 if a solution was * found, -1 otherwise * \return 0 if a solution was found, -1 otherwise */ int mzd_pluq_solve_left (mzd_t const *A, rci_t rank, mzp_t const *P, mzp_t const *Q, mzd_t *B, int const cutoff, int const inconsistency_check); /** * \brief Solves (P L U Q) X = B * * A is an input matrix supposed to store both: * \li an upper right triangular matrix U * \li a lower left unitary triangular matrix L. * The solution X is stored inplace on B. * * This version assumes that the matrices are at an even position on * the m4ri_radix grid and that their dimension is a multiple of m4ri_radix. * * \param A Input upper/lower triangular matrices. * \param rank is rank of A. * \param P Input row permutation matrix. * \param Q Input column permutation matrix. * \param B Input matrix, being overwritten by the solution matrix X. * \param cutoff Minimal dimension for Strassen recursion (default: 0). * \param inconsistency_check decide whether or not to perform a check * for incosistency (faster without but output not defined if * system is not consistent). \return 0 if a solution was * found, -1 otherwise * \return 0 if a solution was found, -1 otherwise */ int _mzd_pluq_solve_left(mzd_t const *A, rci_t rank, mzp_t const *P, mzp_t const *Q, mzd_t *B, int const cutoff, int const inconsistency_check); /** * \brief Solves A X = B with A and B matrices. * * The solution X is stored inplace on B. * * This version assumes that the matrices are at an even position on * the m4ri_radix grid and that their dimension is a multiple of m4ri_radix. * * \param A Input matrix (overwritten). * \param B Input matrix, being overwritten by the solution matrix X. * \param cutoff Minimal dimension for Strassen recursion (default: 0). * \param inconsistency_check decide whether or not to perform a check * for incosistency (faster without but output not defined if * system is not consistent). \return 0 if a solution was * found, -1 otherwise * \return 0 if a solution was found, -1 otherwise */ int _mzd_solve_left(mzd_t *A, mzd_t *B, int const cutoff, int const inconsistency_check); /** * \brief Solve X for A X = 0. * * If r is the rank of the nr x nc matrix A, return the nc x (nc-r) * matrix X such that A*X == 0 and that the columns of X are linearly * independent. * * \param A Input matrix (overwritten). * \param cutoff Minimal dimension for Strassen recursion (default: 0). * * \sa mzd_pluq() * * \return X, NULL if kernel is empty */ mzd_t *mzd_kernel_left_pluq(mzd_t *A, int const cutoff); #endif // M4RI_SOLVE_H ``````