Almkvist-Giullera formula for pi: Difference between revisions

Content added Content deleted
(Added Sidef)
m (→‎{{header|Perl}}: code simplifications)
Line 449: Line 449:
use Math::AnyNum <:overload factorial>;
use Math::AnyNum <:overload factorial>;


sub almkvist_giullera_integral {
my $Precision = 70;

sub Integral {
my($n) = @_;
my($n) = @_;
int (2**5 * factorial(6*$n) * (532*$n**2 + 126*$n + 9)) / (3*factorial($n)**6)
(32 * (14*$n * (38*$n + 9) + 9) * factorial(6*$n)) / (3*factorial($n)**6);
}
}


sub A_G {
sub almkvist_giullera {
my($n) = @_;
my($n) = @_;
Integral($n) / (10**(6*$n + 3));
almkvist_giullera_integral($n) / (10**(6*$n + 3));
}
}


sub Pi {
sub almkvist_giullera_pi {
my($n) = @_;
my ($prec) = @_;

local $Math::AnyNum::PREC = 5 * $Precision;
state $AGcache = 0;
local $Math::AnyNum::PREC = 4*($prec+1);

$AGcache += A_G($n);
my $sum = 0;
Math::AnyNum::pow($AGcache,-0.5)->round(-$Precision)->stringify;
my $target = '';

for (my $n = 0; ; ++$n) {
$sum += almkvist_giullera($n);
my $curr = ($sum**-.5)->as_dec;
return $target if ($curr eq $target);
$target = $curr;
}
}
}


say 'First 10 integer portions: ';
say 'First 10 integer portions: ';
say "$_ " . Integral($_) for 0..9;
say "$_ " . almkvist_giullera_integral($_) for 0..9;


my $next = '';
my $precision = 70;
my $target = Pi(my $Nth = 0);
while () {
last if ($next = Pi(++$Nth)) eq $target;
$target = $next;
}


printf "π to $Precision decimal places is:\n$target";</lang>
printf("π to %s decimal places is:\n%s\n",
$precision, almkvist_giullera_pi($precision));</lang>
{{out}}
{{out}}
<pre>First 10 integer portions:
<pre>First 10 integer portions: