public static object BIDivide(BigInteger n, BigInteger d) { if (d.Equals(BigIntegerZero)) throw new ArithmeticException("Divide by zero"); BigInteger gcd = n.gcd(d); if (gcd.Equals(BigIntegerZero)) return 0; n = n.divide(gcd); d = d.divide(gcd); if (d.Equals(BigIntegerOne)) return reduce(n); return new Ratio((d.signum() < 0 ? n.negate() : n), (d.signum() < 0 ? d.negate() : d)); }