void zzn2_div2(_MIPD_ zzn2 *w) { #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return; MR_IN(173) nres_div2(_MIPP_ w->a,w->a); nres_div2(_MIPP_ w->b,w->b); MR_OUT }
BOOL zzn2_sqrt(_MIPD_ zzn2 *u,zzn2 *w) { /* sqrt(a+ib) = sqrt(a+sqrt(a*a-n*b*b)/2)+ib/(2*sqrt(a+sqrt(a*a-n*b*b)/2)) where i*i=n */ #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return FALSE; zzn2_copy(u,w); if (zzn2_iszero(w)) return TRUE; MR_IN(204) if (size(w->b)==0) { if (!nres_sqroot(_MIPP_ w->a,mr_mip->w15)) { nres_negate(_MIPP_ w->a,w->b); zero(w->a); if (mr_mip->qnr==-2) nres_div2(_MIPP_ w->b,w->b); nres_sqroot(_MIPP_ w->b,w->b); } else copy(mr_mip->w15,w->a); MR_OUT return TRUE; } if (mr_mip->qnr==-1 && size(w->a)==0) { nres_div2(_MIPP_ w->b,w->b); if (nres_sqroot(_MIPP_ w->b,mr_mip->w15)) { copy(mr_mip->w15,w->b); copy(w->b,w->a); } else { nres_negate(_MIPP_ w->b,w->b); nres_sqroot(_MIPP_ w->b,w->b); nres_negate(_MIPP_ w->b,w->a); } MR_OUT return TRUE; }
void zzn2_div2(_MIPD_ zzn2 *w) { #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return; MR_IN(173) #ifdef P64_1271 moddiv2(w->a->w); w->a->len=2; moddiv2(w->b->w); w->b->len=2; #else nres_div2(_MIPP_ w->a,w->a); nres_div2(_MIPP_ w->b,w->b); #endif MR_OUT }
ZZn& ZZn::operator/=(int i) { if (i==1) return *this; if (i==2) { // make a special effort... modulus is odd nres_div2(fn,fn); return *this; } ZZn x=i; nres_moddiv(fn,x.fn,fn); return *this; }
void zzn2_txd(_MIPD_ zzn2 *u) { /* divide w by t^2 where x^2-t is irreducible polynomial for ZZn4 for p=5 mod 8 t=sqrt(sqrt(-2)), qnr=-2 for p=3 mod 8 t=sqrt(1+sqrt(-1)), qnr=-1 for p=7 mod 8 and p=2,3 mod 5 t=sqrt(2+sqrt(-1)), qnr=-1 */ zzn2 t; #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (mr_mip->ERNUM) return; MR_IN(197) t.a=mr_mip->w3; t.b=mr_mip->w4; switch (mr_mip->pmod8) { case 5: copy(u->b,t.a); nres_div2(_MIPP_ u->a,t.b); nres_negate(_MIPP_ t.b,t.b); zzn2_copy(&t,u); break; case 3: nres_modadd(_MIPP_ u->a,u->b,t.a); nres_modsub(_MIPP_ u->b,u->a,t.b); zzn2_div2(_MIPP_ &t); zzn2_copy(&t,u); break; case 7: nres_modadd(_MIPP_ u->a,u->a,t.a); nres_modadd(_MIPP_ t.a,u->b,t.a); nres_modadd(_MIPP_ u->b,u->b,t.b); nres_modsub(_MIPP_ t.b,u->a,t.b); zzn2_div5(_MIPP_ &t); zzn2_copy(&t,u); /* nres_modadd(_MIPP_ u->a,u->b,t.a); nres_modadd(_MIPP_ t.a,u->b,t.a); nres_modsub(_MIPP_ u->b,u->a,t.b); zzn2_div3(_MIPP_ &t); zzn2_copy(&t,u); */ break; default: break; } MR_OUT }