/* testmul_cln.cc Written by Chen Li , 10/00. $Id$ */ #include #include #include #include #include #include #include #include "Integer.h" typedef bigint Integer; /* Integer bigRand(int k) { // generate a k-bit random big integer Integer r = 0; Integer q = 1; q <<= (k-1); // the leading bit is one. int bits = 0; unsigned int m; while (bits < k) { m = rand() % (1 << 15); // [0, 2^15 - 1] // cout << "m = " << m << endl; int rest = k - bits; if (rest > 15) { r <<= 15; r += m; bits += 15; } else { r <<= rest; r += (m % (1 << rest)); bits += rest; } } if (r < q) r+= q; // cout << "r = " << r << ", lg(r) = " << lg(r) << endl; assert(r > 0); // if ((rand() % 2) == 0) r = - r; return r; } */ Integer bigRand(int k) { // generate a k-bit random big integer Integer range = 1; range <<= k; Integer r = randomize(range); // cout << "r = " << r << ", lg(r) = " << lg(r) << endl; // if ((rand() % 2) == 0) r = - r; return r; } int main(int argc, char* argv[]) { int L, n; if (argc < 3) { cerr << "Usage: qmul " << endl; exit(1); } L = atoi(argv[1]); n = atoi(argv[2]); unsigned int seed = (unsigned int) (time(NULL) % UINT_MAX); srand(seed); // srand(1234567); Integer x, y, r; long lidia_total_time = 0; struct tms *tbuf = new tms(); long u1, u2; for (int k = 0; k < n; k++) { x = bigRand(L); y = bigRand(L); // cout << "x: " << x << endl; // cout << "y: " << y << endl; times(tbuf); u1 = tbuf->tms_utime; r = x * y; times(tbuf); u2 = tbuf->tms_utime; lidia_total_time += (u2 - u1); cout << "LiDIA/CLN: u1 = " << u1 << ", u2 = " << u2 << ", time used " << (u2 - u1) << endl; // cout << "x * y : " << r << endl; } cout << "LiDIA/CLN Total time: " << (double)lidia_total_time / 100 << ", average time : " << (double)lidia_total_time / (100 * n) << endl; exit(0); }