Math::Counting - Combinatorial counting operations


Math-Counting documentation Contained in the Math-Counting distribution.

Index


Code Index:

NAME

Top

Math::Counting - Combinatorial counting operations

SYNOPSIS

Top

  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);

DESCRIPTION

Top

Compute the factorial, number of permutations and number of combinations for engineers and CS students.

FUNCTIONS

Top

factorial

  $f = factorial($n);

Return the number of arrangements of n according to the "student" version using real arithmetic.

bfact

  $f = bfact($n);

Return the value of the bfac in Math::BigInt function, which is the "Right Way To Do It."

permutation

  $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.

bperm

  $p = bperm($n, $r);

Return the Math::BigInt computation: n!/(n-r)!

combination

  $c = combination($n, $r);

Return the number of ways to choose r elements from a set of n elements using the "student" version."

bcomb

  $c = bcomb($n, $r);

Return the Math::BigInt computation: n!/r!(n-r)!

TO DO

Top

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?

SEE ALSO

Top

bfac in Math::BigInt

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

AUTHOR AND COPYRIGHT

Top

LICENSE

Top

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__