void zzn4_sqr(_MIPD_ zzn4 *x,zzn4 *w) { #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif zzn2 t1,t2; if (mr_mip->ERNUM) return; MR_IN(FUNC_BASE+8) t1.a=mr_mip->w10; t1.b=mr_mip->w11; t2.a=mr_mip->w8; t2.b=mr_mip->w9; zzn4_copy(x,w); if (x->unitary) { /* this is a lot faster.. - see Lenstra & Stam */ zzn2_mul(_MIPP_ &(w->b),&(w->b),&t1); zzn2_add(_MIPP_ &(w->b),&(w->a),&(w->b)); zzn2_mul(_MIPP_ &(w->b),&(w->b),&(w->b)); zzn2_sub(_MIPP_ &(w->b),&t1,&(w->b)); zzn2_txx(_MIPP_ &t1); zzn2_copy(&t1,&(w->a)); zzn2_sub(_MIPP_ &(w->b),&(w->a),&(w->b)); zzn2_add(_MIPP_ &(w->a),&(w->a),&(w->a)); zzn2_sadd(_MIPP_ &(w->a),mr_mip->one,&(w->a)); zzn2_ssub(_MIPP_ &(w->b),mr_mip->one,&(w->b)); } else { zzn2_copy(&(w->b),&t2); // t2=b; zzn2_add(_MIPP_ &(w->a),&t2,&t1); // t1=a+b zzn2_txx(_MIPP_ &t2); zzn2_add(_MIPP_ &t2,&(w->a),&t2); // t2=a+txx(b) zzn2_mul(_MIPP_ &(w->b),&(w->a),&(w->b)); // b*=a zzn2_mul(_MIPP_ &t1,&t2,&(w->a)); // a=t1*t2 zzn2_copy(&(w->b),&t2); //t2=b zzn2_sub(_MIPP_ &(w->a),&t2,&(w->a)); //a-=b zzn2_txx(_MIPP_ &t2); // t2=txx(b) zzn2_sub(_MIPP_ &(w->a),&t2,&(w->a)); // a-=txx(b); zzn2_add(_MIPP_ &(w->b),&(w->b),&(w->b)); // b+=b; } MR_OUT }
void zzn4_mul(_MIPD_ zzn4 *u,zzn4 *v,zzn4 *w) { zzn2 t1,t2,t3; t1.a=mr_mip->w3; t1.b=mr_mip->w4; t2.a=mr_mip->w8; t2.b=mr_mip->w9; if (u==v) { if (u->unitary) { /* this is faster.. - see Lenstra & Stam */ zzn4_copy(u,w); zzn2_mul(_MIPP_ &(w->y),&(w->y),&t1); zzn2_add(_MIPP_ &(w->y),&(w->x),&(w->y)); zzn2_mul(_MIPP_ &(w->y),&(w->y),&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t1,&(w->y)); zzn2_timesi(_MIPP_ &t1); zzn2_copy(&t1,&(w->x)); zzn2_sub(_MIPP_ &(w->y),&(w->x),&(w->y)); zzn2_add(_MIPP_ &(w->x),&(w->x),&(w->x)); zzn2_sadd(_MIPP_ &(w->x),mr_mip->one,&(w->x)); zzn2_ssub(_MIPP_ &(w->y),mr_mip->one,&(w->y)); } else { zzn4_copy(u,w); zzn2_copy(&(w->y),&t2); // t2=b; zzn2_add(_MIPP_ &(w->x),&t2,&t1); // t1=a+b zzn2_times_irp(_MIPP_ &t2); // t2=txx(b); zzn2_add(_MIPP_ &t2,&(w->x),&t2); // t2=a+txx(b) zzn2_mul(_MIPP_ &(w->y),&(w->x),&(w->y)); // b*=a zzn2_mul(_MIPP_ &t1,&t2,&(w->x)); // a=t1*t2 zzn2_copy(&(w->y),&t2); //t2=b zzn2_sub(_MIPP_ &(w->x),&t2,&(w->x)); //a-=b zzn2_times_irp(_MIPP_ &t2); // t2=txx(b) zzn2_sub(_MIPP_ &(w->x),&t2,&(w->x)); // a-=txx(b); zzn2_add(_MIPP_ &(w->y),&(w->y),&(w->y)); // b+=b; } } else { t3.a=mr_mip->w10; t3.b=mr_mip->w11; zzn2_copy(&(u->x),&t1); zzn2_copy(&(u->y),&t2); zzn2_mul(_MIPP_ &t1,&(v->x),&t1); zzn2_mul(_MIPP_ &t2,&(v->y),&t2); zzn2_copy(&(v->x),&t3); zzn2_add(_MIPP_ &t3,&(v->y),&t3); zzn2_add(_MIPP_ &(u->y),&(u->x),&(w->y)); zzn2_mul(_MIPP_ &(w->y),&t3,&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t1,&(w->y)); zzn2_sub(_MIPP_ &(w->y),&t2,&(w->y)); zzn2_copy(&t1,&(w->x)); zzn2_times_irp(_MIPP_ &t2); zzn2_add(_MIPP_ &(w->x),&t2,&(w->x)); if (u->unitary && v->unitary) w->unitary=TRUE; else w->unitary=FALSE; } }