usingMaths.com
From Theory to Practice - Math You Can Use.







<< PreviousNext >>

Calculating Permutations - \(^nP_r\) (Possible Ways of Arrangement) using Perl



Permutation in Perl

A permutation refers to the number of possible arrangements of a set of objects where order matters. Permutations are widely used in mathematics, computer science, and programming problems that involve arranging data, generating sequences, or exploring all possible outcomes.

In this tutorial, we explain the mathematical concept of permutations and demonstrate how to generate permutations in Perl using clear algorithms and practical code examples.

What Is a Permutation? | Mathematics Explanation for Perl Kids

In mathematics, a permutation is an ordered arrangement of objects selected from a set. Because order is important, rearranging the same elements produces a different permutation.

For example, the arrangements ABC and BAC are considered different permutations of the same three elements.

Permutations commonly appear in:

  • Combinatorics
  • Algorithm design
  • Password and key generation
  • Game logic and simulations
  • Search and optimization problems

In the unlikely scenario that the Teacher wants to see just how any four pupils, from a group of six (6), could be seated on a four-person desk; what this Teacher would be doing in essence is called Permutation (\(^nP_r\)).


Permutation Formula (\(^nP_r\)) | Maths Explanation for Perl Kids

The number of permutations of selecting r objects from n distinct objects is calculated using the formula:

$$ ^nP_r = \frac{n!}{(n - r)!} $$

Where:

  • n is the total number of objects
  • r is the number of objects selected
  • ! denotes factorial

This formula is useful when determining how many possible ordered arrangements exist before implementing a permutation algorithm in code.

Permutation With and Without Repetition | Maths Explanation for Perl Kids

  • Permutation without repetition: Each element can appear only once in an arrangement.
  • Permutation with repetition: Elements may repeat, increasing the total number of possible arrangements.

The example below demonstrates permutations without repetition, which is the most common use case in programming exercises.


Permutation vs Combination in Perl: What's the Difference?

Students often confuse permutations with combinations.

ConceptOrder MattersExample
PermutationYesABC ≠ BAC
CombinationNoABC = BAC

It is easy to confuse permutations and combinations. The key takeaway is:

  • Permutations (\(^nP_r\)): Use these when the order is important (e.g., a combination lock or race results).
  • Combinations (\(^nC_r\)): Use these when only the group members matter (e.g., picking a committee).

When solving Perl problems involving ordered arrangements, permutations must be used. If order does not matter, combinations are more appropriate.

Understanding this distinction is essential when implementing mathematical algorithms in code.


Generating Permutations Using Perl

In programming, permutations are often generated by systematically rearranging elements in an array. Perl provides a flexible environment for implementing permutation algorithms using recursion or backtracking.

The following approach demonstrates how to generate all permutations of an array in Perl.

Perl Permutation Algorithm (\(^nP_r\))

The Perl algorithm for Permutation - \(^nP_r\), possible ways of arrangement - will simply be based on that of combination.

All that is needed after combination is a rotation or shuffle of members of each possible combination result.
This shuffle simply involves interchanging the elements of the combination group of size, r, to take all possible positions starting from the extreme right to extreme left.

This is how our Permutation code in Perl will work.

Create a new Perl module file;
Call it Permutation.pm
Type out the adjoining Perl code for Permutation (\(^nP_r\)).


Advice: You might want to keep the mother-class size (n) and the group-size (r) small to avoid the Perl permutation code taking too long.
As a rule-of-thump, DO NOT ASK QUESTIONS YOU DON'T WANT TO KNOW THE ANSWER TO.


Why Use Perl for Combinatorics?

Using a Perl math library or custom script allows you to build dynamic educational tools and interactive solvers. Our tool above uses this logic to give you instant results for any \(^nP_r\) calculation.

Applications of Permutations in Perl Programming

Permutations are used in many real-world programming scenarios, including:

  • Generating all possible test cases
  • Exploring solution spaces in algorithms
  • Cryptography and security
  • Scheduling and optimization problems
  • Educational simulations

