public static object BIDivide(BigInteger n, BigInteger d)
{
if (d.Equals(BigInteger.Zero))
throw new ArithmeticException("Divide by zero");
BigInteger gcd = n.Gcd(d);
if (gcd.Equals(BigInteger.Zero))
return BigInt.ZERO;
n = n / gcd;
d = d / gcd;
if (d.Equals(BigInteger.One))
return BigInt.fromBigInteger(n);
else if (d.Equals(BigInteger.NegativeOne))
return BigInt.fromBigInteger(n.Negate());
return new Ratio((d.Signum < 0 ? -n : n), d.Abs());
}