int FF_4096_jacobi()

in src/cg21/cg21_utilities.c [1043:1084]


int FF_4096_jacobi(BIG_512_60 a[HFLEN_4096], BIG_512_60 p[HFLEN_4096])
{
    int size = HFLEN_4096;
    int n8;
    int k;
    int m=0;
    BIG_512_60 t[size];
    BIG_512_60 x[size];
    BIG_512_60 n[size];
    BIG_512_60 zilch[size];
    BIG_512_60 one[size];
    FF_4096_init(one,1,size);
    FF_4096_zero(zilch,size);
    if (FF_4096_parity(p)==0 || FF_4096_comp(a,zilch,size)==0 || FF_4096_comp(p,one,size)<=0) return 0;
    FF_4096_norm(a,size);
    FF_4096_copy(x,a,size);
    FF_4096_copy(n,p,size);
    FF_4096_mod(x, p,size);

    while (FF_4096_comp(n,one,size)>0)
    {
        if (FF_4096_comp(x,zilch,size)==0) return 0;
        n8=FF_4096_lastbits(n,3);
        k=0;
        while (FF_4096_parity(x)==0)
        {
            k++;
            FF_4096_shr(x,size);
        }
        if (k%2==1) m+=(n8*n8-1)/8;
        m+=(n8-1)*(FF_4096_lastbits(x,2)-1)/4;
        FF_4096_copy(t,n,size);

        FF_4096_mod(t,x,size);
        FF_4096_copy(n,x, size);
        FF_4096_copy(x,t,size);
        m%=2;

    }
    if (m==0) return 1;
    else return -1;
}