int main() { FILE *fp; big e,n,g,a; brick binst; int window,nb,bits; miracl *mip=mirsys(100,0); n=mirvar(0); e=mirvar(0); a=mirvar(0); g=mirvar(0); fp=fopen("common.dss","rt"); fscanf(fp,"%d\n",&bits); mip->IOBASE=16; cinnum(n,fp); cinnum(g,fp); cinnum(g,fp); mip->IOBASE=10; printf("modulus is %d bits in length\n",logb2(n)); printf("Enter size of exponent in bits = "); scanf("%d",&nb); getchar(); printf("Enter window size in bits (1-10)= "); scanf("%d",&window); getchar(); if (!brick_init(&binst,g,n,window,nb)) { printf("Failed to initialize\n"); return 0; } printf("%d big numbers have been precomputed and stored\n",(1<<window)); bigbits(nb,e); /* random exponent */ printf("naive method\n"); powmod(g,e,n,a); cotnum(a,stdout); printf("Comb method\n"); pow_brick(&binst,e,a); brick_end(&binst); cotnum(a,stdout); return 0; }
double powers_precomp(int gb,int eb,big p) { int iterations=0; clock_t start; double elapsed; brick binst; big g,e,w; char *mem; mem=(char *)memalloc(3); g=mirvar_mem(mem,0); e=mirvar_mem(mem,1); w=mirvar_mem(mem,2); bigbits(gb,g); brick_init(&binst,g,p,WINDOW,eb); bigbits(eb,e); start=clock(); do { pow_brick(&binst,e,w); iterations++; elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; } while (elapsed<MIN_TIME || iterations<MIN_ITERS); elapsed=1000.0*elapsed/iterations; printf("P - %8d iterations of %4d/%4d ",iterations,gb,eb); printf(" %8.2lf ms per iteration\n",elapsed); brick_end(&binst); memkill(mem,3); return elapsed; }