Arithmetic/Rational: Difference between revisions

Line 845:
class Rational(n: Long, d:Long) extends Ordered[Rational]
{
require(d!=0)
private val g:Long = gcd(n, d)
val numerator:Long = n/g
val denominator:Long = d/g
 
def this(n:Long)=this(n,1)
 
def +(that:Rational):Rational=new Rational(
numerator*that.denominator + that.numerator*denominator,
denominator*that.denominator)
 
def -(that:Rational):Rational=new Rational(
numerator*that.denominator - that.numerator*denominator,
denominator*that.denominator)
 
def *(that:Rational):Rational=
new Rational(numerator*that.numerator, denominator*that.denominator)
 
def /(that:Rational):Rational=
new Rational(numerator*that.denominator, that.numerator*denominator)
 
def unary_~ :Rational=new Rational(denominator, numerator)
 
def unary_- :Rational=new Rational(-numerator, denominator)
 
def abs :Rational=new Rational(Math.abs(numerator), Math.abs(denominator))
 
override def compare(that:Rational):Int=
(this.numerator*that.denominator-that.numerator*this.denominator).toInt
 
override def toString()=numerator+"/"+denominator
 
private def gcd(x:Long, y:Long):Long=
if(y==0) x else gcd(y, x%y)
}
 
Line 892:
def find_perfects():Unit=
{
for (candidate <- 2 until 1<<19)
{
var sum= ~Rational(candidate)
for (factor <- 2 until (Math.sqrt(candidate)+1).toInt)
{
{
if (candidate%factor==0)
sum+= ~Rational(factor)+ ~Rational(candidate/factor)
}
}
 
if (sum.denominator==1 && sum.numerator==1)
printf("Perfect number %d sum is %s\n", candidate, sum);
}
}
}
</lang>
Anonymous user