def test_egcd_consistency(a, b):
    d, x, y = extended_gcd(a, b)
    if a == b == 0:
        assert d == x == y == 0
    elif a == 0:
        assert d == b and x == 0 and y == 1
    elif b == 0:
        assert d == a and x == 1 and y == 0
    else:
        qa = max(1, (a / d) / 2)
        qb = max(1, (b / d) / 2)
        assert (a % d == 0 and b % d == 0
                and a * x + b * y == d
                and -qb <= x <= qb
                and -qa <= y <= qa)
def test_egcd_reversed(a, b):
    if a != b:
        d0, x0, y0 = extended_gcd(a, b)
        d1, x1, y1 = extended_gcd(b ,a)
        assert (d0, x0, y0) == (d1, y1, x1)
def test_egcd_ret_type(a ,b):
    d, x, y = extended_gcd(a, b)
    assert_is_integer(d)
    assert_is_integer(x)
    assert_is_integer(y)
def test_egcd_known(a, b, d, x ,y):
    assert (d, x, y) == extended_gcd(a, b)
def test_egcd_seq_type(a, b):
    assert type(extended_gcd(a, b)) == tuple