Example #1
0
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
}    
Example #2
0
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;
    }
}