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 |
{{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; |
|||
last unless $n +>= 1; |
|||
$tmp = $tmp * $tmp; |
|||
} |
} |
||
$out; |
$out; |
||
} |
} |
||
multi show (SqMat $m) { |
multi show (SqMat $m) { |
||
my $size = |
my $size = $m.flatmap( *.list».chars ).max; |
||
⚫ | |||
for ^$m X ^$m -> ($i, $j) { $size max= $m[$i][$j].Str.chars; } |
|||
⚫ | |||
} |
} |
||
my @m = [1, 2, 0], |
my @m = [1, 2, 0], |
||
[0, 3, 1], |
|||
[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 |