1 #ifndef M4RIE_MZD_PTR_H
2 #define M4RIE_MZD_PTR_H
24 #include <m4rie/gf2e.h>
38 static inline void _mzd_ptr_add_modred(
const gf2e *ff,
const mzd_t *A, mzd_t **X,
const int t) {
42 if ((ff==NULL) || (t < ff->degree)) {
43 mzd_add(X[t], X[t], A);
49 for(
int i=0; i<ff->
degree; i++) {
64 static inline mzd_t *_mzd_ptr_add_to_all(
const gf2e *ff, mzd_t *A, mzd_t **X,
const int n, ...) {
66 va_start( b_list, n );
69 for(
int i = 0 ; i < n; i++ ) {
70 int t = va_arg(b_list,
int);
71 _mzd_ptr_add_modred(ff, A, X, t);
74 for(
int i = 0 ; i < n; i++ ) {
75 int t = va_arg(b_list,
int);
76 mzd_add(X[t], X[t], A);
83 static inline void _mzd_ptr_add(mzd_t **c,
const mzd_t **a,
const mzd_t **b,
const deg_t length) {
85 case 32: mzd_add(c[31], a[31], b[31]);
86 case 31: mzd_add(c[30], a[30], b[30]);
87 case 30: mzd_add(c[29], a[29], b[29]);
88 case 29: mzd_add(c[28], a[28], b[28]);
89 case 28: mzd_add(c[27], a[27], b[27]);
90 case 27: mzd_add(c[26], a[26], b[26]);
91 case 26: mzd_add(c[25], a[25], b[25]);
92 case 25: mzd_add(c[24], a[24], b[24]);
93 case 24: mzd_add(c[23], a[23], b[23]);
94 case 23: mzd_add(c[22], a[22], b[22]);
95 case 22: mzd_add(c[21], a[21], b[21]);
96 case 21: mzd_add(c[20], a[20], b[20]);
97 case 20: mzd_add(c[19], a[19], b[19]);
98 case 19: mzd_add(c[18], a[18], b[18]);
99 case 18: mzd_add(c[17], a[17], b[17]);
100 case 17: mzd_add(c[16], a[16], b[16]);
101 case 16: mzd_add(c[15], a[15], b[15]);
102 case 15: mzd_add(c[14], a[14], b[14]);
103 case 14: mzd_add(c[13], a[13], b[13]);
104 case 13: mzd_add(c[12], a[12], b[12]);
105 case 12: mzd_add(c[11], a[11], b[11]);
106 case 11: mzd_add(c[10], a[10], b[10]);
107 case 10: mzd_add(c[ 9], a[ 9], b[ 9]);
108 case 9: mzd_add(c[ 8], a[ 8], b[ 8]);
109 case 8: mzd_add(c[ 7], a[ 7], b[ 7]);
110 case 7: mzd_add(c[ 6], a[ 6], b[ 6]);
111 case 6: mzd_add(c[ 5], a[ 5], b[ 5]);
112 case 5: mzd_add(c[ 4], a[ 4], b[ 4]);
113 case 4: mzd_add(c[ 3], a[ 3], b[ 3]);
114 case 3: mzd_add(c[ 2], a[ 2], b[ 2]);
115 case 2: mzd_add(c[ 1], a[ 1], b[ 1]);
116 case 1: mzd_add(c[ 0], a[ 0], b[ 0]);
120 for(
deg_t i=0; i<length; i++)
121 mzd_add(c[ i], a[ i], b[ i]);
154 void _mzd_ptr_addmul_karatsuba3(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
160 void _mzd_ptr_addmul_karatsuba4(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
166 void _mzd_ptr_addmul_karatsuba5(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
172 void _mzd_ptr_addmul_karatsuba6(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
178 void _mzd_ptr_addmul_karatsuba7(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
184 void _mzd_ptr_addmul_karatsuba8(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
190 void _mzd_ptr_addmul_karatsuba9(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
196 void _mzd_ptr_addmul_karatsuba10(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
202 void _mzd_ptr_addmul_karatsuba11(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
208 void _mzd_ptr_addmul_karatsuba12(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
214 void _mzd_ptr_addmul_karatsuba13(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
220 void _mzd_ptr_addmul_karatsuba14(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
226 void _mzd_ptr_addmul_karatsuba15(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
232 void _mzd_ptr_addmul_karatsuba16(
const gf2e *ff, mzd_t **X,
const mzd_t **A,
const mzd_t **B);
245 void djb_apply_mzd_ptr(djb_t *m, mzd_t **W,
const mzd_t **V);
247 #endif //M4RIE_MZD_PTR_H
int deg_t
Definition: gf2x.h:37
deg_t degree
Definition: gf2e.h:51
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
word * pow_gen
Definition: gf2e.h:54