Engel expansion

sub to-engel ($rat is copy) { do while $rat { my $a = ceiling 1 / $rat; $rat = $rat × $a - 1; $a } }

sub from-engel (@expanded) { sum [\×] @expanded.map: { FatRat.new: 1, $_ } }

for #  low precision 𝜋, 𝑒, √2 and 1.5 to a power
    3.14159265358979, 2.71828182845904, 1.414213562373095, 1.5 ** 5,

    # high precision 𝜋, 𝑒, and √2 and 1.5 to a power
    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211.FatRat,

    2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642743.FatRat,

    1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927558.FatRat,

    1.5 ** 8
  -> $rat {
    say "Rational number: $rat";
    my @expanded = $rat.&to-engel;
    put "Engel expansion: " ~ @expanded.head(30);
    say " Converted back: " ~ @expanded.&from-engel;
    put '';
}

Output:

Last updated

Was this helpful?