#include "params.h" #include "swap.h" #include "rq.h" /* caller must ensure that x-y does not overflow */ static int smaller_mask(int x,int y) { return (x - y) >> 31; } static void vectormodq_product(modq *z,int len,const modq *x,const modq c) { int i; for (i = 0;i < len;++i) z[i] = modq_product(x[i],c); } static void vectormodq_minusproduct(modq *z,int len,const modq *x,const modq *y,const modq c) { int i; for (i = 0;i < len;++i) z[i] = modq_minusproduct(x[i],y[i],c); } static void vectormodq_shift(modq *z,int len) { int i; for (i = len - 1;i > 0;--i) z[i] = z[i - 1]; z[0] = 0; } /* r = (3s)^(-1) mod m, returning 0, if s is invertible mod m or returning -1 if s is not invertible mod m r,s are polys of degree

= loops) break; c = modq_quotient(g[p],f[p]); vectormodq_minusproduct(g,p + 1,g,f,c); vectormodq_shift(g,p + 1); #ifdef SIMPLER vectormodq_minusproduct(v,loops + 1,v,u,c); vectormodq_shift(v,loops + 1); #else if (loop < p) { vectormodq_minusproduct(v,loop + 1,v,u,c); vectormodq_shift(v,loop + 2); } else { vectormodq_minusproduct(v + loop - p,p + 1,v + loop - p,u + loop - p,c); vectormodq_shift(v + loop - p,p + 2); } #endif e -= 1; ++loop; swapmask = smaller_mask(e,d) & modq_nonzero_mask(g[p]); swap(&e,&d,sizeof e,swapmask); swap(f,g,(p + 1) * sizeof(modq),swapmask); #ifdef SIMPLER swap(u,v,(loops + 1) * sizeof(modq),swapmask); #else if (loop < p) { swap(u,v,(loop + 1) * sizeof(modq),swapmask); } else { swap(u + loop - p,v + loop - p,(p + 1) * sizeof(modq),swapmask); } #endif } c = modq_reciprocal(f[p]); vectormodq_product(r,p,u + p,c); return smaller_mask(0,d); }