155 lines
4.0 KiB
C
155 lines
4.0 KiB
C
/*
|
|
* program to calculate modquare/modmult, inverse/modmult,
|
|
* jacobi/modmult and modadd/modmult ratios
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "miracl.h"
|
|
#include <time.h>
|
|
|
|
#define MIN_TIME 15.0
|
|
|
|
int sizes[]={160,256,512,640};
|
|
int num_sizes=4;
|
|
|
|
int main()
|
|
{
|
|
time_t seed;
|
|
int i,j,k,bits;
|
|
long iterations;
|
|
big x,nx,y,ny,n,w;
|
|
clock_t start;
|
|
double square_time,mult_time,xgcd_time,jac_time,add_time;
|
|
|
|
#ifndef MR_NOFULLWIDTH
|
|
mirsys(80,0);
|
|
#else
|
|
mirsys(80,MAXBASE);
|
|
#endif
|
|
x=mirvar(0);
|
|
nx=mirvar(0);
|
|
y=mirvar(0);
|
|
ny=mirvar(0);
|
|
n=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
|
|
#ifdef MR_NOASM
|
|
printf("C-Only Version of MIRACL\n");
|
|
#else
|
|
printf("Using some assembly language\n");
|
|
#endif
|
|
#ifdef MR_STRIPPED_DOWN
|
|
printf("Stripped down version of MIRACL - no error messages\n");
|
|
#endif
|
|
#ifdef MR_KCM
|
|
k=MR_KCM*MIRACL;
|
|
printf("Using KCM method \n");
|
|
printf("Optimized for %d, %d, %d, %d...etc. bit moduli\n",k,k*2,k*4,k*8);
|
|
#endif
|
|
#ifdef MR_COMBA
|
|
k=MR_COMBA*MIRACL;
|
|
printf("Using COMBA method \n");
|
|
printf("Optimized for %d bit moduli\n",k);
|
|
#endif
|
|
#ifdef MR_PENTIUM
|
|
printf("Floating-point co-processor arithmetic used for Pentium\n");
|
|
#endif
|
|
#ifndef MR_KCM
|
|
#ifndef MR_COMBA
|
|
#ifndef MR_PENTIUM
|
|
printf("No special optimizations\n");
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef MR_NOFULLWIDTH
|
|
printf("No Fullwidth base possible\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 Modsquare/Modmult, Inverse/Modmult, Jacobi/Modmult Modadd/Modmult ratios\n");
|
|
printf("Please Wait......\n");
|
|
for (j=0;j<num_sizes;j++)
|
|
{
|
|
bits=sizes[j];
|
|
bigbits(bits,n);
|
|
if (remain(n,2)==0) incr(n,1,n);
|
|
bigrand(n,x);
|
|
bigrand(n,y);
|
|
while (egcd(x,n,w)!=1) incr(n,2,n);
|
|
prepare_monty(n);
|
|
nres(x,nx); nres(y,ny);
|
|
|
|
iterations=0;
|
|
start=clock();
|
|
do {
|
|
for (i=0;i<1000;i++) nres_modmult(nx,ny,w);
|
|
iterations++;
|
|
mult_time=(clock()-start)/(double)CLOCKS_PER_SEC;
|
|
} while (mult_time<MIN_TIME);
|
|
/* printf("before mult_time= %lf\n",mult_time); */
|
|
mult_time=1000.0*mult_time/iterations;
|
|
/*
|
|
printf("iterations= %d\n",iterations);
|
|
printf("after mult_time= %lf\n",mult_time);
|
|
*/
|
|
|
|
iterations=0;
|
|
start=clock();
|
|
do {
|
|
for (i=0;i<1000;i++) nres_modmult(nx,nx,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++) jack(x,n);
|
|
iterations++;
|
|
jac_time=(clock()-start)/(double)CLOCKS_PER_SEC;
|
|
} while (jac_time<MIN_TIME);
|
|
jac_time=1000.0*jac_time/iterations;
|
|
|
|
iterations=0;
|
|
start=clock();
|
|
do {
|
|
for (i=0;i<1000;i++) xgcd(x,n,w,w,w);
|
|
iterations++;
|
|
xgcd_time=(clock()-start)/(double)CLOCKS_PER_SEC;
|
|
} while (xgcd_time<MIN_TIME);
|
|
xgcd_time=1000.0*xgcd_time/iterations;
|
|
|
|
iterations=0;
|
|
start=clock();
|
|
do {
|
|
for (i=0;i<1000;i++) nres_modadd(nx,ny,w);
|
|
iterations++;
|
|
add_time=(clock()-start)/(double)CLOCKS_PER_SEC;
|
|
} while (add_time<MIN_TIME);
|
|
add_time=1000.0*add_time/iterations;
|
|
|
|
printf("%d bits: modmult %.2lfuS modsqr %.2lfuS inverse %.2lfuS jacobi %.2lfuS modadd %.2lfuS \n",bits,mult_time,square_time,xgcd_time,jac_time,add_time);
|
|
|
|
printf("S/M ratio= %.2lf\n",square_time/mult_time);
|
|
printf("I/M ratio= %.2lf\n",xgcd_time/mult_time);
|
|
printf("J/M ratio= %.2lf\n",jac_time/mult_time);
|
|
printf("A/M ratio= %.2lf\n",add_time/mult_time);
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|