86 lines
2.1 KiB
Zig
86 lines
2.1 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn main() !void {
|
|
var m1 = [_][2]f64{
|
|
[_]f64{1.0, 2.0},
|
|
[_]f64{3.0, 4.0},
|
|
};
|
|
|
|
var m2 = [_][4]f64{
|
|
[_]f64{1.0, 2.0, 3.0, 4.0},
|
|
[_]f64{4.0, 5.0, 6.0, 7.0},
|
|
[_]f64{7.0, 8.0, 9.0, 10.0},
|
|
[_]f64{10.0, 11.0, 12.0, 13.0},
|
|
};
|
|
|
|
var m3 = [_][5]f64{
|
|
[_]f64{0.0, 1.0, 2.0, 3.0, 4.0},
|
|
[_]f64{5.0, 6.0, 7.0, 8.0, 9.0},
|
|
[_]f64{10.0, 11.0, 12.0, 13.0, 14.0},
|
|
[_]f64{15.0, 16.0, 17.0, 18.0, 19.0},
|
|
[_]f64{20.0, 21.0, 22.0, 23.0, 24.0},
|
|
};
|
|
|
|
std.debug.print("Determinant of m1: {d}\n", .{determinant(2, &m1)});
|
|
std.debug.print("Permanent of m1: {d}\n", .{permanent(2, &m1)});
|
|
|
|
std.debug.print("Determinant of m2: {d}\n", .{determinant(4, &m2)});
|
|
std.debug.print("Permanent of m2: {d}\n", .{permanent(4, &m2)});
|
|
|
|
std.debug.print("Determinant of m3: {d}\n", .{determinant(5, &m3)});
|
|
std.debug.print("Permanent of m3: {d}\n", .{permanent(5, &m3)});
|
|
}
|
|
|
|
fn minor(comptime N: usize, a: *const [N][N]f64, x: usize, y: usize) [N - 1][N - 1]f64 {
|
|
var out_mat: [N - 1][N - 1]f64 = undefined;
|
|
|
|
var out_i: usize = 0;
|
|
var i: usize = 0;
|
|
while (i < N) : (i += 1) {
|
|
if (i == x) continue;
|
|
|
|
var out_j: usize = 0;
|
|
var j: usize = 0;
|
|
while (j < N) : (j += 1) {
|
|
if (j == y) continue;
|
|
|
|
out_mat[out_i][out_j] = a[i][j];
|
|
out_j += 1;
|
|
}
|
|
out_i += 1;
|
|
}
|
|
|
|
return out_mat;
|
|
}
|
|
|
|
fn determinant(comptime N: usize, matrix: *const [N][N]f64) f64 {
|
|
if (N == 1) {
|
|
return matrix[0][0];
|
|
}
|
|
|
|
var sign: f64 = 1.0;
|
|
var sum: f64 = 0.0;
|
|
|
|
for (0..N) |i| {
|
|
const m = minor(N, matrix, 0, i);
|
|
sum += sign * matrix[0][i] * determinant(N - 1, &m);
|
|
sign *= -1.0;
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
fn permanent(comptime N: usize, matrix: *const [N][N]f64) f64 {
|
|
if (N == 1) {
|
|
return matrix[0][0];
|
|
}
|
|
|
|
var sum: f64 = 0.0;
|
|
|
|
for (0..N) |i| {
|
|
const m = minor(N, matrix, 0, i);
|
|
sum += matrix[0][i] * permanent(N - 1, &m);
|
|
}
|
|
|
|
return sum;
|
|
}
|