f(x) = (a*x + b) % m
####
sub gcd { $_[1] ? gcd($_[1], $_[0] % $_[1]) : $_[0] }
sub shuffle {
my ($seed, $max, $i) = @_;
my $ca = $seed;
$ca-- until gcd($ca, $max) == 1;
my $cb = $seed - $ca;
($ca * $i + $cb) % $max;
}
for my $seed (1 .. 10) {
my @result = map shuffle($seed, 15, $_), 0 .. 14;
print "seed=$seed ==> @result\n";
}
##
##
seed=1 ==> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
seed=2 ==> 0 2 4 6 8 10 12 14 1 3 5 7 9 11 13
seed=3 ==> 1 3 5 7 9 11 13 0 2 4 6 8 10 12 14
seed=4 ==> 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11
seed=5 ==> 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12
seed=6 ==> 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13
seed=7 ==> 0 7 14 6 13 5 12 4 11 3 10 2 9 1 8
seed=8 ==> 0 8 1 9 2 10 3 11 4 12 5 13 6 14 7
seed=9 ==> 1 9 2 10 3 11 4 12 5 13 6 14 7 0 8
seed=10 ==> 2 10 3 11 4 12 5 13 6 14 7 0 8 1 9