Summary: Perl Permutation Algorithm

Permutations are a powerful concept in both mathematics and programming. With these Perl permutation tutorials, you can calculate \(^nP_r\), generate permutations of arrays or strings, and apply them to real-world problems.

For example, calculating possible arrangements in Perl can help determine seating orders, password combinations, or sequence generation.










Perl Code for Permutation - Module File

package PERMUTATION;

BEGIN {
    require Exporter;

    # for the sake of standard
    our $VERSION = 2017.10;

    # Inherit from exporter to export subs and variables
    our @ISA = qw(Exporter);

    # subs and variables to be exported by default
    our @EXPORT_OK = qw(possibleWordPermutations);
}

use 5.010;
use warnings;
use strict;

our @words;
our $r# min length of word
my @local_store# array of references
my @perm_store# array of references
my $eye;
my $combination;

# simulate an object construct
sub new {
    my $self = shift;
    
    my $this = {};
    bless $this$self;
    
    return $this;
}

# till the ground for shuffle to grind on
# returns an array reference of references to array strings
sub possibleWordPermutations {
    shift;
    my $arg = shift;
    @words = @{$arg};
    $r = shift;
    @perm_store = ();
    
    use COMBINATION;
    my $call = COMBINATION->new();
    # $combination receives an array reference of references
    $combination = $call->possibleWordCombinations(\@words$r);
    
    # illegal 'r' value
    if (!defined $combination->[0] || $r == 1) {
        @perm_store = @{$combination};
    } else {
        
        for (0 .. $#{$combination}) {
            $eye = $r - 1;
            # copy up last two elements of 'comb_store.get(i)'
            my @last_two = ([""""], [""""]); # array of references
            $last_two[0]->[0] = $last_two[1]->[1] = $combination->[$_]->[$eye--];
            $last_two[0]->[1] = $last_two[1]->[0] = $combination->[$_]->[$eye--];
            
            @local_store = (); # array of references
            push @local_store$last_two[0], $last_two[1];
            shuffleWord([@local_store], $_if $r > 2;

            push @perm_store@local_store;
        }
    }
    return \@perm_store;
}

sub shuffleWord {
    my $arg_store = shift# array reference of references
    my $i = shift;
    @local_store = ();
    my @members;
    for my $entry (@{$arg_store}) {
        @members = @{$entry};
        # add 'comb_store[i][eye]' element to this list of members
        push @members$combination->[$i]->[$eye];

        my $shift_index = scalar @members;
        # shuffle this pack of words
        while ($shift_index > 0) {
            # skip if already in store -- /* array comparism */
            my ($contains) = grep { @{$local_store[$_]} ~~ @members } 0 .. $#local_store;
            if (!defined $contains) {
                push @local_store, [@members];
            }
            # interchange these two neighbours
            if (--$shift_index > 0 && $members[$shift_index] ne $members[$shift_index - 1]) {
                @members[$shift_index - 1$shift_index] = @members[$shift_index$shift_index - 1];
            }
        }
    }
    # Are there any elements left? repeat if yes
    if ($eye-- > 0) {
        shuffleWord([@local_store], $i);
    }
}

1;


Perl Code for Permutation - Main Class

#!/usr/bin/perl;

use strict;
use warnings;

use PERMUTATION;

my @subjects = ("Eno""Chidi""Olu""Ahmed""Osas""Gbeda");
my $r = 4;

# Use the permutation module/class
my $perm = PERMUTATION->new();

# $result receives an array reference of references
my $result = $perm->possibleWordPermutations(\@subjects$r);

print ("["join(", "@subjects), "] permutation "$r":\n\n");
# for each array reference in a dereferenced '$result'
my $i = 0;
print (++$i": "join(", "@{$_}), "\n"for @{$result};
print ("\n\nNumber of ways is "scalar @{$result}, ".");

print "\n\n";





<< PreviousNext >>