1 #ifndef M4RIE_MZD_POLY_H
2 #define M4RIE_MZD_POLY_H
23 #include <m4ri/m4ri.h>
30 static inline void _poly_add(mzd_t **c,
const mzd_t **a,
const mzd_t **b,
const unsigned int length) {
32 case 16: mzd_add(c[15], a[15], b[15]);
33 case 15: mzd_add(c[14], a[14], b[14]);
34 case 14: mzd_add(c[13], a[13], b[13]);
35 case 13: mzd_add(c[12], a[12], b[12]);
36 case 12: mzd_add(c[11], a[11], b[11]);
37 case 11: mzd_add(c[10], a[10], b[10]);
38 case 10: mzd_add(c[ 9], a[ 9], b[ 9]);
39 case 9: mzd_add(c[ 8], a[ 8], b[ 8]);
40 case 8: mzd_add(c[ 7], a[ 7], b[ 7]);
41 case 7: mzd_add(c[ 6], a[ 6], b[ 6]);
42 case 6: mzd_add(c[ 5], a[ 5], b[ 5]);
43 case 5: mzd_add(c[ 4], a[ 4], b[ 4]);
44 case 4: mzd_add(c[ 3], a[ 3], b[ 3]);
45 case 3: mzd_add(c[ 2], a[ 2], b[ 2]);
46 case 2: mzd_add(c[ 1], a[ 1], b[ 1]);
47 case 1: mzd_add(c[ 0], a[ 0], b[ 0]);
51 for(
unsigned int i=0; i<length; i++)
52 mzd_add(c[ i], a[ i], b[ i]);
56 void _poly_addmul2(mzd_t **X,
const mzd_t **a,
const mzd_t **b);
57 void _poly_addmul4(mzd_t **X,
const mzd_t **a,
const mzd_t **b);
77 _poly_add(C->x+offset, (
const mzd_t**)A->x, (
const mzd_t**)B->x, A->
depth);
83 return _mzd_poly_add(C, A, B, 0);
86 static inline mzd_poly_t *mzd_poly_init(
const deg_t d,
const rci_t m,
const rci_t n) {
88 A->x = (mzd_t**)m4ri_mm_malloc(
sizeof(mzd_t*)*d);
94 for(
int i=0; i<A->
depth; i++)
95 A->x[i] = mzd_init(m,n);
99 static inline void mzd_poly_free(
mzd_poly_t *A) {
100 for(
int i=0; i<A->
depth; i++)
102 #if __M4RI_USE_MM_MALLOC
111 if (new_depth < A->depth) {
112 for(
int i=new_depth; i<A->
depth; i++) {
117 for(
int i=A->
depth; i<new_depth; i++) {
121 A->
depth = new_depth;
125 #endif //M4RIE_MZD_POLY_H