| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | /* makes a bignum test harness with NUM tests per operation
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * the output is made in the following format [one parameter per line] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | operation | 
					
						
							|  |  |  | operand1 | 
					
						
							|  |  |  | operand2 | 
					
						
							|  |  |  | [... operandN] | 
					
						
							|  |  |  | result1 | 
					
						
							|  |  |  | result2 | 
					
						
							|  |  |  | [... resultN] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | So for example "a * b mod n" would be | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | mulmod | 
					
						
							|  |  |  | a | 
					
						
							|  |  |  | b | 
					
						
							|  |  |  | n | 
					
						
							|  |  |  | a*b mod n | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | e.g. if a=3, b=4 n=11 then | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | mulmod | 
					
						
							|  |  |  | 3 | 
					
						
							|  |  |  | 4 | 
					
						
							|  |  |  | 11 | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-16 00:26:58 +00:00
										 |  |  | #ifdef MP_8BIT
 | 
					
						
							|  |  |  | #define THE_MASK 127
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define THE_MASK 32767
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | #include "mpi.c"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef LTM_MTEST_REAL_RAND
 | 
					
						
							|  |  |  | #define getRandChar() fgetc(rng)
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | FILE *rng; | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define getRandChar() (rand()&0xFF)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void rand_num(mp_int *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    int size; | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |    unsigned char buf[2048]; | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    size_t sz; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |    size = 1 + ((getRandChar()<<8) + getRandChar()) % 101; | 
					
						
							|  |  |  |    buf[0] = (getRandChar()&1)?1:0; | 
					
						
							|  |  |  | #ifdef LTM_MTEST_REAL_RAND
 | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    sz = fread(buf+1, 1, size, rng); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  |    sz = 1; | 
					
						
							|  |  |  |    while (sz < (unsigned)size) { | 
					
						
							|  |  |  |        buf[sz] = getRandChar(); | 
					
						
							|  |  |  |        ++sz; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    if (sz != (unsigned)size) { | 
					
						
							|  |  |  |        fprintf(stderr, "\nWarning: fread failed\n\n"); | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |    while (buf[1] == 0) buf[1] = getRandChar(); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    mp_read_raw(a, buf, 1+size); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void rand_num2(mp_int *a) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    int size; | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |    unsigned char buf[2048]; | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    size_t sz; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |    size = 10 + ((getRandChar()<<8) + getRandChar()) % 101; | 
					
						
							|  |  |  |    buf[0] = (getRandChar()&1)?1:0; | 
					
						
							|  |  |  | #ifdef LTM_MTEST_REAL_RAND
 | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    sz = fread(buf+1, 1, size, rng); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  |    sz = 1; | 
					
						
							|  |  |  |    while (sz < (unsigned)size) { | 
					
						
							|  |  |  |        buf[sz] = getRandChar(); | 
					
						
							|  |  |  |        ++sz; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-10-14 13:55:35 +02:00
										 |  |  |    if (sz != (unsigned)size) { | 
					
						
							|  |  |  |        fprintf(stderr, "\nWarning: fread failed\n\n"); | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |    while (buf[1] == 0) buf[1] = getRandChar(); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    mp_read_raw(a, buf, 1+size); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | #define mp_to64(a, b) mp_toradix(a, b, 64)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  | int main(int argc, char *argv[]) | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-07-16 00:26:58 +00:00
										 |  |  |    int n, tmp; | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  |    long long max; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    mp_int a, b, c, d, e; | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef MTEST_NO_FULLSPEED
 | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |    clock_t t1; | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    char buf[4096]; | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    mp_init(&a); | 
					
						
							|  |  |  |    mp_init(&b); | 
					
						
							|  |  |  |    mp_init(&c); | 
					
						
							|  |  |  |    mp_init(&d); | 
					
						
							|  |  |  |    mp_init(&e); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  |    if (argc > 1) { | 
					
						
							|  |  |  |        max = strtol(argv[1], NULL, 0); | 
					
						
							|  |  |  |        if (max < 0) { | 
					
						
							|  |  |  |            if (max > -64) { | 
					
						
							|  |  |  |                max = (1 << -(max)) + 1; | 
					
						
							|  |  |  |            } else { | 
					
						
							|  |  |  |                max = 1; | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  |        } else if (max == 0) { | 
					
						
							|  |  |  |            max = 1; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    else { | 
					
						
							|  |  |  |        max = 0; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    /* initial (2^n - 1)^2 testing, makes sure the comba multiplier works [it has the new carry code] */ | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |    mp_set(&a, 1); | 
					
						
							|  |  |  |    for (n = 1; n < 8192; n++) { | 
					
						
							|  |  |  |        mp_mul(&a, &a, &c); | 
					
						
							|  |  |  |        printf("mul\n"); | 
					
						
							|  |  |  |        mp_to64(&a, buf); | 
					
						
							|  |  |  |        printf("%s\n%s\n", buf, buf); | 
					
						
							|  |  |  |        mp_to64(&c, buf); | 
					
						
							|  |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        mp_add_d(&a, 1, &a); | 
					
						
							|  |  |  |        mp_mul_2(&a, &a); | 
					
						
							|  |  |  |        mp_sub_d(&a, 1, &a); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef LTM_MTEST_REAL_RAND
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    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; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  |    srand(23); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef MTEST_NO_FULLSPEED
 | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |    t1 = clock(); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    for (;;) { | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef MTEST_NO_FULLSPEED
 | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |       if (clock() - t1 > CLOCKS_PER_SEC) { | 
					
						
							| 
									
										
										
										
											2004-04-11 20:46:22 +00:00
										 |  |  |          sleep(2); | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |          t1 = clock(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |        n = getRandChar() % 15; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  |        if (max != 0) { | 
					
						
							|  |  |  |            --max; | 
					
						
							|  |  |  |            if (max == 0) | 
					
						
							|  |  |  |              n = 255; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    if (n == 0) { | 
					
						
							|  |  |  |        /* add tests */ | 
					
						
							|  |  |  |        rand_num(&a); | 
					
						
							|  |  |  |        rand_num(&b); | 
					
						
							|  |  |  |        mp_add(&a, &b, &c); | 
					
						
							|  |  |  |        printf("add\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&c, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 1) { | 
					
						
							|  |  |  |       /* sub tests */ | 
					
						
							|  |  |  |        rand_num(&a); | 
					
						
							|  |  |  |        rand_num(&b); | 
					
						
							|  |  |  |        mp_sub(&a, &b, &c); | 
					
						
							|  |  |  |        printf("sub\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&c, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 2) { | 
					
						
							|  |  |  |        /* mul tests */ | 
					
						
							|  |  |  |        rand_num(&a); | 
					
						
							|  |  |  |        rand_num(&b); | 
					
						
							|  |  |  |        mp_mul(&a, &b, &c); | 
					
						
							|  |  |  |        printf("mul\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&c, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 3) { | 
					
						
							|  |  |  |       /* div tests */ | 
					
						
							|  |  |  |        rand_num(&a); | 
					
						
							|  |  |  |        rand_num(&b); | 
					
						
							|  |  |  |        mp_div(&a, &b, &c, &d); | 
					
						
							|  |  |  |        printf("div\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&c, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&d, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 4) { | 
					
						
							|  |  |  |       /* sqr tests */ | 
					
						
							|  |  |  |        rand_num(&a); | 
					
						
							|  |  |  |        mp_sqr(&a, &b); | 
					
						
							|  |  |  |        printf("sqr\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |        mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |        printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 5) { | 
					
						
							|  |  |  |       /* mul_2d test */ | 
					
						
							|  |  |  |       rand_num(&a); | 
					
						
							|  |  |  |       mp_copy(&a, &b); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |       n = getRandChar() & 63; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       mp_mul_2d(&b, n, &b); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       printf("mul2d\n"); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       printf("%d\n", n); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 6) { | 
					
						
							|  |  |  |       /* div_2d test */ | 
					
						
							|  |  |  |       rand_num(&a); | 
					
						
							|  |  |  |       mp_copy(&a, &b); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  |       n = getRandChar() & 63; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       mp_div_2d(&b, n, &b, NULL); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       printf("div2d\n"); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       printf("%d\n", n); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 7) { | 
					
						
							|  |  |  |       /* gcd test */ | 
					
						
							|  |  |  |       rand_num(&a); | 
					
						
							|  |  |  |       rand_num(&b); | 
					
						
							|  |  |  |       a.sign = MP_ZPOS; | 
					
						
							|  |  |  |       b.sign = MP_ZPOS; | 
					
						
							|  |  |  |       mp_gcd(&a, &b, &c); | 
					
						
							|  |  |  |       printf("gcd\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&b, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&c, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    } else if (n == 8) { | 
					
						
							|  |  |  |       /* lcm test */ | 
					
						
							|  |  |  |       rand_num(&a); | 
					
						
							|  |  |  |       rand_num(&b); | 
					
						
							|  |  |  |       a.sign = MP_ZPOS; | 
					
						
							|  |  |  |       b.sign = MP_ZPOS; | 
					
						
							|  |  |  |       mp_lcm(&a, &b, &c); | 
					
						
							|  |  |  |       printf("lcm\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&b, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&c, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    } else if (n == 9) { | 
					
						
							|  |  |  |       /* exptmod test */ | 
					
						
							|  |  |  |       rand_num2(&a); | 
					
						
							|  |  |  |       rand_num2(&b); | 
					
						
							|  |  |  |       rand_num2(&c); | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  | //      if (c.dp[0]&1) mp_add_d(&c, 1, &c);
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       a.sign = b.sign = c.sign = 0; | 
					
						
							|  |  |  |       mp_exptmod(&a, &b, &c, &d); | 
					
						
							|  |  |  |       printf("expt\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       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); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    } else if (n == 10) { | 
					
						
							|  |  |  |       /* invmod test */ | 
					
						
							| 
									
										
										
										
											2017-04-20 13:03:21 +02:00
										 |  |  |       do { | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       rand_num2(&a); | 
					
						
							|  |  |  |       rand_num2(&b); | 
					
						
							|  |  |  |       b.sign = MP_ZPOS; | 
					
						
							|  |  |  |       a.sign = MP_ZPOS; | 
					
						
							|  |  |  |       mp_gcd(&a, &b, &c); | 
					
						
							| 
									
										
										
										
											2017-04-20 13:03:21 +02:00
										 |  |  |       } while (mp_cmp_d(&c, 1) != 0 || mp_cmp_d(&b, 1) == 0); | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |       mp_invmod(&a, &b, &c); | 
					
						
							|  |  |  |       printf("invmod\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&b, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&c, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-03-13 02:11:11 +00:00
										 |  |  |    } else if (n == 11) { | 
					
						
							|  |  |  |       rand_num(&a); | 
					
						
							|  |  |  |       mp_mul_2(&a, &a); | 
					
						
							|  |  |  |       mp_div_2(&a, &b); | 
					
						
							|  |  |  |       printf("div2\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-03-13 02:11:11 +00:00
										 |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |    } else if (n == 12) { | 
					
						
							|  |  |  |       rand_num2(&a); | 
					
						
							|  |  |  |       mp_mul_2(&a, &b); | 
					
						
							|  |  |  |       printf("mul2\n"); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |       mp_to64(&a, buf); | 
					
						
							|  |  |  |       printf("%s\n", buf); | 
					
						
							|  |  |  |       mp_to64(&b, buf); | 
					
						
							| 
									
										
										
										
											2003-03-13 02:11:11 +00:00
										 |  |  |       printf("%s\n", buf); | 
					
						
							| 
									
										
										
										
											2003-07-16 00:26:58 +00:00
										 |  |  |    } 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); | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  |    } else if (n == 255) { | 
					
						
							|  |  |  |       printf("exit\n"); | 
					
						
							|  |  |  |       break; | 
					
						
							| 
									
										
										
										
											2003-03-13 02:11:11 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2014-10-15 16:22:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #ifdef LTM_MTEST_REAL_RAND
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    fclose(rng); | 
					
						
							| 
									
										
										
										
											2014-10-14 14:35:16 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |    return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-08-01 16:37:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* $Source$ */ | 
					
						
							|  |  |  | /* $Revision$ */ | 
					
						
							|  |  |  | /* $Date$ */ |