#!/usr/bin/perl -w
#
# Caluclate Buenos Aires constant - https://youtu.be/_gCKX6VMvmU
# Alternate sum of infinite series method
# (C)Nov 26 2020 Pegasus Epsilon - Educational Purposes Only
#
# premise:
#
# A C A*D + B*C
# --- + --- == -----------
# B D B*D
#
# X = product of previous denominators
#
# (P(n - 1) - 1) (P(n) - 1)
# ---------------- + --------------
# X X * P(n - 1)
#
# N = previous numerator
#
# newN = N*X*P(n-1) + X*(P(n) - 1)
# newX = X*X*P(n-1)
#
# num = oldnum * newden + newnum * oldden
# den *= newden
use strict;
use Math::BigFloat;
use v5.10;
@_ = map { chomp; $_ } <DATA>; # read saved data
close DATA;
my ($op,$obn,$obd) = ($_[$#_] =~ /(.*),(.*),(.*)/); # split the last entry
@_ = map { /([^,]*)/ } @_; # discard the constant convergence log
open my $data, '>>', $0;
sub divide { Math::BigFloat->new(shift)->fdiv(shift, 2 * length shift) }
sub product { my $prod = 1; $prod *= $_ for @_; $prod }
say "resuming from $op";
say "Buenos Aires constant: $obn / $obd = ".divide($obn, $obd, $obn);
my $nbd = $obd;
for (my $np = $op; ; $np++) {
my $sqrt = sqrt($np);
unless ($sqrt == int($sqrt)) {
foreach my $d (@_) {
last if 0 == $np % $d;
next if $d < $sqrt;
say "$np is prime";
$nbd *= $op;
say "add ($np - 1) / $nbd = ".(($np - 1) / $nbd);
my $nbn = $obn * $obd * $op + $obd * ($np - 1);
say "obd: $obd, nbd: $nbd";
say "obn: $obn, nbn: $nbn";
say "Buenos Aires constant: ".divide($nbn, $nbd, $nbn);
push @_, $np;
($op, $obn, $obd) = ($np, $nbn, $nbd);
last;
}
}
}
#2: ... + 2 - 1 / 1 = 1/1 `-=> 1
#3: ... + 3 - 1 / 2 = 2/ 2 = 1/1 `-=> 2
#5: ... + 5 - 1 / 6 = 4/ 6 = 2/3 `-=> 2.666
#7: ... + 7 - 1 / 30 = 6/30 = 1/5 `-=> 2.866
__DATA__
2,1,1