|
#ifdef MP_8BIT
#define THE_MASK 127
#else
#define THE_MASK 32767
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mpi.c"
FILE *rng;
void rand_num(mp_int *a)
{
int n, size;
unsigned char buf[2048];
size = 1 + (( fgetc (rng)<<8) + fgetc (rng)) % 101;
buf[0] = ( fgetc (rng)&1)?1:0;
fread (buf+1, 1, size, rng);
while (buf[1] == 0) buf[1] = fgetc (rng);
mp_read_raw(a, buf, 1+size);
}
void rand_num2(mp_int *a)
{
int n, size;
unsigned char buf[2048];
size = 10 + (( fgetc (rng)<<8) + fgetc (rng)) % 101;
buf[0] = ( fgetc (rng)&1)?1:0;
fread (buf+1, 1, size, rng);
while (buf[1] == 0) buf[1] = fgetc (rng);
mp_read_raw(a, buf, 1+size);
}
#define mp_to64(a, b) mp_toradix(a, b, 64)
int main( void )
{
int n, tmp;
mp_int a, b, c, d, e;
clock_t t1;
char buf[4096];
mp_init(&a);
mp_init(&b);
mp_init(&c);
mp_init(&d);
mp_init(&e);
rng = fopen ( "/dev/urandom" , "rb" );
if (rng == NULL) {
rng = fopen ( "/dev/random" , "rb" );
if (rng == NULL) {
fprintf (stderr, "\nWarning: stdin used as random source\n\n" );
rng = stdin;
}
}
t1 = clock ();
for (;;) {
#if 0
if ( clock () - t1 > CLOCKS_PER_SEC) {
sleep(2);
t1 = clock ();
}
#endif
n = fgetc (rng) % 15;
if (n == 0) {
rand_num(&a);
rand_num(&b);
mp_add(&a, &b, &c);
printf ( "add\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 1) {
rand_num(&a);
rand_num(&b);
mp_sub(&a, &b, &c);
printf ( "sub\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 2) {
rand_num(&a);
rand_num(&b);
mp_mul(&a, &b, &c);
printf ( "mul\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 3) {
rand_num(&a);
rand_num(&b);
mp_div(&a, &b, &c, &d);
printf ( "div\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
mp_to64(&d, buf);
printf ( "%s\n" , buf);
} else if (n == 4) {
rand_num(&a);
mp_sqr(&a, &b);
printf ( "sqr\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 5) {
rand_num(&a);
mp_copy(&a, &b);
n = fgetc (rng) & 63;
mp_mul_2d(&b, n, &b);
mp_to64(&a, buf);
printf ( "mul2d\n" );
printf ( "%s\n" , buf);
printf ( "%d\n" , n);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 6) {
rand_num(&a);
mp_copy(&a, &b);
n = fgetc (rng) & 63;
mp_div_2d(&b, n, &b, NULL);
mp_to64(&a, buf);
printf ( "div2d\n" );
printf ( "%s\n" , buf);
printf ( "%d\n" , n);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 7) {
rand_num(&a);
rand_num(&b);
a.sign = MP_ZPOS;
b.sign = MP_ZPOS;
mp_gcd(&a, &b, &c);
printf ( "gcd\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 8) {
rand_num(&a);
rand_num(&b);
a.sign = MP_ZPOS;
b.sign = MP_ZPOS;
mp_lcm(&a, &b, &c);
printf ( "lcm\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 9) {
rand_num2(&a);
rand_num2(&b);
rand_num2(&c);
a.sign = b.sign = c.sign = 0;
mp_exptmod(&a, &b, &c, &d);
printf ( "expt\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
mp_to64(&d, buf);
printf ( "%s\n" , buf);
} else if (n == 10) {
rand_num2(&a);
rand_num2(&b);
b.sign = MP_ZPOS;
a.sign = MP_ZPOS;
mp_gcd(&a, &b, &c);
if (mp_cmp_d(&c, 1) != 0) continue ;
if (mp_cmp_d(&b, 1) == 0) continue ;
mp_invmod(&a, &b, &c);
printf ( "invmod\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
mp_to64(&c, buf);
printf ( "%s\n" , buf);
} else if (n == 11) {
rand_num(&a);
mp_mul_2(&a, &a);
mp_div_2(&a, &b);
printf ( "div2\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 12) {
rand_num2(&a);
mp_mul_2(&a, &b);
printf ( "mul2\n" );
mp_to64(&a, buf);
printf ( "%s\n" , buf);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 13) {
rand_num2(&a);
tmp = abs ( rand ()) & THE_MASK;
mp_add_d(&a, tmp, &b);
printf ( "add_d\n" );
mp_to64(&a, buf);
printf ( "%s\n%d\n" , buf, tmp);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
} else if (n == 14) {
rand_num2(&a);
tmp = abs ( rand ()) & THE_MASK;
mp_sub_d(&a, tmp, &b);
printf ( "sub_d\n" );
mp_to64(&a, buf);
printf ( "%s\n%d\n" , buf, tmp);
mp_to64(&b, buf);
printf ( "%s\n" , buf);
}
}
fclose (rng);
return 0;
}
|