aboutsummaryrefslogtreecommitdiff
path: root/Perl/pi.pl
blob: 263b312478f85fd50afdd549bb48c2da3b104d08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/perl
#!/data/data/com.termux/files/usr/bin/perl

if (grep(/^$ARGV[0]$/, ('h', '-h', '--help'))) {
    print "m.pl MAX_VALUE TOTAL_PAIRS\n";
    exit;
}

($max_val, $total) = (shift // 120, shift // 500);

print "PI estimate: " . est_pi($max_val, $total) . " with $total numbers between 0 and $max_val.\n";

sub est_pi($$) {
    my ($MAX_VAL, $TOTAL) = @_;
    my $total_coprime;

    foreach (1 .. $TOTAL) {
        my $gcd = gcd_iter(rnd_int($MAX_VAL), rnd_int($MAX_VAL));

        $total_coprime += ($gcd == 1);
    }
        
    return sqrt(6/($total_coprime/$TOTAL));
}

sub rnd_int($) {
    return int(rand(shift) + 0.5);
}

sub gcd_iter($$) {
  my ($u, $v) = @_;
  while ($v) {
    ($u, $v) = ($v, $u % $v);
  }
  return abs($u);
}