diff --git a/library/lang/Rational.scala b/library/lang/Rational.scala index f4a10215b61032a73f20107c5aeddbac841e66bc..1bcb679a0d4abf6b168117b2af819fa41e027315 100644 --- a/library/lang/Rational.scala +++ b/library/lang/Rational.scala @@ -9,72 +9,65 @@ import scala.language.implicitConversions @library case class Rational(numerator: BigInt, denominator: BigInt) { + require(this.isRational) + def +(that: Rational): Rational = { - require(this.isRational && that.isRational) Rational(this.numerator*that.denominator + that.numerator*this.denominator, this.denominator*that.denominator) } ensuring(res => res.isRational) def -(that: Rational): Rational = { - require(this.isRational && that.isRational) Rational(this.numerator*that.denominator - that.numerator*this.denominator, this.denominator*that.denominator) } ensuring(res => res.isRational) def unary_- : Rational = { - require(this.isRational) Rational(-this.numerator, this.denominator) } ensuring(res => res.isRational) def *(that: Rational): Rational = { - require(this.isRational && that.isRational) Rational(this.numerator*that.numerator, this.denominator*that.denominator) } ensuring(res => res.isRational) def /(that: Rational): Rational = { - require(this.isRational && that.isRational && that.nonZero) + require(that.nonZero) val newNumerator = this.numerator*that.denominator val newDenominator = this.denominator*that.numerator normalize(newNumerator, newDenominator) } ensuring(res => res.isRational) def reciprocal: Rational = { - require(this.isRational && this.nonZero) + require(this.nonZero) normalize(this.denominator, this.numerator) } ensuring(res => res.isRational) def ~(that: Rational): Boolean = { - require(this.isRational && that.isRational) this.numerator*that.denominator == that.numerator*this.denominator } def <(that: Rational): Boolean = { - require(this.isRational && that.isRational) this.numerator*that.denominator < that.numerator*this.denominator } def <=(that: Rational): Boolean = { - require(this.isRational && that.isRational) this.numerator*that.denominator <= that.numerator*this.denominator } def >(that: Rational): Boolean = { - require(this.isRational && that.isRational) this.numerator*that.denominator > that.numerator*this.denominator } def >=(that: Rational): Boolean = { - require(this.isRational && that.isRational) this.numerator*that.denominator >= that.numerator*this.denominator } def nonZero: Boolean = { - require(this.isRational) numerator != 0 } - def isRational: Boolean = denominator > 0 + private def isRational: Boolean = denominator > 0 private def normalize(num: BigInt, den: BigInt): Rational = { + require(den != 0) if(den < 0) Rational(-num, -den) else @@ -88,4 +81,5 @@ object Rational { implicit def bigIntToRat(n: BigInt): Rational = Rational(n, 1) def apply(n: BigInt): Rational = Rational(n, 1) + }