Matrix-exponentiation operator: Difference between revisions

Content added Content deleted
(→‎{{header|Perl 6}}: Calc $size in one line, use 2-arg .fmt, de-tab, and use Out template.)
Line 1,709: Line 1,709:
$m->identity ** 1_000_000_000_000;</lang>
$m->identity ** 1_000_000_000_000;</lang>
=={{header|Perl 6}}==
=={{header|Perl 6}}==
{{works with|rakudo|2015-09-22}}
{{works with|rakudo|2015.11}}
<lang perl6>subset SqMat of Array where { .elems == all(.[]».elems) }
<lang perl6>subset SqMat of Array where { .elems == all(.[]».elems) }

multi infix:<*>(SqMat $a, SqMat $b) {[
multi infix:<*>(SqMat $a, SqMat $b) {[
for ^$a -> $r {[
for ^$a -> $r {[
Line 1,719: Line 1,719:
]}
]}
]}
]}

multi infix:<**> (SqMat $m, Int $n is copy where { $_ >= 0 }) {
multi infix:<**> (SqMat $m, Int $n is copy where { $_ >= 0 }) {
my $tmp = $m;
my $tmp = $m;
my $out = [for ^$m -> $i { [ for ^$m -> $j { +($i == $j) } ] } ];
my $out = [for ^$m -> $i { [ for ^$m -> $j { +($i == $j) } ] } ];
loop {
loop {
$out = $out * $tmp if $n +& 1;
$out = $out * $tmp if $n +& 1;
last unless $n +>= 1;
last unless $n +>= 1;
$tmp = $tmp * $tmp;
$tmp = $tmp * $tmp;
}
}

$out;
$out;
}
}

multi show (SqMat $m) {
multi show (SqMat $m) {
my $size = 1;
my $size = $m.flatmap( *.list».chars ).max;
say .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],
my @m = [1, 2, 0],
[0, 3, 1],
[0, 3, 1],
[1, 0, 0];
[1, 0, 0];

for 0 .. 10 -> $order {
for 0 .. 10 -> $order {
say "### Order $order";
say "### Order $order";
show @m ** $order;
show @m ** $order;
}</lang>
}</lang>
{{out}}
Output:
<pre>### Order 0
<pre>### Order 0
1 0 0
1 0 0