Skip to content
Snippets Groups Projects
Commit 2f22bb55 authored by Regis Blanc's avatar Regis Blanc Committed by Nicolas Voirol
Browse files

Rational defined using class invariants

parent 741fbbe1
No related branches found
No related tags found
No related merge requests found
...@@ -9,72 +9,65 @@ import scala.language.implicitConversions ...@@ -9,72 +9,65 @@ import scala.language.implicitConversions
@library @library
case class Rational(numerator: BigInt, denominator: BigInt) { case class Rational(numerator: BigInt, denominator: BigInt) {
require(this.isRational)
def +(that: Rational): Rational = { def +(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.denominator + that.numerator*this.denominator, this.denominator*that.denominator) Rational(this.numerator*that.denominator + that.numerator*this.denominator, this.denominator*that.denominator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def -(that: Rational): Rational = { def -(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.denominator - that.numerator*this.denominator, this.denominator*that.denominator) Rational(this.numerator*that.denominator - that.numerator*this.denominator, this.denominator*that.denominator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def unary_- : Rational = { def unary_- : Rational = {
require(this.isRational)
Rational(-this.numerator, this.denominator) Rational(-this.numerator, this.denominator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def *(that: Rational): Rational = { def *(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.numerator, this.denominator*that.denominator) Rational(this.numerator*that.numerator, this.denominator*that.denominator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def /(that: Rational): Rational = { def /(that: Rational): Rational = {
require(this.isRational && that.isRational && that.nonZero) require(that.nonZero)
val newNumerator = this.numerator*that.denominator val newNumerator = this.numerator*that.denominator
val newDenominator = this.denominator*that.numerator val newDenominator = this.denominator*that.numerator
normalize(newNumerator, newDenominator) normalize(newNumerator, newDenominator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def reciprocal: Rational = { def reciprocal: Rational = {
require(this.isRational && this.nonZero) require(this.nonZero)
normalize(this.denominator, this.numerator) normalize(this.denominator, this.numerator)
} ensuring(res => res.isRational) } ensuring(res => res.isRational)
def ~(that: Rational): Boolean = { def ~(that: Rational): Boolean = {
require(this.isRational && that.isRational)
this.numerator*that.denominator == that.numerator*this.denominator this.numerator*that.denominator == that.numerator*this.denominator
} }
def <(that: Rational): Boolean = { def <(that: Rational): Boolean = {
require(this.isRational && that.isRational)
this.numerator*that.denominator < that.numerator*this.denominator this.numerator*that.denominator < that.numerator*this.denominator
} }
def <=(that: Rational): Boolean = { def <=(that: Rational): Boolean = {
require(this.isRational && that.isRational)
this.numerator*that.denominator <= that.numerator*this.denominator this.numerator*that.denominator <= that.numerator*this.denominator
} }
def >(that: Rational): Boolean = { def >(that: Rational): Boolean = {
require(this.isRational && that.isRational)
this.numerator*that.denominator > that.numerator*this.denominator this.numerator*that.denominator > that.numerator*this.denominator
} }
def >=(that: Rational): Boolean = { def >=(that: Rational): Boolean = {
require(this.isRational && that.isRational)
this.numerator*that.denominator >= that.numerator*this.denominator this.numerator*that.denominator >= that.numerator*this.denominator
} }
def nonZero: Boolean = { def nonZero: Boolean = {
require(this.isRational)
numerator != 0 numerator != 0
} }
def isRational: Boolean = denominator > 0 private def isRational: Boolean = denominator > 0
private def normalize(num: BigInt, den: BigInt): Rational = { private def normalize(num: BigInt, den: BigInt): Rational = {
require(den != 0)
if(den < 0) if(den < 0)
Rational(-num, -den) Rational(-num, -den)
else else
...@@ -88,4 +81,5 @@ object Rational { ...@@ -88,4 +81,5 @@ object Rational {
implicit def bigIntToRat(n: BigInt): Rational = Rational(n, 1) implicit def bigIntToRat(n: BigInt): Rational = Rational(n, 1)
def apply(n: BigInt): Rational = Rational(n, 1) def apply(n: BigInt): Rational = Rational(n, 1)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment