RosettaCodeData/Task/Pi/Perl-6/pi.pl6

34 lines
784 B
Raku
Raw Permalink Normal View History

2013-04-10 22:43:41 -07:00
# based on http://www.mathpropress.com/stan/bibliography/spigot.pdf
sub stream(&next, &safe, &prod, &cons, $z is copy, @x) {
gather loop {
2013-10-27 22:24:23 +00:00
$z = safe($z, my $y = next($z)) ??
prod($z, take $y) !!
2019-09-12 10:33:56 -07:00
cons($z, @x[$++])
2013-04-10 22:43:41 -07:00
}
}
sub extr([$q, $r, $s, $t], $x) {
2013-10-27 22:24:23 +00:00
($q * $x + $r) div ($s * $x + $t)
2013-04-10 22:43:41 -07:00
}
sub comp([$q,$r,$s,$t], [$u,$v,$w,$x]) {
[$q * $u + $r * $w,
$q * $v + $r * $x,
$s * $u + $t * $w,
2013-10-27 22:24:23 +00:00
$s * $v + $t * $x]
2013-04-10 22:43:41 -07:00
}
2015-11-18 06:14:39 +00:00
my $pi :=
2013-04-10 22:43:41 -07:00
stream -> $z { extr($z, 3) },
-> $z, $n { $n == extr($z, 4) },
-> $z, $n { comp([10, -10*$n, 0, 1], $z) },
&comp,
2013-10-27 22:24:23 +00:00
<1 0 0 1>,
2013-04-10 22:43:41 -07:00
(1..*).map: { [$_, 4 * $_ + 2, 0, 2 * $_ + 1] }
2015-11-18 06:14:39 +00:00
for ^Inf -> $i {
print $pi[$i];
2013-10-27 22:24:23 +00:00
once print '.'
}