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>
41 #include <m4rie/blm.h>
86 for(
int i=0; i<A->
depth; i++)
87 A->
x[i] = mzd_init(m,n);
122 if (new_depth < A->depth) {
123 for(
unsigned int i=new_depth; i<A->
depth; i++) {
128 for(
unsigned int i=A->
depth; i<new_depth; i++) {
132 A->
depth = new_depth;
146 for(
int i=0; i<A->
depth; i++)
148 #if __M4RI_USE_MM_MALLOC
168 for(
int i=0; i<A->
depth; i++) {
169 mzd_copy(B->
x[i],A->
x[i]);
188 for(
int i=0; i<A->
depth; i++) {
189 ret |= mzd_read_bit(A->
x[i], row, col)<<i;
208 for(
int i=0; i<A->
depth; i++) {
209 __mzd_xor_bits(A->
x[i], row, col, 1, elem&1);
228 for(
int i=0; i<A->
depth; i++) {
229 mzd_write_bit(A->
x[i], row, col, elem&1);
251 for(
int i=0; i<A->
depth; i++)
252 r |= mzd_cmp(A->
x[i],B->
x[i]);
265 for(
int i=0; i<A->
depth; i++) {
266 if (!mzd_is_zero(A->
x[i]))
283 for(
int i=0; i<A->
depth; i++) {
284 mzd_row_swap(A->
x[i], rowa, rowb);
302 for(
int ii=0; ii<A->
depth; ii++)
303 mzd_copy_row(B->
x[ii], i, A->
x[ii], j);
317 for(
int i=0; i<A->
depth; i++)
318 mzd_col_swap(A->
x[i], cola, colb);
333 mzd_col_swap_in_rows(A->
x[e], cola, colb, start_row, stop_row);
351 for(
int i=0; i<A->
depth; i++)
352 mzd_row_add(A->
x[i], sourcerow, destrow);
375 for(
int i=0; i<A->
depth; i++)
376 _mzd_compress_l(A->
x[i], r1, n1, r2);
401 for(
int i=0; i<A->
depth; i++) {
402 mzd_concat(C->
x[i], A->
x[i], B->
x[i]);
428 for(
int i=0; i<A->
depth; i++) {
429 mzd_stack(C->
x[i], A->
x[i], B->
x[i]);
448 const size_t lowr,
const size_t lowc,
const size_t highr,
const size_t highc) {
452 for(
int i=0; i<A->
depth; i++) {
453 mzd_submatrix(S->
x[i], A->
x[i], lowr, lowc, highr, highc);
481 const size_t lowr,
const size_t lowc,
482 const size_t highr,
const size_t highc) {
486 B->
nrows = highr - lowr;
487 B->
ncols = highc - lowc;
488 for(
int i=0; i<A->
depth; i++) {
489 B->
x[i] = mzd_init_window(A->
x[i], lowr, lowc, highr, highc);
503 for(
int i=0; i<A->
depth; i++) {
504 mzd_free_window(A->
x[i]);
520 _mzd_ptr_add(C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x, A->
depth);
539 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);
544 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);
562 #define mzd_slice_sub mzd_slice_add
574 #define _mzd_slice_sub _mzd_slice_add
629 case 3: _mzd_ptr_addmul_karatsuba3(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
630 case 4: _mzd_ptr_addmul_karatsuba4(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
631 case 5: _mzd_ptr_addmul_karatsuba5(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
632 case 6: _mzd_ptr_addmul_karatsuba6(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
633 case 7: _mzd_ptr_addmul_karatsuba7(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
634 case 8: _mzd_ptr_addmul_karatsuba8(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
635 case 9: _mzd_ptr_addmul_karatsuba9(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
636 case 10: _mzd_ptr_addmul_karatsuba10(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
637 case 11: _mzd_ptr_addmul_karatsuba11(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
638 case 12: _mzd_ptr_addmul_karatsuba12(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
639 case 13: _mzd_ptr_addmul_karatsuba13(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
640 case 14: _mzd_ptr_addmul_karatsuba14(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
641 case 15: _mzd_ptr_addmul_karatsuba15(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
642 case 16: _mzd_ptr_addmul_karatsuba16(A->
finite_field, C->
x, (
const mzd_t**)A->
x, (
const mzd_t**)B->
x);
break;
663 m4ri_die(
"mzd_slice_mul_karatsuba: rows, columns and fields must match.\n");
666 m4ri_die(
"mzd_slice_mul_karatsuba: rows and columns of returned matrix must match.\n");
687 m4ri_die(
"mzd_slice_addmul_karatsuba: rows, columns and fields must match.\n");
689 m4ri_die(
"mzd_slice_addmul_karatsuba: rows and columns of returned matrix must match.\n");
715 m4ri_die(
"degrees > 16 unsupported.\n");
746 m4ri_die(
"mzd_slice_mul_karatsuba: rows, columns and fields must match.\n");
749 m4ri_die(
"mzd_slice_mul_karatsuba: rows and columns of returned matrix must match.\n");
771 m4ri_die(
"mzd_slice_addmul_karatsuba: rows, columns and fields must match.\n");
773 m4ri_die(
"mzd_slice_addmul_karatsuba: rows and columns of returned matrix must match.\n");
849 for(
int i=0; i<A->
depth; i++)
850 mzd_randomize(A->
x[i]);
863 #endif //M4RIE_MZD_SLICE
static void mzd_slice_copy_row(mzd_slice_t *B, size_t i, const mzd_slice_t *A, size_t j)
copy row j from A to row i from B.
Definition: mzd_slice.h:301
mzd_slice_t * _mzd_slice_addmul_naive(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
using quadratic polynomial multiplication with matrix coefficients.
Definition: mzd_slice.c:82
void mzd_slice_print(const mzd_slice_t *A)
Print a matrix to stdout.
Definition: mzd_slice.c:63
static word mzd_slice_read_elem(const mzd_slice_t *A, const rci_t row, const rci_t col)
Get the element at position (row,col) from the matrix A.
Definition: mzd_slice.h:186
Bilinear Maps on Matrices over GF(2).
Definition: blm.h:51
static void mzd_slice_add_elem(mzd_slice_t *A, const rci_t row, const rci_t col, word elem)
At the element elem to the element at position (row,col) in the matrix A.
Definition: mzd_slice.h:207
static mzd_slice_t * mzd_slice_mul(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
.
Definition: mzd_slice.h:818
static mzd_slice_t * mzd_slice_stack(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
Stack A on top of B and write the result to C.
Definition: mzd_slice.h:424
static void mzd_slice_row_swap(mzd_slice_t *A, const rci_t rowa, const rci_t rowb)
Swap the two rows rowa and rowb.
Definition: mzd_slice.h:282
static void mzd_slice_free(mzd_slice_t *A)
Free a matrix created with mzd_slice_init().
Definition: mzd_slice.h:145
int deg_t
Definition: gf2x.h:37
blm_t * blm_init_crt(const gf2e *ff, const deg_t f_ncols, const deg_t g_ncols, const int *p, int djb)
Definition: blm.c:487
rci_t nrows
Definition: mzd_slice.h:58
static mzd_slice_t * mzd_slice_mul_blm(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B, blm_t *f)
using bilinear maps over matrices over .
Definition: mzd_slice.h:744
unsigned int depth
Definition: mzd_slice.h:60
deg_t degree
Definition: gf2e.h:51
void mzd_slice_set_ui(mzd_slice_t *A, word value)
Return diagonal matrix with value on the diagonal.
Definition: mzd_slice.c:57
rci_t ncols
Definition: mzd_slice.h:59
#define M4RIE_MAX_DEGREE
maximal supported degree
Definition: gf2e.h:38
static mzd_slice_t * mzd_slice_addmul_karatsuba(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
using Karatsuba multiplication of polynomials over matrices over .
Definition: mzd_slice.h:684
static mzd_slice_t * mzd_slice_concat(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
Concatenate B to A and write the result to C.
Definition: mzd_slice.h:397
static int mzd_slice_cmp(mzd_slice_t *A, mzd_slice_t *B)
Return -1,0,1 if if A < B, A == B or A > B respectively.
Definition: mzd_slice.h:247
static void _mzd_ptr_apply_blm(mzd_t **X, const mzd_t **A, const mzd_t **B, const blm_t *f)
Apply f on A and B, writing to X.
Definition: blm.h:153
static void mzd_slice_col_swap_in_rows(mzd_slice_t *A, const rci_t cola, const rci_t colb, const rci_t start_row, rci_t stop_row)
Swap the two columns cola and colb but only between start_row and stop_row.
Definition: mzd_slice.h:331
void blm_free(blm_t *f)
Definition: blm.c:611
static mzd_slice_t * _mzd_slice_add(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
.
Definition: mzd_slice.h:519
mzd_slice_t * mzd_slice_addmul_scalar(mzd_slice_t *C, const word a, const mzd_slice_t *B)
.
Definition: mzd_slice.c:43
static void mzd_slice_randomize(mzd_slice_t *A)
Fill matrix A with random elements.
Definition: mzd_slice.h:848
static int mzd_slice_is_zero(const mzd_slice_t *A)
Zero test for matrix.
Definition: mzd_slice.h:264
static void mzd_slice_col_swap(mzd_slice_t *A, const rci_t cola, const rci_t colb)
Swap the two columns cola and colb.
Definition: mzd_slice.h:316
static void mzd_slice_row_add(mzd_slice_t *A, const rci_t sourcerow, const rci_t destrow)
Add the rows sourcerow and destrow and stores the total in the row destrow.
Definition: mzd_slice.h:350
mzd_t * x[16]
Definition: mzd_slice.h:57
static mzd_slice_t * mzd_slice_submatrix(mzd_slice_t *S, const mzd_slice_t *A, const size_t lowr, const size_t lowc, const size_t highr, const size_t highc)
Copy a submatrix.
Definition: mzd_slice.h:447
static mzd_slice_t * mzd_slice_mul_karatsuba(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
using Karatsuba multiplication of polynomials over matrices over .
Definition: mzd_slice.h:661
static void mzd_slice_free_window(mzd_slice_t *A)
Free a matrix window created with mzd_slice_init_window().
Definition: mzd_slice.h:502
static mzd_slice_t * mzd_slice_init(const gf2e *ff, const rci_t m, const rci_t n)
Create a new matrix of dimension over ff.
Definition: mzd_slice.h:78
static mzd_slice_t * mzd_slice_init_window(const mzd_slice_t *A, const size_t lowr, const size_t lowc, const size_t highr, const size_t highc)
Create a window/view into the matrix M.
Definition: mzd_slice.h:480
static void mzd_slice_write_elem(mzd_slice_t *A, const rci_t row, const rci_t col, word elem)
Write the element elem to the position (row,col) in the matrix A.
Definition: mzd_slice.h:227
void _mzd_ptr_addmul_karatsuba2(const gf2e *ff, mzd_t **X, const mzd_t **A, const mzd_t **B)
over using 3 multiplications over and 2 temporary matrices.
Definition: karatsuba.c:4
static mzd_slice_t * mzd_slice_add(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
.
Definition: mzd_slice.h:537
static mzd_slice_t * _mzd_slice_addmul_karatsuba(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
using Karatsuba multiplication of polynomials over matrices over .
Definition: mzd_slice.h:624
static mzd_slice_t * mzd_slice_copy(mzd_slice_t *B, const mzd_slice_t *A)
copy A to B
Definition: mzd_slice.h:164
Dense matrices over represented as slices of matrices over .
Definition: mzd_slice.h:56
static void _mzd_slice_compress_l(mzd_slice_t *A, const rci_t r1, const rci_t n1, const rci_t r2)
Move the submatrix L of rank r2 starting at column n1 to the left to column r1.
Definition: mzd_slice.h:374
mzd_slice_t * mzd_slice_mul_scalar(mzd_slice_t *C, const word a, const mzd_slice_t *B)
.
Definition: mzd_slice.c:25
static mzd_slice_t * _mzd_slice_adapt_depth(mzd_slice_t *A, const unsigned int new_depth)
Extend or truncate the depth of A to depth new_depth.
Definition: mzd_slice.h:119
static mzd_slice_t * mzd_slice_addmul_blm(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B, blm_t *f)
using bilinear maps over matrices over .
Definition: mzd_slice.h:768
static mzd_slice_t * mzd_slice_addmul(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B)
.
Definition: mzd_slice.h:834
const gf2e * finite_field
Definition: mzd_slice.h:62
static mzd_slice_t * _mzd_slice_mul_blm(mzd_slice_t *C, const mzd_slice_t *A, const mzd_slice_t *B, blm_t *f)
using bilinear maps over matrices over .
Definition: mzd_slice.h:706