/* filename=t1.cc */ #include #include #include #include #include #include #include #include "Integer.h" /* 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, r1, r2; long qmul_total_time = 0, gnu_total_time = 0; struct tms *tbuf = new tms(); long u1, u2; for (int k = 0; k < n; k++) { x = CORE_randomize(L); // bigRand(L); y = CORE_randomize(L); // bigRand(L); #ifdef DEBUG cout << "x: " << x << endl; cout << "y: " << y << endl; #endif times(tbuf); u1 = tbuf->tms_utime; quick_mul(x, y, r2); times(tbuf); u2 = tbuf->tms_utime; qmul_total_time += (u2 - u1); // cout << "r2 = " << r2 << endl; cout << "Qmul: u1 = " << u1 << ", u2 = " << u2 << ", time used " << (u2 - u1) << endl; times(tbuf); u1 = tbuf->tms_utime; mul(x, y, r1); times(tbuf); u2 = tbuf->tms_utime; gnu_total_time += (u2 - u1); // cout << "r1 = " << r1 << endl; cout << "GNU: u1 = " << u1 << ", u2 = " << u2 << ", time used " << (u2 - u1) << endl; assert(r1 == r2); #ifdef DEBUG cout << "x * y : " << r1 << endl; #endif } cout << "Qmul Total time: " << (double)qmul_total_time / 100 << ", average time : " << (double)qmul_total_time / (100 * n) << endl; cout << "GNU Total time: " << (double)gnu_total_time / 100 << ", average time : " << (double)gnu_total_time / (100 * n) << endl; exit(0); }