M4RI 1.0.1
brilliantrussian.h
Go to the documentation of this file.
00001 
00014 #ifndef BRILLIANTRUSSIAN_H
00015 #define BRILLIANTRUSSIAN_H
00016  /*******************************************************************
00017  *
00018  *                 M4RI:  Linear Algebra over GF(2)
00019  *
00020  *    Copyright (C) 2007, 2008 Gregory Bard <bard@fordham.edu>
00021  *    Copyright (C) 2008-2010 Martin Albrecht <martinralbrecht@googlemail.com>
00022  *
00023  *  Distributed under the terms of the GNU General Public License (GPL)
00024  *  version 2 or higher.
00025  *
00026  *    This code is distributed in the hope that it will be useful,
00027  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
00028  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00029  *    General Public License for more details.
00030  *
00031  *  The full text of the GPL is available at:
00032  *
00033  *                  http://www.gnu.org/licenses/
00034  *
00035  ********************************************************************/
00036 
00037 #include <math.h>
00038 #include <string.h>
00039 #include <stdlib.h>
00040 
00041 #include "misc.h"
00042 #include "packedmatrix.h"
00043 #include "permutation.h"
00044 
00059 void mzd_make_table( mzd_t *M, size_t r, size_t c, int k, mzd_t *T, size_t *L);
00060 
00079 void mzd_process_rows(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k, mzd_t *T, size_t *L);
00080 
00098 void mzd_process_rows2(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k, mzd_t *T0, size_t *L0, mzd_t *T1, size_t *L1);
00099 
00119 void mzd_process_rows3(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k, 
00120                        mzd_t *T0, size_t *L0, mzd_t *T1, size_t *L1,
00121                        mzd_t *T2, size_t *L2);
00122 
00144 void mzd_process_rows4(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k,
00145                        mzd_t *T0, size_t *L0, mzd_t *T1, size_t *L1,
00146                        mzd_t *T2, size_t *L2, mzd_t *T3, size_t *L3);
00147 
00148 
00172 void mzd_process_rows5(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k,
00173                        mzd_t *T0, size_t *L0, mzd_t *T1, size_t *L1,
00174                        mzd_t *T2, size_t *L2, mzd_t *T3, size_t *L3,
00175                        mzd_t* T4, size_t *L4);
00176 
00202 void mzd_process_rows6(mzd_t *M, size_t startrow, size_t endrow, size_t startcol, int k,
00203                        mzd_t *T0, size_t *L0, mzd_t *T1, size_t *L1,
00204                        mzd_t *T2, size_t *L2, mzd_t *T3, size_t *L3,
00205                        mzd_t* T4, size_t *L4, mzd_t *T5, size_t *L5);
00206 
00231 size_t _mzd_echelonize_m4ri(mzd_t *A, const int full, int k, int heuristic, const double threshold);
00232 
00244 void mzd_top_echelonize_m4ri(mzd_t *M, int k);
00245 
00261 size_t _mzd_top_echelonize_m4ri(mzd_t *A, int k, size_t r, size_t c, size_t max_r);
00262 
00281 mzd_t *mzd_invert_m4ri(mzd_t *M, mzd_t *I, int k);
00282 
00300 mzd_t *mzd_mul_m4rm(mzd_t *C, mzd_t *A, mzd_t *B, int k);
00301 
00302 
00319 mzd_t *mzd_addmul_m4rm(mzd_t *C, mzd_t *A, mzd_t *B, int k);
00320 
00346 mzd_t *_mzd_mul_m4rm(mzd_t *C, mzd_t *A, mzd_t *B, int k, int clear);
00347 
00352 #define M4RM_GRAY8
00353 
00354 #endif //BRILLIANTRUSSIAN_H