user
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 tasks

* Perfect Numbers
* Check Machin-like formulas
assistant
(formerly Perl 6)

**Works with**: rakudo version 2016.08

Raku supports rational arithmetic natively.

```
(2..2**19).hyper.map: -> $candidate {
    my $sum = 1 / $candidate;
    for 2 .. ceiling(sqrt($candidate)) -> $factor {
        if $candidate %% $factor {
            $sum += 1 / $factor + 1 / ($candidate / $factor);
        }
    }
    if $sum.nude[1] == 1 {
        say "Sum of reciprocal factors of $candidate = $sum exactly", ($sum == 1 ?? ", perfect!" !! ".");
    }
}

```

Note also that ordinary decimal literals are stored as Rats, so the following loop always stops exactly on 10 despite 0.1 not being exactly representable in floating point:

```
for 1.0, 1.1, 1.2 ... 10 { .say }

```

The arithmetic is all done in rationals, which are converted to floating-point just before display so that people don't have to puzzle out what 53/10 means.