From c3a44df0ce9d5642b98943ac4eabffe595ba196c Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 14:46:34 +0530 Subject: [PATCH 1/6] feat(matrix): Implement determinant calculation for square matrices --- .../matrix/MatrixDeterminant.java | 59 +++++++++++++++++++ .../matrix/MatrixDeterminantTest.java | 39 ++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java create mode 100644 src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java new file mode 100644 index 000000000000..0dd9dfa90afa --- /dev/null +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -0,0 +1,59 @@ +// Problem: Determinant of a Matrix +// +// Implement a function to calculate the determinant of a square matrix. +// +// Requirements: +// - The function should work for any n x n matrix. +// - Return 0 if the matrix is singular (determinant = 0). +// - Only square matrices are allowed; handle error for non-square matrices. +// +// Example: +// double[][] matrix1 = {{1,2},{3,4}}; +// determinant(matrix1); // returns -2 +// +// double[][] matrix2 = {{2,0,1},{3,0,0},{5,1,1}}; +// determinant(matrix2); // returns 3 +// +// Notes: +// - You can use recursion or any other suitable algorithm. +// - Bonus: Optimize for larger matrices (optional). + +package matrix; + +public class MatrixDeterminant { + + public static double determinant(double[][] m) { + int n = m.length; + if (n == 1) return m[0][0]; + if (n == 2) return m[0][0]*m[1][1] - m[0][1]*m[1][0]; + + double det = 0; + for (int c = 0; c < n; c++) { + det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); + } + return det; + } + + private static double[][] minor(double[][] m, int row, int col) { + int n = m.length; + double[][] min = new double[n-1][n-1]; + int r = 0; + for (int i = 0; i < n; i++) { + if (i == row) continue; + int c = 0; + for (int j = 0; j < n; j++) { + if (j == col) continue; + min[r][c++] = m[i][j]; + } + r++; + } + return min; + } + + public static void main(String[] args) { + double[][] a = {{1,2},{3,4}}; + double[][] b = {{2,0,1},{3,0,0},{5,1,1}}; + System.out.println(determinant(a)); // -2 + System.out.println(determinant(b)); // 3 + } +} diff --git a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java new file mode 100644 index 000000000000..87be02fedac9 --- /dev/null +++ b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java @@ -0,0 +1,39 @@ +package matrix; + +public class MatrixDeterminant { + + public static double determinant(double[][] m) { + int n = m.length; + if (n == 1) return m[0][0]; + if (n == 2) return m[0][0]*m[1][1] - m[0][1]*m[1][0]; + + double det = 0; + for (int c = 0; c < n; c++) { + det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); + } + return det; + } + + private static double[][] minor(double[][] m, int row, int col) { + int n = m.length; + double[][] min = new double[n-1][n-1]; + int r = 0; + for (int i = 0; i < n; i++) { + if (i == row) continue; + int c = 0; + for (int j = 0; j < n; j++) { + if (j == col) continue; + min[r][c++] = m[i][j]; + } + r++; + } + return min; + } + + public static void main(String[] args) { + double[][] a = {{1,2},{3,4}}; + double[][] b = {{2,0,1},{3,0,0},{5,1,1}}; + System.out.println(determinant(a)); // -2 + System.out.println(determinant(b)); // 3 + } +} From f93a56281a0cd675deb936fe14145786b53459a3 Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 14:58:09 +0530 Subject: [PATCH 2/6] fix(matrix): Ensure matrix is square and handle non-square matrices with an exception --- .../matrix/MatrixDeterminant.java | 14 ++--- .../matrix/MatrixDeterminantTest.java | 58 +++++++++---------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java index 0dd9dfa90afa..057c3d42f822 100644 --- a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -18,12 +18,17 @@ // - You can use recursion or any other suitable algorithm. // - Bonus: Optimize for larger matrices (optional). -package matrix; +package com.thealgorithms.matrix; public class MatrixDeterminant { public static double determinant(double[][] m) { int n = m.length; + for (double[] row : m) { + if (row.length != n) { + throw new IllegalArgumentException("Matrix must be square"); + } + } if (n == 1) return m[0][0]; if (n == 2) return m[0][0]*m[1][1] - m[0][1]*m[1][0]; @@ -49,11 +54,4 @@ private static double[][] minor(double[][] m, int row, int col) { } return min; } - - public static void main(String[] args) { - double[][] a = {{1,2},{3,4}}; - double[][] b = {{2,0,1},{3,0,0},{5,1,1}}; - System.out.println(determinant(a)); // -2 - System.out.println(determinant(b)); // 3 - } } diff --git a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java index 87be02fedac9..45ed436c6552 100644 --- a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java +++ b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java @@ -1,39 +1,37 @@ -package matrix; +package com.thealgorithms.matrix; -public class MatrixDeterminant { +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; - public static double determinant(double[][] m) { - int n = m.length; - if (n == 1) return m[0][0]; - if (n == 2) return m[0][0]*m[1][1] - m[0][1]*m[1][0]; +class MatrixDeterminantTest { - double det = 0; - for (int c = 0; c < n; c++) { - det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); - } - return det; + @Test + void test2x2Matrix() { + double[][] matrix = {{1, 2}, {3, 4}}; + assertEquals(-2, MatrixDeterminant.determinant(matrix), 1e-9); } - private static double[][] minor(double[][] m, int row, int col) { - int n = m.length; - double[][] min = new double[n-1][n-1]; - int r = 0; - for (int i = 0; i < n; i++) { - if (i == row) continue; - int c = 0; - for (int j = 0; j < n; j++) { - if (j == col) continue; - min[r][c++] = m[i][j]; - } - r++; - } - return min; + @Test + void test3x3Matrix() { + double[][] matrix = {{2, 0, 1}, {3, 0, 0}, {5, 1, 1}}; + assertEquals(3, MatrixDeterminant.determinant(matrix), 1e-9); } - public static void main(String[] args) { - double[][] a = {{1,2},{3,4}}; - double[][] b = {{2,0,1},{3,0,0},{5,1,1}}; - System.out.println(determinant(a)); // -2 - System.out.println(determinant(b)); // 3 + @Test + void test1x1Matrix() { + double[][] matrix = {{5}}; + assertEquals(5, MatrixDeterminant.determinant(matrix), 1e-9); + } + + @Test + void testSingularMatrix() { + double[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + assertEquals(0, MatrixDeterminant.determinant(matrix), 1e-9); + } + + @Test + void testNonSquareMatrix() { + double[][] matrix = {{1, 2, 3}, {4, 5, 6}}; + assertThrows(IllegalArgumentException.class, () -> MatrixDeterminant.determinant(matrix)); } } From a859555562a3b17d87792fe5a9ed55553de2de7c Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 15:05:07 +0530 Subject: [PATCH 3/6] refactor(matrix): Improve code readability and error handling in determinant calculation --- .../matrix/MatrixDeterminant.java | 27 +++++++++++++++---- .../matrix/MatrixDeterminantTest.java | 3 ++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java index 057c3d42f822..4d6027dcd0b3 100644 --- a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -21,6 +21,9 @@ package com.thealgorithms.matrix; public class MatrixDeterminant { + private MatrixDeterminant() { + throw new AssertionError("Utility class"); + } public static double determinant(double[][] m) { int n = m.length; @@ -29,29 +32,43 @@ public static double determinant(double[][] m) { throw new IllegalArgumentException("Matrix must be square"); } } - if (n == 1) return m[0][0]; - if (n == 2) return m[0][0]*m[1][1] - m[0][1]*m[1][0]; + if (n == 1) { + return m[0][0]; + } + + if (n == 2) { + return m[0][0] * m[1][1] - m[0][1] * m[1][0]; + } double det = 0; for (int c = 0; c < n; c++) { det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); } + return det; } private static double[][] minor(double[][] m, int row, int col) { int n = m.length; - double[][] min = new double[n-1][n-1]; + double[][] min = new double[n - 1][n - 1]; int r = 0; for (int i = 0; i < n; i++) { - if (i == row) continue; + if (i == row) { + continue; + } + int c = 0; for (int j = 0; j < n; j++) { - if (j == col) continue; + if (j == col) { + continue; + } + min[r][c++] = m[i][j]; } + r++; } + return min; } } diff --git a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java index 45ed436c6552..87e8645a0dc1 100644 --- a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java +++ b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java @@ -1,7 +1,8 @@ package com.thealgorithms.matrix; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class MatrixDeterminantTest { From 1e6f31c8c6ce88aaf8d13fc03f235940297a4e34 Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 15:10:08 +0530 Subject: [PATCH 4/6] refactor(matrix): Clean up code and improve formatting in MatrixDeterminant and its tests --- .../matrix/MatrixDeterminant.java | 47 ++++--------------- .../matrix/MatrixDeterminantTest.java | 3 +- 2 files changed, 10 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java index 4d6027dcd0b3..45f2931a54c8 100644 --- a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -1,28 +1,11 @@ +package com.thealgorithms.matrix; + // Problem: Determinant of a Matrix -// -// Implement a function to calculate the determinant of a square matrix. -// -// Requirements: -// - The function should work for any n x n matrix. -// - Return 0 if the matrix is singular (determinant = 0). -// - Only square matrices are allowed; handle error for non-square matrices. -// -// Example: -// double[][] matrix1 = {{1,2},{3,4}}; -// determinant(matrix1); // returns -2 -// -// double[][] matrix2 = {{2,0,1},{3,0,0},{5,1,1}}; -// determinant(matrix2); // returns 3 -// -// Notes: -// - You can use recursion or any other suitable algorithm. -// - Bonus: Optimize for larger matrices (optional). -package com.thealgorithms.matrix; +public final class MatrixDeterminant { -public class MatrixDeterminant { private MatrixDeterminant() { - throw new AssertionError("Utility class"); + // Prevent instantiation } public static double determinant(double[][] m) { @@ -32,19 +15,13 @@ public static double determinant(double[][] m) { throw new IllegalArgumentException("Matrix must be square"); } } - if (n == 1) { - return m[0][0]; - } - - if (n == 2) { - return m[0][0] * m[1][1] - m[0][1] * m[1][0]; - } + if (n == 1) return m[0][0]; + if (n == 2) return m[0][0] * m[1][1] - m[0][1] * m[1][0]; double det = 0; for (int c = 0; c < n; c++) { det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); } - return det; } @@ -53,22 +30,14 @@ private static double[][] minor(double[][] m, int row, int col) { double[][] min = new double[n - 1][n - 1]; int r = 0; for (int i = 0; i < n; i++) { - if (i == row) { - continue; - } - + if (i == row) continue; int c = 0; for (int j = 0; j < n; j++) { - if (j == col) { - continue; - } - + if (j == col) continue; min[r][c++] = m[i][j]; } - r++; } - return min; } } diff --git a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java index 87e8645a0dc1..b6b05c1d5a33 100644 --- a/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java +++ b/src/test/java/com/thealgorithms/matrix/MatrixDeterminantTest.java @@ -1,9 +1,10 @@ package com.thealgorithms.matrix; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; + class MatrixDeterminantTest { @Test From 16386c8074df66b50677539f784fea24bb6daeb7 Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 15:14:16 +0530 Subject: [PATCH 5/6] refactor(matrix): Improve code readability by adding braces for clarity in determinant and minor methods --- .../thealgorithms/matrix/MatrixDeterminant.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java index 45f2931a54c8..86c39e2ec0f0 100644 --- a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -15,11 +15,16 @@ public static double determinant(double[][] m) { throw new IllegalArgumentException("Matrix must be square"); } } - if (n == 1) return m[0][0]; - if (n == 2) return m[0][0] * m[1][1] - m[0][1] * m[1][0]; + if (n == 1) { + return m[0][0]; + } + if (n == 2) { + return m[0][0] * m[1][1] - m[0][1] * m[1][0]; + } double det = 0; for (int c = 0; c < n; c++) { + if (c == 0) {} // optional placeholder for clarity; main logic below det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); } return det; @@ -30,10 +35,14 @@ private static double[][] minor(double[][] m, int row, int col) { double[][] min = new double[n - 1][n - 1]; int r = 0; for (int i = 0; i < n; i++) { - if (i == row) continue; + if (i == row) { + continue; + } int c = 0; for (int j = 0; j < n; j++) { - if (j == col) continue; + if (j == col) { + continue; + } min[r][c++] = m[i][j]; } r++; From c21c41461179dba37519dc490f7c06caf9773905 Mon Sep 17 00:00:00 2001 From: Rony-2004 Date: Sun, 26 Oct 2025 15:29:41 +0530 Subject: [PATCH 6/6] refactor(matrix): Enhance code clarity by improving comments and formatting in determinant method --- .../java/com/thealgorithms/matrix/MatrixDeterminant.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java index 86c39e2ec0f0..f6921cb6b93e 100644 --- a/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java +++ b/src/main/java/com/thealgorithms/matrix/MatrixDeterminant.java @@ -1,6 +1,8 @@ package com.thealgorithms.matrix; // Problem: Determinant of a Matrix +// Description: Calculate the determinant of any square matrix using recursion. +// URL: https://en.wikipedia.org/wiki/Determinant public final class MatrixDeterminant { @@ -15,16 +17,17 @@ public static double determinant(double[][] m) { throw new IllegalArgumentException("Matrix must be square"); } } + if (n == 1) { return m[0][0]; } + if (n == 2) { return m[0][0] * m[1][1] - m[0][1] * m[1][0]; } double det = 0; for (int c = 0; c < n; c++) { - if (c == 0) {} // optional placeholder for clarity; main logic below det += Math.pow(-1, c) * m[0][c] * determinant(minor(m, 0, c)); } return det; @@ -34,6 +37,7 @@ private static double[][] minor(double[][] m, int row, int col) { int n = m.length; double[][] min = new double[n - 1][n - 1]; int r = 0; + for (int i = 0; i < n; i++) { if (i == row) { continue;