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;
}