home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / g__lib / tinteger.cc < prev    next >
C/C++ Source or Header  |  1993-07-23  |  10KB  |  398 lines

  1. /*
  2.  a test file for Integer class
  3.  */
  4.  
  5. #include <Integer.h>
  6. #include <assert.h>
  7.  
  8. #define tassert(ex) { cerr << #ex; \
  9.                        if ((ex)) cerr << " OK\n"; \
  10.                        else cerr << " Fail\n"; }
  11.  
  12.  
  13. Integer factorial(Integer n)
  14. {
  15.   Integer f;
  16.   if (n < 0)
  17.     f = 0;
  18.   else
  19.   {
  20.     f = 1;
  21.     while (n > 0)
  22.     {
  23.       f *= n;
  24.       --n;
  25.     }
  26.   }
  27.   return f;
  28. }
  29.  
  30. IntTmp fibonacci(long n)
  31. {
  32.   Integer f;
  33.   if (n <= 0)
  34.     f = 0;
  35.   else
  36.   {
  37.     f = 1;
  38.     Integer prev = 0;
  39.     Integer tmp;
  40.     while (n > 1)
  41.     {
  42.       tmp = f;
  43.       f += prev;
  44.       prev = tmp;
  45.       --n;
  46.     }
  47.   }
  48.   return f;
  49. }
  50.  
  51.  
  52. void identitytest(Integer& a, Integer& b, Integer& c)
  53. {
  54.   assert( -(-a) ==  a);
  55.   assert( (a + b) ==  (b + a));
  56.   assert( (a + (-b)) ==  (a - b));
  57.   assert( (a * b) ==  (b * a));
  58.   assert( (a * (-b)) ==  -(a * b));
  59.   assert( (a / (-b)) ==  -(a / b));
  60.   assert( (a - b) ==  -(b - a));
  61.   assert( (a + (b + c)) ==  ((a + b) + c));
  62.   assert( (a * (b * c)) ==  ((a * b) * c));
  63.   assert( (a * (b + c)) ==  ((a * b) + (a * c)));
  64.   assert( ((a - b) + b) ==  a);
  65.   assert( ((a + b) - b) ==  a);
  66.   assert( ((a * b) / b) ==  a);
  67.   assert( ((a * b) % b) ==  0);
  68.   assert( (b * (a / b) + (a % b)) ==  a);
  69.   assert( ((a + b) % c) ==  ((a % c) + (b % c)) % c);
  70. }
  71.  
  72. void utiltest(Integer& a)
  73. {
  74.   assert(sqrt(sqr(a)) == a);
  75.   assert(sqr(sqrt(a)) <= a);
  76.  
  77.   Integer x = 1;
  78.   for (int i = 0; i < 10; ++i)
  79.   {
  80.     assert(pow(a, i) == x);
  81.     x *= a;
  82.   }
  83.   setbit(x, 0);
  84.   assert(testbit(x, 0));
  85.   assert(odd(x));
  86.   assert(!even(x));
  87.   clearbit(x, 0);
  88.   clearbit(x, 1);
  89.   assert(even(x));
  90.   assert(!odd(x));
  91.   assert(x % 4 == 0);
  92.  
  93. }
  94.  
  95. void bittest(Integer& a, Integer& b, Integer& c)
  96. {
  97.   assert( (a | b) ==  (b | a));
  98.   assert( (a & b) ==  (b & a));
  99.   assert( (a ^ b) ==  (b ^ a));
  100.   assert( (a | (b | c)) ==  ((a | b) | c));
  101.   assert( (a & (b & c)) ==  ((a & b) & c));
  102.   assert( (a & (b | c)) ==  ((a & b) | (a & c)));
  103.   assert( (a | (b & c)) ==  ((a | b) & (a | c)));
  104.   assert( (a & (a | b)) ==  a);
  105.   assert( (a | (a & b)) ==  a);
  106. }
  107.  
  108. void accumtest(Integer& a, Integer& b, Integer& c)
  109. {
  110.   Integer x = a;
  111.   x *= b;
  112.   assert(x == (a * b));
  113.   x += c;
  114.   assert(x == ((a * b) + c));
  115.   x -= a;
  116.   assert(x == (((a * b) + c) - a));
  117.   x /= b;
  118.   assert(x == ((((a * b) + c) - a) / b));
  119.   x %= c;
  120.   assert(x == (((((a * b) + c) - a) / b) % c));
  121.   x &= a;
  122.   assert(x == ((((((a * b) + c) - a) / b) % c) & a));
  123.   x |= b;
  124.   assert(x == (((((((a * b) + c) - a) / b) % c) & a) | b));
  125.   x ^= c;
  126.   assert(x == ((((((((a * b) + c) - a) / b) % c) & a) | b) ^ c));
  127.  
  128.   assert(x.OK());
  129. }
  130.  
  131. void longidentitytest(Integer& a, long b, long c)
  132. {
  133.   assert( (a + b) ==  (b + a));
  134.   assert( (a + (-b)) ==  (a - b));
  135.   assert( (a * b) ==  (b * a));
  136.   assert( (a * (-b)) ==  -(a * b));
  137.   assert( (a / (-b)) ==  -(a / b));
  138.   assert( (a - b) ==  -(b - a));
  139.   assert( (a + (b + c)) ==  ((a + b) + c));
  140.   assert( (a * (b * c)) ==  ((a * b) * c));
  141.   assert( (a * (b + c)) ==  ((a * b) + (a * c)));
  142.   assert( ((a - b) + b) ==  a);
  143.   assert( ((a + b) - b) ==  a);
  144.   assert( ((a * b) / b) ==  a);
  145.   assert( ((a * b) % b) ==  0);
  146.   assert( (b * (a / b) + (a % b)) ==  a);
  147.   assert( ((a + b) % c) ==  ((a % c) + (b % c)) % c);
  148. }
  149.  
  150. void longbittest(Integer& a, long b, long c)
  151. {
  152.   assert( (a | b) ==  (b | a));
  153.   assert( (a & b) ==  (b & a));
  154.   assert( (a ^ b) ==  (b ^ a));
  155.   assert( (a | (b | c)) ==  ((a | b) | c));
  156.   assert( (a & (b & c)) ==  ((a & b) & c));
  157.   assert( (a & (b | c)) ==  ((a & b) | (a & c)));
  158.   assert( (a | (b & c)) ==  ((a | b) & (a | c)));
  159.   assert( (a & (a | b)) ==  a);
  160.   assert( (a | (a & b)) ==  a);
  161. }
  162.  
  163. void longaccumtest(Integer& a, long b, long c)
  164. {
  165.   Integer x = a;
  166.   x *= b;
  167.   assert(x == (a * b));
  168.   x += c;
  169.   assert(x == ((a * b) + c));
  170.   x -= a;
  171.   assert(x == (((a * b) + c) - a));
  172.   x /= b;
  173.   assert(x == ((((a * b) + c) - a) / b));
  174.   x %= c;
  175.   assert(x == (((((a * b) + c) - a) / b) % c));
  176.   x &= a;
  177.   assert(x == ((((((a * b) + c) - a) / b) % c) & a));
  178.   x |= b;
  179.   assert(x == (((((((a * b) + c) - a) / b) % c) & a) | b));
  180.   x ^= c;
  181.   assert(x == ((((((((a * b) + c) - a) / b) % c) & a) | b) ^ c));
  182.  
  183.   assert(x.OK());
  184. }
  185.  
  186. void anothertest()
  187. {
  188.   Integer pow64 = Ipow(2, 64);
  189.   cout << "pow64 = Ipow(2, 64) = " << pow64 << "\n";
  190.   assert(pow64.OK());
  191.   cout << "lg(pow64) = " << lg(pow64) << "\n";
  192.   assert(lg(pow64) == 64);
  193.   for (int k = 0; k < 64; ++k) assert(testbit(pow64, k) == 0);
  194.   assert(testbit(pow64, k) != 0);
  195.  
  196.   Integer s64 = 1;
  197.   s64 <<= 64;
  198.   cout << "s64 = 1 << 64 = " << s64 << "\n";
  199.   assert(s64.OK());
  200.  
  201.   assert(s64 == pow64);
  202.   assert(s64 >= pow64);
  203.   assert(s64 <= pow64);
  204.   assert(!(s64 != pow64));
  205.   assert(!(s64 > pow64));
  206.   assert(!(s64 < pow64));
  207.  
  208.   Integer s32 = s64 >> 32;
  209.   cout << "s32 = s64 >> 32 = " << s32 << "\n";
  210.   assert(s32.OK());
  211.   assert(lg(s32) == 32);
  212.   assert(!(pow64 == s32));
  213.   assert(!(pow64 < s32));
  214.   assert(!(pow64 <= s32));
  215.   assert(pow64 != s32);
  216.   assert(pow64 >= s32);
  217.   assert(pow64 > s32);
  218.  
  219.   Integer comps64 = ~s64;
  220.   cout << "comps64 = ~s64 = " << comps64 << "\n";
  221.   for (k = 0; k < 64; ++k) assert(testbit(comps64, k) == !testbit(s64, k));
  222.   Integer result = (comps64 & s32);
  223.   cout << "comps64 & s32 = " << result << "\n";
  224.   assert(result.OK());
  225.   result = (comps64 | s32);
  226.   cout << "comps64 | s32 = " << result << "\n";
  227.   assert(result.OK());
  228.   result = (comps64 ^ s32);
  229.   cout << "comps64 ^ s32 = " << result << "\n";
  230.   assert(result.OK());
  231.  
  232.   identitytest(s64, s32, comps64);
  233.   bittest(s32, s64, comps64);
  234.   accumtest(comps64, s32, pow64);
  235.   utiltest(s32);
  236.   longidentitytest(s64, 1000, 50);
  237.   longbittest(s64, 12345, 67890);
  238.   longaccumtest(s32, 100000, 1);
  239.  
  240. }
  241.  
  242. void iotest()
  243. {
  244.   Integer result;
  245.   cout << "\nenter an Integer: ";
  246.   cin >> result;
  247.   cout << "number = " << result << "\n";
  248.   assert(result.OK());
  249. }
  250.  
  251. void fibtest()
  252. {
  253.   Integer fib50 = fibonacci(50);
  254.   cout << "fib50 = fibonacci(50) = " << fib50 << "\n";
  255.   assert(fib50.OK());
  256.   Integer fib48 = fibonacci(48);
  257.   cout << "fib48 = fibonacci(48) = " << fib48 << "\n";
  258.   assert(fib48.OK());
  259.  
  260.   Integer result = fib48 + fib50;
  261.   cout << "fib48 + fib50 = " << result << "\n";
  262.   result = fib48 - fib50;
  263.   cout << "fib48 - fib50 = " << result << "\n";
  264.   result = fib48 * fib50;
  265.   cout << "fib48 * fib50 = " << result << "\n";
  266.   result = fib48 / fib50;
  267.   cout << "fib48 / fib50 = " << result << "\n";
  268.   result = fib48 % fib50;
  269.   cout << "fib48 % fib50 = " << result << "\n";
  270.   result = gcd(fib50, fib48);
  271.   cout << "gcd(fib50, fib48) = " << result << "\n";
  272.   result = sqrt(fib50);
  273.   cout << "sqrt(fib50) = " << result << "\n";
  274.  
  275.   identitytest(result, fib50, fib48);
  276.   bittest(result, fib50, fib48);
  277.   accumtest(result, fib50, fib48);
  278.   utiltest(fib48);
  279.   longidentitytest(fib50, 1000, 50);
  280.   longaccumtest(fib48, 100000, 1);
  281. }
  282.  
  283.  
  284. void facttest(Integer& one, Integer& two)
  285. {
  286.   Integer fact30(factorial(30));
  287.   cout << "fact30 = factorial(30) = " << fact30 << "\n";
  288.   assert(fact30.OK());
  289.  
  290.   Integer fact28(factorial(28));
  291.   cout << "fact28 = factorial(28) = " << fact28 << "\n";
  292.   assert(fact28.OK());
  293.   assert(fact30 == fact28 * 870);
  294.  
  295.   Integer result = fact30 + fact28;
  296.   cout << "fact30 + fact28 = " <<  result << "\n";
  297.   result = fact30 - fact28;
  298.   cout << "fact30 - fact28 = " << result << "\n";
  299.   result = fact30 * fact28;
  300.   cout << "fact30 * fact28 = " << result << "\n";
  301.   result = fact30 / fact28;
  302.   cout << "fact30 / fact28 = " << result << "\n";
  303.   result = fact30 % fact28;
  304.   cout << "fact30 % fact28 = " << result << "\n";
  305.  
  306.   result = -fact30;
  307.   cout << "-fact30 = " << result << "\n";
  308.   assert(abs(result) == fact30);
  309.  
  310.   cout << "lg(fact30) = " << lg(fact30) << "\n";
  311.   assert(lg(fact30) == 107);
  312.  
  313.   result = gcd(fact30, fact28);
  314.   cout << "gcd(fact30, fact28) = " << result << "\n";
  315.   assert(result == fact28);
  316.  
  317.   result = sqrt(fact30);
  318.   cout << "sqrt(fact30) = " << result << "\n";
  319.  
  320.   Integer negfact31 = fact30 * -31;
  321.   Integer posfact31 = abs(negfact31);
  322.   assert(negfact31.OK());
  323.   assert(posfact31.OK());
  324.   cout << "negfact31 = " << negfact31 << "\n";
  325.   result = fact30 + negfact31;
  326.   cout << "fact30 + negfact31 = " << result << "\n";
  327.   result = fact30 - negfact31;
  328.   cout << "fact30 - negfact31 = " << result << "\n";
  329.   result = fact30 * negfact31;
  330.   cout << "fact30 * negfact31 = " << result << "\n";
  331.   result = fact30 / negfact31;
  332.   cout << "fact30 / negfact31 = " << result << "\n";
  333.   result = fact30 % negfact31;
  334.   cout << "fact30 % negfact31 = " << result << "\n";
  335.   result = gcd(fact30, negfact31);
  336.   cout << "gcd(fact30, negfact31) = " << result << "\n";
  337.   assert(result == fact30);
  338.  
  339.   identitytest(one, one, one);
  340.   identitytest(one, one, one);
  341.   identitytest(one, two, fact30);
  342.   identitytest(fact30, posfact31, fact28);
  343.   identitytest(fact30, negfact31, fact28);
  344.   identitytest(negfact31, posfact31, fact28);
  345.  
  346.   bittest(one, one, one);
  347.   bittest(one, one, one);
  348.   bittest(one, two, fact30);
  349.   bittest(fact30, posfact31, fact28);
  350.  
  351.   accumtest(one, one, one);
  352.   accumtest(one, one, one);
  353.   accumtest(one, two, fact30);
  354.   accumtest(fact30, posfact31, fact28);
  355.  
  356.   utiltest(one);
  357.   utiltest(fact30);
  358.   utiltest(posfact31);
  359.  
  360.   longidentitytest(one, 1, 1);
  361.   longidentitytest(one, 2, 3);
  362.   longidentitytest(fact30, 3, -20);
  363.   longidentitytest(fact30, 4, 20000);
  364.   longidentitytest(negfact31, -100, 20000);
  365.  
  366.   longbittest(one, 1, 1);
  367.   longbittest(one, 2, 3);
  368.   longbittest(fact30, 4, 20000);
  369.   longbittest(fact28, 1000, 50);
  370.  
  371.   longaccumtest(one, 1, 1);
  372.   longaccumtest(one, 2, 3);
  373.   longaccumtest(fact30, 4, 20000);
  374.   longaccumtest(fact30, 1000, 50);
  375.   longaccumtest(fact28, 10000000, 100000000);
  376. }
  377.  
  378. main()
  379. {
  380.   Integer one = 1;
  381.   cout << "one = " << one << "\n";
  382.   assert(one.OK());
  383.   assert(one == 1);
  384.   cout << "one + 1 = " << (one + 1) << "\n";
  385.  
  386.   Integer two = 2;
  387.   cout << "two = " << two << "\n";
  388.   assert(two.OK());
  389.   assert(two == 2);
  390.  
  391.   facttest(one, two);
  392.   fibtest();
  393.   anothertest();
  394.   iotest();
  395.  
  396.   cout << "\nEnd of test\n";
  397. }
  398.