Task

Create a reasonably complete implementation of rational arithmetic in the particular language using the idioms of the language.



Example

Define a new type called frac with binary operator "//" of two integers that returns a structure made up of the numerator and the denominator (as per a rational number).

Further define the appropriate rational unary operators abs and '-', with the binary operators for addition '+', subtraction '-', multiplication '×', division '/', integer division '÷', modulo division, the comparison operators (e.g. '<', '≤', '>', & '≥') and equality operators (e.g. '=' & '≠').

Define standard coercion operators for casting int to frac etc.

If space allows, define standard increment and decrement operators (e.g. '+:=' & '-:=' etc.).

Finally test the operators:
Use the new type frac to find all perfect numbers less than 219 by summing the reciprocal of the factors.



Related task

   Perfect Numbers


 
program Arithmetic_Rational;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils,
  Boost.Rational;
 
var
  sum: TFraction;
  max: Integer = 1 shl 19;
  candidate, max2, factor: Integer;
 
begin
  for candidate := 2 to max - 1 do
  begin
    sum := Fraction(1, candidate);
    max2 := Trunc(Sqrt(candidate));
    for factor := 2 to max2 do
    begin
      if (candidate mod factor) = 0 then
      begin
        sum := sum + Fraction(1, factor);
        sum := sum + Fraction(1, candidate div factor);
      end;
    end;
    if sum = Fraction(1) then
      Writeln(candidate, ' is perfect');
  end;
  Readln;
end.