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?