
require 'rational'
require 'pp'

require 'test/unit'

class GcdTest < Test::Unit::TestCase

  @@biggest_positive_fixnum = 1
  until (x = ((@@biggest_positive_fixnum << 1) + 1)).class == Bignum
    @@biggest_positive_fixnum = x
  end
  @@biggest_positive_fixnum = (@@biggest_positive_fixnum - 10)
  until (x = (@@biggest_positive_fixnum + 1)).class == Bignum
    @@biggest_positive_fixnum = x
  end
  @@smallest_positive_bignum = x
  
  @@biggest_negative_fixnum = -1
  until (x = (@@biggest_negative_fixnum << 1)).class == Bignum
    @@biggest_negative_fixnum = x
  end
  until (x = (@@biggest_negative_fixnum - 1)).class == Bignum
    @@biggest_negative_fixnum = x
  end
  @@smallest_negative_bignum = x
  
  def xc x
    [ x.class, x ].inspect
  end

  # values generated from by 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
@@expected = 
[["[Fixnum, 1] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Fixnum, 4] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Fixnum, -4] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Fixnum, -1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Bignum, 1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Bignum, 1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Fixnum, -1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, 2] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 2] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, 4] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, 4] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Fixnum, -1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Bignum, 1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Bignum, 1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Fixnum, -1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, 4] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 4] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Fixnum, 5] gcd [Fixnum, 25] => ", "[Fixnum, 5]"],
 ["[Fixnum, 5] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Fixnum, 5] gcd [Fixnum, -25] => ", "[Fixnum, 5]"],
 ["[Fixnum, 5] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 5] gcd [Bignum, -1073741825] => ", "[Fixnum, 5]"],
 ["[Fixnum, 5] gcd [Bignum, 1073741825] => ", "[Fixnum, 5]"],
 ["[Fixnum, 25] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Fixnum, 25] gcd [Fixnum, 25] => ", "[Fixnum, 25]"],
 ["[Fixnum, 25] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Fixnum, 25] gcd [Fixnum, -25] => ", "[Fixnum, 25]"],
 ["[Fixnum, 25] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 25] gcd [Bignum, -1073741825] => ", "[Fixnum, 25]"],
 ["[Fixnum, 25] gcd [Bignum, 1073741825] => ", "[Fixnum, 25]"],
 ["[Fixnum, -1] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Fixnum, 4] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Fixnum, -4] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Fixnum, -1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Bignum, 1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Bignum, 1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Fixnum, -1073741824] => ", "[Fixnum, 2]"],
 ["[Fixnum, -2] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -2] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -4] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -4] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Fixnum, -1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Bignum, 1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Bignum, 1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Fixnum, -1073741824] => ", "[Fixnum, 4]"],
 ["[Fixnum, -4] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -4] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Fixnum, -5] gcd [Fixnum, 25] => ", "[Fixnum, 5]"],
 ["[Fixnum, -5] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Fixnum, -5] gcd [Fixnum, -25] => ", "[Fixnum, 5]"],
 ["[Fixnum, -5] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -5] gcd [Bignum, -1073741825] => ", "[Fixnum, 5]"],
 ["[Fixnum, -5] gcd [Bignum, 1073741825] => ", "[Fixnum, 5]"],
 ["[Fixnum, -25] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Fixnum, -25] gcd [Fixnum, 25] => ", "[Fixnum, 25]"],
 ["[Fixnum, -25] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Fixnum, -25] gcd [Fixnum, -25] => ", "[Fixnum, 25]"],
 ["[Fixnum, -25] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -25] gcd [Bignum, -1073741825] => ", "[Fixnum, 25]"],
 ["[Fixnum, -25] gcd [Bignum, 1073741825] => ", "[Fixnum, 25]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1073741823]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -1073741823] => ",
  "[Fixnum, 1073741823]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, 1073741823] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, 1073741823] => ",
  "[Fixnum, 1073741823]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -1073741823] => ",
  "[Fixnum, 1073741823]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741823] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741824] => ", "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741824] => ", "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741824] => ", "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741824] => ", "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Bignum, 1073741824] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741824] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -2] => ", "[Fixnum, 2]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -4] => ", "[Fixnum, 4]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -5] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -25] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Fixnum, -1073741824] => ",
  "[Bignum, 1073741824]"],
 ["[Fixnum, -1073741824] gcd [Bignum, -1073741825] => ", "[Fixnum, 1]"],
 ["[Fixnum, -1073741824] gcd [Bignum, 1073741825] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 25] => ", "[Fixnum, 25]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -25] => ", "[Fixnum, 25]"],
 ["[Bignum, -1073741825] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, -1073741825] gcd [Bignum, -1073741825] => ",
  "[Bignum, 1073741825]"],
 ["[Bignum, -1073741825] gcd [Bignum, 1073741825] => ",
  "[Bignum, 1073741825]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 2] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 4] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 5] => ", "[Fixnum, 5]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 25] => ", "[Fixnum, 25]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -1] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -2] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -4] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -5] => ", "[Fixnum, 5]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -25] => ", "[Fixnum, 25]"],
 ["[Bignum, 1073741825] gcd [Fixnum, 1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -1073741823] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Bignum, 1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Fixnum, -1073741824] => ", "[Fixnum, 1]"],
 ["[Bignum, 1073741825] gcd [Bignum, -1073741825] => ",
  "[Bignum, 1073741825]"],
 ["[Bignum, 1073741825] gcd [Bignum, 1073741825] => ", "[Bignum, 1073741825]"]]


  def test_results
    values = 
      [
       1, 2, 4, 5, 25,
       -1, -2, -4, -5, -25,
       @@biggest_positive_fixnum, - @@biggest_positive_fixnum,
       @@biggest_negative_fixnum, - @@biggest_negative_fixnum,
       @@smallest_positive_bignum, - @@smallest_positive_bignum,
       @@smallest_negative_bignum, - @@smallest_negative_bignum,
      ]

    results = [ ]
    values.each do | x |
      values.each do | y |
        results <<
          [ "#{xc(x)} gcd #{xc(y)} => ", 
            begin
              xc(x.gcd(y))
            rescue => err
              err
            end
          ]
      end
    end
    
    if @@expected 
      if results != @@expected
        pp [ :expected, expected ]
        pp [ :results,  results ]
        assert_equal expected, results
      end
    else
      puts "@@expected = "
      pp results
    end
  end
end



