| Math-Counting documentation | Contained in the Math-Counting distribution. |
Math::Counting - Combinatorial counting operations
use Math::Counting ':student'; # Logical, Academic
printf "Given n=%d and r=%d:\nFact=%d\nPerm=%d\nComb=%d\n",
$n, $r, factorial($n), permutation($n, $r), combination($n, $r);
use Math::Counting ':big'; # Engineering, Reality
printf "n=%d, r=%d:\nBig F=%d\n Big P=%d\nBig C=%d\n",
$n, $r, bfact($n), bperm($n, $r), bcomb($n, $r);
Compute the factorial, number of permutations and number of combinations for engineers and CS students.
$f = factorial($n);
Return the number of arrangements of n according to the "student" version using real arithmetic.
$f = bfact($n);
Return the value of the bfac in Math::BigInt function, which is the "Right Way To Do It."
$p = permutation($n, $r);
Return the number of arrangements of r elements drawn from a set of n elements. nPn is the same as n!. This function employs the "student" version.
$p = bperm($n, $r);
Return the Math::BigInt computation: n!/(n-r)!
$c = combination($n, $r);
Return the number of ways to choose r elements from a set of n elements using the "student" version."
$c = bcomb($n, $r);
Return the Math::BigInt computation: n!/r!(n-r)!
Figure out how to allow the use of different Math::BigInt
variations, like GMP.
Provide the gamma function for the factorial of non-integer numbers?
Higher Order Perl by Mark Jason Dominus (http://hop.perl.plover.com).
Mastering Algorithms with Perl by Orwant, Hietaniemi & Macdonald (http://www.oreilly.com/catalog/maperl).
http://en.wikipedia.org/wiki/Factorial
http://en.wikipedia.org/wiki/Permutation
http://en.wikipedia.org/wiki/Combination
Naturally, there are a plethora of combinatorics packages available, take your pick:
Algorithm::Combinatorics, Algorithm::Loops, Algorithm::Permute, CM::Group::Sym, CM::Permutation, Games::Word, List::Permutor, Math::Combinatorics, Math::GSL::Permutation, Math::Permute::List, String::Glob::Permute, String::OrderedCombination
Gene Boggs <gene@cpan.org>
Copyright 2011, Gene Boggs, All Rights Reserved.
This program is free software; you can redistribute or modify it under the same terms as Perl itself.
| Math-Counting documentation | Contained in the Math-Counting distribution. |
package Math::Counting; use strict; use warnings; use Math::BigInt; our $VERSION = '0.0902'; our @ISA = qw(Exporter); our @EXPORT = qw( factorial permutation combination bfact bperm bcomb ); our %EXPORT_TAGS = ( student => [qw( factorial permutation combination )], big => [qw( bfact bperm bcomb )], ); # The algorithmically elegant way: sub factorial { my( $n ) = @_; return unless defined $n && $n =~ /^\d+$/; my $product = 1; while( $n > 0 ) { $product *= $n--; } return $product; } # The right way to do it: sub bfact { my $n = Math::BigInt->new( shift ); return $n->bfac(); } sub permutation { my( $n, $r ) = @_; return unless defined $n && $n =~ /^\d+$/ && defined $r && $r =~ /^\d+$/; my $product = 1; while( $r > 0 ) { $product *= $n--; $r--; } return $product; } sub bperm { my( $n, $r ) = @_; $n = Math::BigInt->new( $n ); $r = Math::BigInt->new( $r ); $r = $n - $r; return $n->bfac() / $r->bfac(); } sub combination { my( $n, $r ) = @_; return unless defined $n && $n =~ /^\d+$/ && defined $r && $r =~ /^\d+$/; my $product = 1; while( $r > 0 ) { $product *= $n--; $product /= $r--; } return $product; } sub bcomb { my( $n, $k ) = @_; $n = Math::BigInt->new( $n ); $k = Math::BigInt->new( $k ); my $r = $n - $k; return $n->bfac() / ($k->bfac() * $r->bfac()); } 1; __END__