#
# Usage:
# factorial($n) = 1*2*...*$n
# factorial($m, $n) = $m*($m+1)*...*$n
#
sub factorial {
#divide and conquer
unshift @_, 1 if 2 != @_;
my ($m, $n) = @_;
if ($m < $n) {
my $k = int($m/2 + $n/2);
return factorial($m, $k) * factorial($k+1, $n);
}
else {
return Math::BigInt->new($m);
}
}
####
return Math::BigInt->new(factorial($m, $k))->bmul(factorial($k+1,$n));
####
return factorial($m, $k) * factorial($k+1, $n);
####
#
# Usage:
# factorial(n) = n*(n-1)*...*1
# factorial(n, m) = n*(n-1)*...*m
def factorial (n, m=1)
if m < n then
k=(m+n)/2;
factorial(k, m) * factorial(n, k+1);
else
m
end
end