use Benchmark qw(:all); use Math::GMP; sub recurse { #divide and conquer unshift @_, 1 if 2 != @_; my ($m, $n) = @_; if ($m < $n) { my $k = int($m/2 + $n/2); return recurse($m, $k) * recurse($k+1, $n); } else { return new Math::GMP $m; } } sub iterate { my $result = new Math::GMP 1; $result *= $_ for 2..shift; return $result } sub direct { my $result = new Math::GMP shift; return $result->bfac(); } cmpthese(10, { 'recurse' => sub { recurse( 25_000) }, 'iterate' => sub { iterate( 25_000) }, 'direct' => sub { direct( 25_000) }, });