test_power2() { //GF2m b(4); GF2m* b; for (int i=3;i< 50;i++) { b = new GF2m(i); b->SetPrimitive(); power2(*b,b->BitLength); // b.Square(); dec(*b); printf("\nm=%i b = %062s",i, b->Print(FMT_BIN, buf1)); delete b; } /*b.SetPrimitive(); power2(b,b.BitLength); // b.Square(); b--; printf("\n b = %032s", b.Print(FMT_BIN, buf1));*/ }
void power2(GF2m& a, uint32 b) { uint32 j = 0; uint32 i = 1 << 31; while ((b & i) == 0) { i = i >> 1; if (i == 0) return; } b = b ^ i; power2(a,b); j = 0; while (i != 0) { j++; i = i >> 1; } j--; i = 1; for (uint32 i1 = 0; i1< j; i1++) { i = i*2; } j = i; //j = 2 << j; for (uint32 j1 = 0; j1 < j; j1++) { a.Square(); } }
void reduce(const Poly2& p,Poly2Mod& rem) { int m,d; GF2m t; big *G; term2 *ptr,*pos=NULL; int n=degree(p); int degm=degree(Modulus); if (n-degm < KARAT_BREAK_EVEN) { rem=(Poly2Mod)p; return; } G=(big *)mr_alloc(2*(N+2),sizeof(big)); ptr=p.start; while (ptr!=NULL) { G[ptr->n]=getbig(ptr->an); ptr=ptr->next; } karmul2_poly(N,T,GRF,&G[N],W); // W=(G/x^n) * h for (d=N-1;d<2*N;d++) copy(W[d],Q[d-N+1]); m=N+1; if(m%2==1) m=N+2; // make sure m is even - pad if necessary for (d=m;d<2*m;d++) copy(G[d],W[d]); karmul2_poly_upper(m,T,GF,Q,W); pos=NULL; rem.clear(); for (d=N-1;d>=0;d--) { add2(W[d],G[d],W[d]); t=W[d]; if (t.iszero()) continue; pos=rem.addterm(t,d,pos); } mr_free(G); }
int cmp(const GF2m& a, const uint32 small_number) { // return 0 - equal; 1 - non equal //if (a.BitLength > 32) CRASH("fields size mismatch"); uint32* pn = a.n; if (a.GetHighInt32() == 0) { if (pn[0] == small_number) return 0; } return 1; }
int cmp(const GF2m& a, const GF2m& b) { // return 0 - equal; 1 - non equal if (a.BitLength > b.BitLength) CRASH("fields sizes are not equal"); uint32* pn1 = a.n; uint32* pn2 = b.n; for (int32 i=a.GetInt32Length(); i >= 0; i--) { if (pn1[i] != pn2[i]) return 1; } return 0; }
void SearchF() { GF2m* a; GF2m* b; for (int i=3;i< 50;i++) { a = new GF2m(i); b = new GF2m(i); a->SetOne(); b->SetPrimitive(); a->Inverse(); //dec(*a); printf("\nm=%i inverse() = %050s",i, a->Print(FMT_BIN, buf1)); power2(*b,b->BitLength); // b.Square(); dec(*b); printf("\nm=%i ^2^m-1 = %050s",i, b->Print(FMT_BIN, buf1)); printf("\n"); delete b; delete a; } { i = 167; a = new GF2m(i); b = new GF2m(i); a->SetOne(); b->SetPrimitive(); a->Inverse(); //dec(*a); printf("\nm=%i inverse() = %050s",i, a->Print(FMT_BIN, buf1)); power2(*b,b->BitLength); // b.Square(); dec(*b); printf("\nm=%i ^2^m-1 = %050s",i, b->Print(FMT_BIN, buf1)); printf("\n"); delete b; delete a; } }
Poly2 operator*(const Poly2& a,const Poly2& b) { int i,d,dega,degb,deg; GF2m t; Poly2 prod; term2 *iptr,*pos; term2 *ptr=b.start; if (&a==&b) { // squaring - only diagonal terms count! pos=NULL; while (ptr!=NULL) { // diagonal terms pos=prod.addterm(ptr->an*ptr->an,ptr->n+ptr->n,pos); ptr=ptr->next; } return prod; } dega=degree(a); deg=dega; degb=degree(b); if (degb<dega) deg=degb; // deg is smallest if (deg>=KARAT_BREAK_EVEN) { // use fast method int len,m,inc; big *A,*B,*C,*T; deg=dega; if (dega<degb) deg=degb; // deg is biggest m=deg; inc=1; while (m!=0) { m/=2; inc++; } len=2*(deg+inc); A=(big *)mr_alloc(deg+1,sizeof(big)); B=(big *)mr_alloc(deg+1,sizeof(big)); C=(big *)mr_alloc(len,sizeof(big)); T=(big *)mr_alloc(len,sizeof(big)); char *memc=(char *)memalloc(len); char *memt=(char *)memalloc(len); for (i=0;i<len;i++) { C[i]=mirvar_mem(memc,i); T[i]=mirvar_mem(memt,i); } ptr=a.start; while (ptr!=NULL) { A[ptr->n]=getbig(ptr->an); ptr=ptr->next; } ptr=b.start; while (ptr!=NULL) { B[ptr->n]=getbig(ptr->an); ptr=ptr->next; } karmul2_poly(deg+1,T,A,B,C); pos=NULL; for (d=dega+degb;d>=0;d--) { t=C[d]; if (t.iszero()) continue; pos=prod.addterm(t,d,pos); } memkill(memc,len); memkill(memt,len); mr_free(T); mr_free(C); mr_free(B); mr_free(A); return prod; } while (ptr!=NULL) { pos=NULL; iptr=a.start; while (iptr!=NULL) { pos=prod.addterm(ptr->an*iptr->an,ptr->n+iptr->n,pos); iptr=iptr->next; } ptr=ptr->next; } return prod; }