void zzn4_inv(_MIPD_ zzn4 *w) { #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif zzn2 t1,t2; if (mr_mip->ERNUM) return; if (w->unitary) { zzn4_conj(_MIPP_ w,w); return; } MR_IN(FUNC_BASE+10) t1.a=mr_mip->w8; t1.b=mr_mip->w9; t2.a=mr_mip->w10; t2.b=mr_mip->w11; zzn2_mul(_MIPP_ &(w->a),&(w->a),&t1); zzn2_mul(_MIPP_ &(w->b),&(w->b),&t2); zzn2_txx(_MIPP_ &t2); zzn2_sub(_MIPP_ &t1,&t2,&t1); zzn2_inv(_MIPP_ &t1); zzn2_mul(_MIPP_ &(w->a),&t1,&(w->a)); zzn2_negate(_MIPP_ &t1,&t1); zzn2_mul(_MIPP_ &(w->b),&t1,&(w->b)); MR_OUT }
void zzn4_inv(_MIPD_ zzn4 *u) { zzn2 t1,t2; if (u->unitary) { zzn4_conj(_MIPP_ u,u); return; } t1.a=mr_mip->w8; t1.b=mr_mip->w9; t2.a=mr_mip->w3; t2.b=mr_mip->w4; zzn2_mul(_MIPP_ &(u->x),&(u->x),&t1); zzn2_mul(_MIPP_ &(u->y),&(u->y),&t2); zzn2_times_irp(_MIPP_ &t2); zzn2_sub(_MIPP_ &t1,&t2,&t1); zzn2_inv(_MIPP_ &t1); zzn2_mul(_MIPP_ &(u->x),&t1,&(u->x)); zzn2_negate(_MIPP_ &t1,&t1); zzn2_mul(_MIPP_ &(u->y),&t1,&(u->y)); }
void zzn4_powu(_MIPD_ zzn4 *x,big k,zzn4 *u) { zzn4 t[5],u2; big k3; int i,j,n,nb,nbw,nzs; #ifndef MR_STATIC char *mem=memalloc(_MIPP_ 25); #else char mem[MR_BIG_RESERVE(25)]; memset(mem,0,MR_BIG_RESERVE(25)); #endif if (size(k)==0) { zzn4_from_int(_MIPP_ 1,u); return; } zzn4_copy(x,u); if (size(k)==1) return; for (j=i=0; i<5; i++) { t[i].x.a=mirvar_mem(_MIPP_ mem,j++); t[i].x.b=mirvar_mem(_MIPP_ mem,j++); t[i].y.a=mirvar_mem(_MIPP_ mem,j++); t[i].y.b=mirvar_mem(_MIPP_ mem,j++); t[i].unitary=FALSE; } u2.x.a=mirvar_mem(_MIPP_ mem,j++); u2.x.b=mirvar_mem(_MIPP_ mem,j++); u2.y.a=mirvar_mem(_MIPP_ mem,j++); u2.y.b=mirvar_mem(_MIPP_ mem,j++); u2.unitary=FALSE; k3=mirvar_mem(_MIPP_ mem,j); premult(_MIPP_ k,3,k3); zzn4_mul(_MIPP_ u,u,&u2); zzn4_copy(u,&t[0]); for (i=1; i<=4; i++) zzn4_mul(_MIPP_ &u2,&t[i-1],&t[i]); nb=logb2(_MIPP_ k3); for (i=nb-2; i>=1;) { n=mr_naf_window(_MIPP_ k,k3,i,&nbw,&nzs,5); for (j=0; j<nbw; j++) zzn4_mul(_MIPP_ u,u,u); if (n>0) zzn4_mul(_MIPP_ u,&t[n/2],u); if (n<0) { zzn4_conj(_MIPP_ &t[-n/2],&u2); zzn4_mul(_MIPP_ u,&u2,u); } i-=nbw; if (nzs) { for (j=0; j<nzs; j++) zzn4_mul(_MIPP_ u,u,u); i-=nzs; } } #ifndef MR_STATIC memkill(_MIPP_ mem,25); #else memset(mem,0,MR_BIG_RESERVE(25)); #endif }