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


$ include "seed7_05.s7i";
  include "rational.s7i";
 
const func boolean: isPerfect (in integer: candidate) is func
  result
    var boolean: isPerfect is FALSE;
  local
    var integer: divisor is 0;
    var rational: sum is rational.value;
  begin
    sum := 1 / candidate;
    for divisor range 2 to sqrt(candidate) do
      if candidate mod divisor = 0 then
        sum +:= 1 / divisor + 1 / (candidate div divisor);
      end if;
    end for;
    isPerfect := sum = rat(1);
  end func;
 
const proc: main is func
  local
    var integer: candidate is 0;
  begin
    for candidate range 2 to 2 ** 19 - 1 do
      if isPerfect(candidate) then
        writeln(candidate <& " is perfect");
      end if;
    end for;
  end func;