Cramer's rule: Difference between revisions

Content added Content deleted
m (syntax highlighting fixup automation)
m (→‎{{header|Raku}}: some sigil-less, other changes for code-readability)
Line 2,333: Line 2,333:
(formerly Perl 6)
(formerly Perl 6)
<syntaxhighlight lang="raku" line>sub det(@matrix) {
<syntaxhighlight lang="raku" line>sub det(@matrix) {
my @a = @matrix.map: { [|$_] };
my @a = @matrix.map: { [|$_] };
my $sign = +1;
my $sign = 1;
my $pivot = 1;
my $pivot = 1;
for ^@a -> $k {
for ^@a -> \k {
my @r = ($k+1 .. @a.end);
my @r = (k+1 ..^ @a);
my $previous-pivot = $pivot;
my $previous-pivot = $pivot;
if 0 == ($pivot = @a[$k][$k]) {
if 0 == ($pivot = @a[k;k]) {
(my $s = @r.first: { @a[$_][$k] != 0 }) // return 0;
(my \s = @r.first: { @a[$_;k] != 0 }) // return 0;
(@a[$s],@a[$k]) = (@a[$k], @a[$s]);
(@a[s], @a[k]) = (@a[k], @a[s]);
my $pivot = @a[$k][$k];
my $pivot = @a[k;k];
$sign = -$sign;
$sign = -$sign;
}
}
for @r X @r -> ($i, $j) {
for @r X @r -> (\i,\j) {
((@a[$i][$j] *= $pivot) -= @a[$i][$k]*@a[$k][$j]) /= $previous-pivot;
((@a[i;j] ×= $pivot) -= @a[i;k]×@a[k;j]) /= $previous-pivot;
}
}
}
}
$sign * $pivot
$sign × $pivot
}
}


sub cramers_rule(@A, @terms) {
sub cramers_rule(@A, @terms) {
gather for ^@A -> $i {
gather for ^@A -> \i {
my @Ai = @A.map: { [|$_] };
my @Ai = @A.map: { [|$_] };
for ^@terms -> $j {
for ^@terms -> \j {
@Ai[$j][$i] = @terms[$j];
@Ai[j;i] = @terms[j];
}
}
take det(@Ai);
take det(@Ai);
Line 2,369: Line 2,369:
);
);


my @free_terms = (-3, -32, -47, 49);
my @free_terms = <-3 -32 -47 49>;
my ($w, $x, $y, $z) = |cramers_rule(@matrix, @free_terms);
my ($w, $x, $y, $z) = cramers_rule(@matrix, @free_terms);
("w = $w", "x = $x", "y = $y", "z = $z").join("\n").say;</syntaxhighlight>

say "w = $w";
say "x = $x";
say "y = $y";
say "z = $z";</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>