// // cl /O2 /GX newbasis.cpp poly2.cpp gf2m.cpp big.cpp miracl.lib // // Program to convert a GF(2^m) value from one irreducible polynomial // representation to another // // #include #include "poly2.h" using namespace std; Miracl precision(50,0); int main(int argc,char **argv) { miracl *mip=&precision; Poly2 g,c,h,ut; GF2m u,f,w[600],r; Big t[600],a,d; Variable x; int i,ii,m,b,n,a1,b1,c1,a2,b2,c2,Base,ip; argv++; argc--; if (argc!=8 && argc!=9) { cout << "Incorrect Usage" << endl; cout << "Program converts a value from one polynomial basis to another" << endl; cout << "newbasis " << endl; cout << "for decimal , OR" << endl; cout << "newbasis -h " << endl; cout << "for in hex" << endl; cout << "converts from basis x^m+x^a1+x^b1+x^c1+1 to basis x^m+x^a2+x^b2+x^c2+1" << endl; return 0; } ip=0; m=a1=b1=c1=a2=b2=c2=0; mip->IOBASE=10; if (strcmp(argv[0],"-h")==0) {mip->IOBASE=16; ip=1;} a=argv[ip]; mip->IOBASE=10; m=atoi(argv[ip+1]); a1=atoi(argv[ip+2]); b1=atoi(argv[ip+3]); c1=atoi(argv[ip+4]); a2=atoi(argv[ip+5]); b2=atoi(argv[ip+6]); c2=atoi(argv[ip+7]); prepare_basis(m,a2,b2,c2,TRUE); // convert to this basis.. g=pow2(x,m)+pow2(x,a1)+pow2(x,b1)+pow2(x,c1)+1; // from this basis // IEEE-1363 Algorithm A5.6, find a Root in GF (2m) of the Irreducible Binary Polynomial irand(6L); cout << "Finding root of irreducible polynomial...." << endl; while (degree(g)>1) { u=random2(); ut.addterm(u,1); c=ut; for (i=1;idegree(g)) g=g/h; else g=h; } r=g.coeff(0); // Now compute change-of-basis matrix - A7.3 // This matrix t[.] can be precomputed and stored cout << "Now computing change of basis matrix..." << endl; w[0]=1; for (i=1;i=0;n--) { t[n]=0; for (i=m-1;i>=0;i--) { b=bit((Big)w[i],n); t[n]=(t[n]<<1)+b; } } // Do the conversion cout << "Finally convert the value to new representation" << endl; d=0; for (i=m-1;i>=0;i--) { b=ham(land(a,t[i]))%2; d=(d<<1)+b; } f=d; cout << (Big)f << " decimal" << endl; mip->IOBASE=16; cout << (Big)f << " hex" << endl; return 0; }