Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions
mulsqr.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#include "mpi.h"
#include "mpprime.h"

Go to the source code of this file.

Defines

#define MP_SQUARE   1 /* make sure squaring code is included */

Functions

int main (int argc, char *argv[])

Define Documentation

#define MP_SQUARE   1 /* make sure squaring code is included */

Definition at line 45 of file mulsqr.c.


Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 50 of file mulsqr.c.

{
  int           ntests, prec, ix;
  unsigned int  seed;
  clock_t       start, stop;
  double        multime, sqrtime;
  mp_int        a, c;

  seed = (unsigned int)time(NULL);

  if(argc < 3) {
    fprintf(stderr, "Usage: %s <ntests> <nbits>\n", argv[0]);
    return 1;
  }

  if((ntests = abs(atoi(argv[1]))) == 0) {
    fprintf(stderr, "%s: must request at least 1 test.\n", argv[0]);
    return 1;
  }
  if((prec = abs(atoi(argv[2]))) < CHAR_BIT) {
    fprintf(stderr, "%s: must request at least %d bits.\n", argv[0],
           CHAR_BIT);
    return 1;
  }

  prec = (prec + (DIGIT_BIT - 1)) / DIGIT_BIT;

  mp_init_size(&a, prec);
  mp_init_size(&c, 2 * prec);

  /* Test multiplication by self */
  srand(seed);
  start = clock();
  for(ix = 0; ix < ntests; ix++) {
    mpp_random_size(&a, prec);
    mp_mul(&a, &a, &c);
  }
  stop = clock();

  multime = (double)(stop - start) / CLOCKS_PER_SEC;

  /* Test squaring */
  srand(seed);
  start = clock();
  for(ix = 0; ix < ntests; ix++) {
    mpp_random_size(&a, prec);
    mp_sqr(&a, &c);
  }
  stop = clock();

  sqrtime = (double)(stop - start) / CLOCKS_PER_SEC;

  printf("Multiply: %.4f\n", multime);
  printf("Square:   %.4f\n", sqrtime);
  if(multime < sqrtime) {
    printf("Speedup:  %.1f%%\n", 100.0 * (1.0 - multime / sqrtime));
    printf("Prefer:   multiply\n");
  } else {
    printf("Speedup:  %.1f%%\n", 100.0 * (1.0 - sqrtime / multime));
    printf("Prefer:   square\n");
  }

  mp_clear(&a); mp_clear(&c);
  return 0;

}

Here is the call graph for this function: