a test file for Integer class
#define tassert(ex) { cerr << #ex; \
if ((ex)) cerr << " OK\n"; \
else cerr << " Fail\n"; }
Integer
factorial(Integer n
)
Integer
fibonacci(long n
)
void identitytest(Integer
& a
, Integer
& b
, Integer
& c
)
assert( (a
+ b
) == (b
+ a
));
assert( (a
+ (-b
)) == (a
- b
));
assert( (a
* b
) == (b
* a
));
assert( (a
* (-b
)) == -(a
* b
));
assert( (a
/ (-b
)) == -(a
/ b
));
assert( (a
- b
) == -(b
- a
));
assert( (a
+ (b
+ c
)) == ((a
+ b
) + c
));
assert( (a
* (b
* c
)) == ((a
* b
) * c
));
assert( (a
* (b
+ c
)) == ((a
* b
) + (a
* c
)));
assert( ((a
- b
) + b
) == a
);
assert( ((a
+ b
) - b
) == a
);
assert( ((a
* b
) / b
) == a
);
assert( ((a
* b
) % b
) == 0);
assert( (b
* (a
/ b
) + (a
% b
)) == a
);
assert( ((a
+ b
) % c
) == ((a
% c
) + (b
% c
)) % c
);
void utiltest(Integer
& a
)
assert(sqrt(sqr(a
)) == a
);
assert(sqr(sqrt(a
)) <= a
);
for (int i
= 0; i
< 10; ++i
)
void bittest(Integer
& a
, Integer
& b
, Integer
& c
)
assert( (a
| b
) == (b
| a
));
assert( (a
& b
) == (b
& a
));
assert( (a
^ b
) == (b
^ a
));
assert( (a
| (b
| c
)) == ((a
| b
) | c
));
assert( (a
& (b
& c
)) == ((a
& b
) & c
));
assert( (a
& (b
| c
)) == ((a
& b
) | (a
& c
)));
assert( (a
| (b
& c
)) == ((a
| b
) & (a
| c
)));
assert( (a
& (a
| b
)) == a
);
assert( (a
| (a
& b
)) == a
);
void accumtest(Integer
& a
, Integer
& b
, Integer
& c
)
assert(x
== ((a
* b
) + c
));
assert(x
== (((a
* b
) + c
) - a
));
assert(x
== ((((a
* b
) + c
) - a
) / b
));
assert(x
== (((((a
* b
) + c
) - a
) / b
) % c
));
assert(x
== ((((((a
* b
) + c
) - a
) / b
) % c
) & a
));
assert(x
== (((((((a
* b
) + c
) - a
) / b
) % c
) & a
) | b
));
assert(x
== ((((((((a
* b
) + c
) - a
) / b
) % c
) & a
) | b
) ^ c
));
void longidentitytest(Integer
& a
, long b
, long c
)
assert( (a
+ b
) == (b
+ a
));
assert( (a
+ (-b
)) == (a
- b
));
assert( (a
* b
) == (b
* a
));
assert( (a
* (-b
)) == -(a
* b
));
assert( (a
/ (-b
)) == -(a
/ b
));
assert( (a
- b
) == -(b
- a
));
assert( (a
+ (b
+ c
)) == ((a
+ b
) + c
));
assert( (a
* (b
* c
)) == ((a
* b
) * c
));
assert( (a
* (b
+ c
)) == ((a
* b
) + (a
* c
)));
assert( ((a
- b
) + b
) == a
);
assert( ((a
+ b
) - b
) == a
);
assert( ((a
* b
) / b
) == a
);
assert( ((a
* b
) % b
) == 0);
assert( (b
* (a
/ b
) + (a
% b
)) == a
);
assert( ((a
+ b
) % c
) == ((a
% c
) + (b
% c
)) % c
);
void longbittest(Integer
& a
, long b
, long c
)
assert( (a
| b
) == (b
| a
));
assert( (a
& b
) == (b
& a
));
assert( (a
^ b
) == (b
^ a
));
assert( (a
| (b
| c
)) == ((a
| b
) | c
));
assert( (a
& (b
& c
)) == ((a
& b
) & c
));
assert( (a
& (b
| c
)) == ((a
& b
) | (a
& c
)));
assert( (a
| (b
& c
)) == ((a
| b
) & (a
| c
)));
assert( (a
& (a
| b
)) == a
);
assert( (a
| (a
& b
)) == a
);
void longaccumtest(Integer
& a
, long b
, long c
)
assert(x
== ((a
* b
) + c
));
assert(x
== (((a
* b
) + c
) - a
));
assert(x
== ((((a
* b
) + c
) - a
) / b
));
assert(x
== (((((a
* b
) + c
) - a
) / b
) % c
));
assert(x
== ((((((a
* b
) + c
) - a
) / b
) % c
) & a
));
assert(x
== (((((((a
* b
) + c
) - a
) / b
) % c
) & a
) | b
));
assert(x
== ((((((((a
* b
) + c
) - a
) / b
) % c
) & a
) | b
) ^ c
));
Integer pow64
= Ipow(2, 64);
cout
<< "pow64 = Ipow(2, 64) = " << pow64
<< "\n";
cout
<< "lg(pow64) = " << lg(pow64
) << "\n";
for (int k
= 0; k
< 64; ++k
) assert(testbit(pow64
, k
) == 0);
assert(testbit(pow64
, k
) != 0);
cout
<< "s64 = 1 << 64 = " << s64
<< "\n";
cout
<< "s32 = s64 >> 32 = " << s32
<< "\n";
cout
<< "comps64 = ~s64 = " << comps64
<< "\n";
for (k
= 0; k
< 64; ++k
) assert(testbit(comps64
, k
) == !testbit(s64
, k
));
Integer result
= (comps64
& s32
);
cout
<< "comps64 & s32 = " << result
<< "\n";
result
= (comps64
| s32
);
cout
<< "comps64 | s32 = " << result
<< "\n";
result
= (comps64
^ s32
);
cout
<< "comps64 ^ s32 = " << result
<< "\n";
identitytest(s64
, s32
, comps64
);
bittest(s32
, s64
, comps64
);
accumtest(comps64
, s32
, pow64
);
longidentitytest(s64
, 1000, 50);
longbittest(s64
, 12345, 67890);
longaccumtest(s32
, 100000, 1);
cout
<< "\nenter an Integer: ";
cout
<< "number = " << result
<< "\n";
Integer fib50
= fibonacci(50);
cout
<< "fib50 = fibonacci(50) = " << fib50
<< "\n";
Integer fib48
= fibonacci(48);
cout
<< "fib48 = fibonacci(48) = " << fib48
<< "\n";
Integer result
= fib48
+ fib50
;
cout
<< "fib48 + fib50 = " << result
<< "\n";
cout
<< "fib48 - fib50 = " << result
<< "\n";
cout
<< "fib48 * fib50 = " << result
<< "\n";
cout
<< "fib48 / fib50 = " << result
<< "\n";
cout
<< "fib48 % fib50 = " << result
<< "\n";
result
= gcd(fib50
, fib48
);
cout
<< "gcd(fib50, fib48) = " << result
<< "\n";
cout
<< "sqrt(fib50) = " << result
<< "\n";
identitytest(result
, fib50
, fib48
);
bittest(result
, fib50
, fib48
);
accumtest(result
, fib50
, fib48
);
longidentitytest(fib50
, 1000, 50);
longaccumtest(fib48
, 100000, 1);
void facttest(Integer
& one
, Integer
& two
)
Integer
fact30(factorial(30));
cout
<< "fact30 = factorial(30) = " << fact30
<< "\n";
Integer
fact28(factorial(28));
cout
<< "fact28 = factorial(28) = " << fact28
<< "\n";
assert(fact30
== fact28
* 870);
Integer result
= fact30
+ fact28
;
cout
<< "fact30 + fact28 = " << result
<< "\n";
result
= fact30
- fact28
;
cout
<< "fact30 - fact28 = " << result
<< "\n";
result
= fact30
* fact28
;
cout
<< "fact30 * fact28 = " << result
<< "\n";
result
= fact30
/ fact28
;
cout
<< "fact30 / fact28 = " << result
<< "\n";
result
= fact30
% fact28
;
cout
<< "fact30 % fact28 = " << result
<< "\n";
cout
<< "-fact30 = " << result
<< "\n";
assert(abs(result
) == fact30
);
cout
<< "lg(fact30) = " << lg(fact30
) << "\n";
assert(lg(fact30
) == 107);
result
= gcd(fact30
, fact28
);
cout
<< "gcd(fact30, fact28) = " << result
<< "\n";
assert(result
== fact28
);
cout
<< "sqrt(fact30) = " << result
<< "\n";
Integer negfact31
= fact30
* -31;
Integer posfact31
= abs(negfact31
);
cout
<< "negfact31 = " << negfact31
<< "\n";
result
= fact30
+ negfact31
;
cout
<< "fact30 + negfact31 = " << result
<< "\n";
result
= fact30
- negfact31
;
cout
<< "fact30 - negfact31 = " << result
<< "\n";
result
= fact30
* negfact31
;
cout
<< "fact30 * negfact31 = " << result
<< "\n";
result
= fact30
/ negfact31
;
cout
<< "fact30 / negfact31 = " << result
<< "\n";
result
= fact30
% negfact31
;
cout
<< "fact30 % negfact31 = " << result
<< "\n";
result
= gcd(fact30
, negfact31
);
cout
<< "gcd(fact30, negfact31) = " << result
<< "\n";
assert(result
== fact30
);
identitytest(one
, one
, one
);
identitytest(one
, one
, one
);
identitytest(one
, two
, fact30
);
identitytest(fact30
, posfact31
, fact28
);
identitytest(fact30
, negfact31
, fact28
);
identitytest(negfact31
, posfact31
, fact28
);
bittest(one
, two
, fact30
);
bittest(fact30
, posfact31
, fact28
);
accumtest(one
, one
, one
);
accumtest(one
, one
, one
);
accumtest(one
, two
, fact30
);
accumtest(fact30
, posfact31
, fact28
);
longidentitytest(one
, 1, 1);
longidentitytest(one
, 2, 3);
longidentitytest(fact30
, 3, -20);
longidentitytest(fact30
, 4, 20000);
longidentitytest(negfact31
, -100, 20000);
longbittest(fact30
, 4, 20000);
longbittest(fact28
, 1000, 50);
longaccumtest(one
, 1, 1);
longaccumtest(one
, 2, 3);
longaccumtest(fact30
, 4, 20000);
longaccumtest(fact30
, 1000, 50);
longaccumtest(fact28
, 10000000, 100000000);
cout
<< "one = " << one
<< "\n";
cout
<< "one + 1 = " << (one
+ 1) << "\n";
cout
<< "two = " << two
<< "\n";
cout
<< "\nEnd of test\n";