16 #ifndef M4RIE_MZD_SLICE
17 #define M4RIE_MZD_SLICE
38 #include <m4ri/m4ri.h>
39 #include <m4rie/mzd_poly.h>
40 #include <m4rie/mzed.h>
47 #define __M4RIE_MAX_KARATSUBA_DEGREE 8
92 for(
unsigned int i=0; i<A->
depth; i++)
93 A->
x[i] = mzd_init(m,n);
128 if (new_depth < A->depth) {
129 for(
unsigned int i=new_depth; i<A->
depth; i++) {
134 for(
unsigned int i=A->
depth; i<new_depth; i++) {
138 A->
depth = new_depth;
152 for(
unsigned int i=0; i<A->
depth; i++)
154 #if __M4RI_USE_MM_MALLOC
183 for(
unsigned int i=0; i<A->
depth; i++) {
184 mzd_concat(C->
x[i], A->
x[i], B->
x[i]);
210 for(
unsigned int i=0; i<A->
depth; i++) {
211 mzd_stack(C->
x[i], A->
x[i], B->
x[i]);
230 const size_t lowr,
const size_t lowc,
const size_t highr,
const size_t highc) {
234 for(
unsigned int i=0; i<A->
depth; i++) {
235 mzd_submatrix(S->
x[i], A->
x[i], lowr, lowc, highr, highc);
263 const size_t lowr,
const size_t lowc,
264 const size_t highr,
const size_t highc) {
268 B->
nrows = highr - lowr;
269 B->
ncols = highc - lowc;
270 for(
unsigned int i=0; i<A->
depth; i++) {
271 B->
x[i] = mzd_init_window(A->
x[i], lowr, lowc, highr, highc);
285 for(
unsigned int i=0; i<A->
depth; i++) {
286 mzd_free_window(A->
x[i]);
302 _poly_add(C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x, A->
depth);
321 m4ri_die(
"mzd_slice_add: input matrices A (%d x %d) and B (%d x %d) do not match.\n",A->
nrows,A->
ncols, B->
nrows,B->
ncols);
326 m4ri_die(
"mzd_slice_add: input matrix A (%d x %d) and output matrix (%d x %d) do not match.\n",A->
nrows,A->
ncols, C->
nrows, C->
ncols);
344 #define mzd_slice_sub mzd_slice_add
356 #define _mzd_slice_sub _mzd_slice_add
531 m4ri_die(
"_mzd_slice_mul_karatsuba: only implemented for GF(2^e) with e <= 4");
550 m4ri_die(
"mzd_slice_mul_karatsuba: rows, columns and fields must match.\n");
553 m4ri_die(
"mzd_slice_mul_karatsuba: rows and columns of returned matrix must match.\n");
574 m4ri_die(
"mzd_slice_addmul_karatsuba: rows, columns and fields must match.\n");
576 m4ri_die(
"mzd_slice_addmul_karatsuba: rows and columns of returned matrix must match.\n");
649 case 10: mzd_randomize(A->
x[9]);
650 case 9: mzd_randomize(A->
x[8]);
651 case 8: mzd_randomize(A->
x[7]);
652 case 7: mzd_randomize(A->
x[6]);
653 case 6: mzd_randomize(A->
x[5]);
654 case 5: mzd_randomize(A->
x[4]);
655 case 4: mzd_randomize(A->
x[3]);
656 case 3: mzd_randomize(A->
x[2]);
657 case 2: mzd_randomize(A->
x[1]);
658 case 1: mzd_randomize(A->
x[0]);
break;
660 m4ri_die(
"impossible");
677 for(
unsigned int i=0; i<A->
depth; i++) {
678 mzd_copy(B->
x[i],A->
x[i]);
697 for(
unsigned int i=0; i<A->
depth; i++) {
698 ret |= mzd_read_bit(A->
x[i], row, col)<<i;
717 for(
unsigned int i=0; i<A->
depth; i++) {
718 __mzd_xor_bits(A->
x[i], row, col, 1, elem&1);
737 for(
unsigned int i=0; i<A->
depth; i++) {
738 mzd_write_bit(A->
x[i], row, col, elem&1);
760 for(
unsigned int i=0; i<A->
depth; i++)
761 r |= mzd_cmp(A->
x[i],B->
x[i]);
774 for(
unsigned int i=0; i<A->
depth; i++) {
775 if (!mzd_is_zero(A->
x[i]))
792 for(
unsigned int i=0; i<A->
depth; i++) {
793 mzd_row_swap(A->
x[i], rowa, rowb);
812 for(
unsigned int ii=0; ii<A->
depth; ii++)
813 mzd_copy_row(B->
x[ii], i, A->
x[ii], j);
827 for(
unsigned int i=0; i<A->
depth; i++)
828 mzd_col_swap(A->
x[i], cola, colb);
843 mzd_col_swap_in_rows(A->
x[e], cola, colb, start_row, stop_row);
861 for(
unsigned int i=0; i<A->
depth; i++)
862 mzd_row_add(A->
x[i], sourcerow, destrow);
876 for(
unsigned int i=0; i<A->
depth; i++)
877 mzd_row_clear_offset(A->
x[i], row, coloffset);
901 case 10: _mzd_compress_l(A->
x[9], r1, n1, r2);
902 case 9: _mzd_compress_l(A->
x[8], r1, n1, r2);
903 case 8: _mzd_compress_l(A->
x[7], r1, n1, r2);
904 case 7: _mzd_compress_l(A->
x[6], r1, n1, r2);
905 case 6: _mzd_compress_l(A->
x[5], r1, n1, r2);
906 case 5: _mzd_compress_l(A->
x[4], r1, n1, r2);
907 case 4: _mzd_compress_l(A->
x[3], r1, n1, r2);
908 case 3: _mzd_compress_l(A->
x[2], r1, n1, r2);
909 case 2: _mzd_compress_l(A->
x[1], r1, n1, r2);
910 case 1: _mzd_compress_l(A->
x[0], r1, n1, r2);
break;
912 m4ri_die(
"impossible");
916 #endif //M4RIE_MZD_SLICE