Matrix-exponentiation operator: Difference between revisions

→‎{{header|Perl 6}}: Calc $size in one line, use 2-arg .fmt, de-tab, and use Out template.
(→‎{{header|Perl 6}}: Calc $size in one line, use 2-arg .fmt, de-tab, and use Out template.)
Line 1,709:
$m->identity ** 1_000_000_000_000;</lang>
=={{header|Perl 6}}==
{{works with|rakudo|2015-09-22.11}}
<lang perl6>subset SqMat of Array where { .elems == all(.[]».elems) }
 
multi infix:<*>(SqMat $a, SqMat $b) {[
for ^$a -> $r {[
Line 1,719:
]}
]}
 
multi infix:<**> (SqMat $m, Int $n is copy where { $_ >= 0 }) {
my $tmp = $m;
my $out = [for ^$m -> $i { [ for ^$m -> $j { +($i == $j) } ] } ];
loop {
$out = $out * $tmp if $n +& 1;
last unless $n +>= 1;
$tmp = $tmp * $tmp;
}
 
$out;
}
 
multi show (SqMat $m) {
my $size = 1$m.flatmap( *.list».chars ).max;
.putsay for @$m».fmt("%{$size}s", ' ') for $m.list;
for ^$m X ^$m -> ($i, $j) { $size max= $m[$i][$j].Str.chars; }
.put for @$m».fmt("%{$size}s");
}
 
my @m = [1, 2, 0],
[0, 3, 1],
[1, 0, 0];
 
for 0 .. 10 -> $order {
say "### Order $order";
show @m ** $order;
}</lang>
{{out}}
Output:
<pre>### Order 0
1 0 0
256

edits