Permutations/Rank of a permutation: Difference between revisions

Content added Content deleted
(Added Kotlin)
(Add Perl)
Line 1,082: Line 1,082:
<pre>%1 = 1
<pre>%1 = 1
%2 = [[3, 11, 7, 9, 10, 5, 2, 12, 8, 1, 4, 6], [11, 9, 6, 1, 5, 3, 10, 2, 7, 4, 12, 8], [12, 3, 10, 6, 7, 4, 9, 11, 2, 8, 1, 5], [6, 10, 7, 2, 9, 12, 11, 4, 8, 3, 1, 5]]</pre>
%2 = [[3, 11, 7, 9, 10, 5, 2, 12, 8, 1, 4, 6], [11, 9, 6, 1, 5, 3, 10, 2, 7, 4, 12, 8], [12, 3, 10, 6, 7, 4, 9, 11, 2, 8, 1, 5], [6, 10, 7, 2, 9, 12, 11, 4, 8, 3, 1, 5]]</pre>

=={{header|Perl}}==
The ntheory module gives us <code>numtoperm</code> and <code>permtonum</code> commands similar to Pari/GP, though in the preferred lexicographic order. Values larger than the native int size are handled as well. The <code>randperm</code> function is useful for random permutations, using a Knuth shuffle and a Chacha/20 CSPRNG supplying randomness. A Macbook takes a bit under 4 seconds to generate 1 million random permutations of 144 objects, or 8 seconds if inserting into a set to ensure uniqueness.
{{libheader|ntheory}}
<lang perl>use ntheory qw/:all/;

my $n = 3;
print " Iterate Lexicographic rank/unrank of $n objects\n";
for my $k (0 .. factorial($n)-1) {
my @perm = numtoperm($n, $k);
my $rank = permtonum(\@perm);
die unless $rank == $k;
printf "%2d --> [@perm] --> %2d\n", $k, $rank;
}
print "\n";

print " Four 12-object random permutations using ranks\n";
print join(" ", numtoperm(12,urandomm(factorial(12)))), "\n" for 1..4;
print "\n";
print " Four 12-object random permutations using randperm\n";
print join(" ", randperm(12)),"\n" for 1..4;
print "\n";
print " Four 4-object random permutations of 100k objects using randperm\n";
print join(" ", randperm(100000,4)),"\n" for 1..4;
</lang>

{{out}}
<pre>
Iterate Lexicographic rank/unrank of 3 objects
0 --> [0 1 2] --> 0
1 --> [0 2 1] --> 1
2 --> [1 0 2] --> 2
3 --> [1 2 0] --> 3
4 --> [2 0 1] --> 4
5 --> [2 1 0] --> 5

Four 12-object random permutations using ranks
0 6 1 4 2 5 3 7 8 9 11 10
4 2 8 6 0 3 9 10 7 11 5 1
6 1 7 2 4 5 3 0 11 10 8 9
0 2 3 9 10 1 4 7 11 8 6 5

Four 12-object random permutations using randperm
1 7 5 6 2 9 0 3 10 11 4 8
6 11 7 2 5 4 0 9 3 8 1 10
1 9 6 11 10 8 4 0 2 3 5 7
10 0 1 8 7 4 5 6 11 3 9 2

Four 4-object random permutations of 100k objects using randperm
51080 2774 79078 28078
38822 21928 77796 36832
6089 14383 3397 31577
61539 80497 47550 53322
</pre>


=={{header|Perl 6}}==
=={{header|Perl 6}}==