KGC_TEST/miracl/source/imratio2.c

116 lines
3.1 KiB
C

/*
* program to calculate Square/Multiply, Sqrt/Multiply and Inverse/Multiply ratio
* for fields F(2^m). Note that Square/Multiply can be improved by
* optimizing the reduce2(.) in mrgf2m.c for a particular field.
* See the comments in the function.
*/
#include <stdio.h>
#include "miracl.h"
#include <time.h>
#define MIN_TIME 10.0
int m[]={103,163,233,283,313,379,571};
int a[]={9, 99,159,249,121,317,507};
int b[]={0, 97, 0,219, 0,315,475};
int c[]={0, 3, 0, 27, 0,283,417};
int main()
{
time_t seed;
int i,j,k,bits;
long iterations;
big x,y,w;
clock_t start;
double square_time,sqrt_time,mult_time,inverse_time;
#ifndef MR_NOFULLWIDTH
mirsys(80,0);
#else
mirsys(80,MAXBASE);
#endif
x=mirvar(0);
y=mirvar(0);
w=mirvar(0);
printf("MIRACL - %d bit version\n",MIRACL);
#ifdef MR_LITTLE_ENDIAN
printf("Little Endian processor\n");
#endif
#ifdef MR_BIG_ENDIAN
printf("Big Endian processor\n");
#endif
printf("C-Only Version of MIRACL\n");
#ifdef MR_STRIPPED_DOWN
printf("Stripped down version of MIRACL - no error messages\n");
#endif
printf("NOTE: times are elapsed real-times - so make sure nothing else is running!\n\n");
time(&seed);
irand((unsigned long)seed);
printf("Calculating Square/Multiply (S/M), Square Root/Multiply (R/M) and Inverse/Multiply (I/M) ratios\n");
printf("Please Wait......\n");
for (j=0;j<7;j++)
{
bits=m[j];
if (!prepare_basis(m[j],a[j],b[j],c[j],TRUE))
{
printf("Problem\n");
return 0;
}
rand2(x);
rand2(y);
iterations=0;
start=clock();
do {
for (i=0;i<1000;i++) modmult2(x,y,w);
iterations++;
mult_time=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (mult_time<MIN_TIME);
mult_time=1000.0*mult_time/iterations;
iterations=0;
start=clock();
do {
for (i=0;i<1000;i++) modsquare2(x,w);
iterations++;
square_time=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (square_time<MIN_TIME);
square_time=1000.0*square_time/iterations;
iterations=0;
start=clock();
do {
for (i=0;i<1000;i++) sqroot2(x,w);
iterations++;
sqrt_time=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (sqrt_time<MIN_TIME);
sqrt_time=1000.0*sqrt_time/iterations;
iterations=0;
start=clock();
do {
for (i=0;i<1000;i++) inverse2(x,w);
iterations++;
inverse_time=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (inverse_time<MIN_TIME);
inverse_time=1000.0*inverse_time/iterations;
printf("%d bits: multiply %.2lfuS square %.2lfuS sqrt %.2lfuS inverse %.2lfuS\n",bits,mult_time,square_time,sqrt_time,inverse_time);
printf("S/M ratio= %.2lf\n",square_time/mult_time);
printf("R/M ratio= %.2lf\n",sqrt_time/mult_time);
printf("I/M ratio= %.2lf\n",inverse_time/mult_time);
}
return 0;
}