There is a problem with modulus calculation when the dividend and/or the divisor are negative numbers.
import 'package:rational/rational.dart';
import 'package:test/test.dart';
Rational mod(Rational one, Rational other) {
Rational remainder = one.remainder(other);
if (remainder == new Rational(0)) return remainder;
if (remainder.isNegative) {
if (other.isNegative) {
return remainder;
}
return other + remainder;
}
if (other.isNegative) return other + remainder;
return remainder;
}
Rational mod2(Rational one, Rational other) {
Rational remainder = one.remainder(other);
if (remainder.signum + other.signum == 0) return other + remainder;
return remainder;
}
main() {
test('test Modulus', () {
expect(new Rational(5) % new Rational(4), equals(new Rational(1)));
expect(new Rational(-5) % new Rational(4), equals(new Rational(3)));
expect(new Rational(5) % new Rational(-4), equals(new Rational(-3)));
expect(new Rational(-5) % new Rational(-4), equals(new Rational(-1)));
expect(new Rational(4) % new Rational(4), equals(new Rational(0)));
expect(new Rational(-4) % new Rational(4), equals(new Rational(0)));
expect(new Rational(4) % new Rational(-4), equals(new Rational(0)));
expect(new Rational(-4) % new Rational(-4), equals(new Rational(0)));
});
test('test new version', () {
expect(mod(new Rational(5), new Rational(4)), equals(new Rational(1)));
expect(mod(new Rational(-5), new Rational(4)), equals(new Rational(3)));
expect(mod(new Rational(5), new Rational(-4)), equals(new Rational(-3)));
expect(mod(new Rational(-5), new Rational(-4)), equals(new Rational(-1)));
expect(mod(new Rational(4), new Rational(4)), equals(new Rational(0)));
expect(mod(new Rational(-4), new Rational(4)), equals(new Rational(0)));
expect(mod(new Rational(4), new Rational(-4)), equals(new Rational(0)));
expect(mod(new Rational(-4), new Rational(-4)), equals(new Rational(0)));
});
test('test new Version "compact"', () {
expect(mod2(new Rational(5), new Rational(4)), equals(new Rational(1)));
expect(mod2(new Rational(-5), new Rational(4)), equals(new Rational(3)));
expect(mod2(new Rational(5), new Rational(-4)), equals(new Rational(-3)));
expect(mod2(new Rational(-5), new Rational(-4)), equals(new Rational(-1)));
expect(mod2(new Rational(4), new Rational(4)), equals(new Rational(0)));
expect(mod2(new Rational(-4), new Rational(4)), equals(new Rational(0)));
expect(mod2(new Rational(4), new Rational(-4)), equals(new Rational(0)));
expect(mod2(new Rational(-4), new Rational(-4)), equals(new Rational(0)));
});
}