RosettaCodeData/Task/Matrix-exponentiation-operator/Perl-6/matrix-exponentiation-operator.pl6

36 lines
749 B
Raku
Raw Permalink Normal View History

2013-04-10 22:43:41 -07:00
subset SqMat of Array where { .elems == all(.[]».elems) }
multi infix:<*>(SqMat $a, SqMat $b) {[
for ^$a -> $r {[
for ^$b[0] -> $c {
[+] ($a[$r][] Z* $b[].map: *[$c])
}
]}
]}
multi infix:<**> (SqMat $m, Int $n is copy where { $_ >= 0 }) {
my $tmp = $m;
my $out = [for ^$m -> $i { [ for ^$m -> $j { +($i == $j) } ] } ];
loop {
2017-09-23 10:01:46 +02:00
$out = $out * $tmp if $n +& 1;
last unless $n +>= 1;
$tmp = $tmp * $tmp;
2013-04-10 22:43:41 -07:00
}
$out;
}
multi show (SqMat $m) {
2017-09-23 10:01:46 +02:00
my $size = $m.flatmap( *.list».chars ).max;
say .fmt("%{$size}s", ' ') for $m.list;
2013-04-10 22:43:41 -07:00
}
my @m = [1, 2, 0],
2017-09-23 10:01:46 +02:00
[0, 3, 1],
[1, 0, 0];
2013-04-10 22:43:41 -07:00
for 0 .. 10 -> $order {
say "### Order $order";
show @m ** $order;
}