From ab5a8fea7e3d5e0a0dc1687a376965c22fb1c3e1 Mon Sep 17 00:00:00 2001 From: Arlan Tengga Date: Sun, 11 Jan 2026 02:23:50 +0700 Subject: [PATCH 1/2] feat: menambahkan algoritma LDLT --- .../linear_algebra/LDLT_decomposition.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 implementation/linear_algebra/LDLT_decomposition.py diff --git a/implementation/linear_algebra/LDLT_decomposition.py b/implementation/linear_algebra/LDLT_decomposition.py new file mode 100644 index 00000000..40f20c8e --- /dev/null +++ b/implementation/linear_algebra/LDLT_decomposition.py @@ -0,0 +1,51 @@ +# https://en.wikipedia.org/wiki/Cholesky_decomposition#LDL_decomposition + +def transpose(x : list[list[int]]) -> list[list[int]]: + """ + >>> transpose([[1, 2], [3, 4]]) + [[1, 3], [2, 4]] + """ + x = [[x[j][i] for j in range(len(x))] for i in range(len(x[0]))] + return x + + +def LDLT_decomposition(x : list[list[int]]) -> list[list[int]]: + """ + >>> L, D, Lt = LDLT_decomposition([[2, 4, 6], [4, 9, 14], [6, 14, 19]]) + >>> L + [[1, 0, 0], [2.0, 1, 0], [3.0, 2.0, 1]] + >>> D + [2.0, 1.0, -3.0] + >>> Lt + [[1, 2.0, 3.0], [0, 1, 2.0], [0, 0, 1]] + """ + if transpose(x) == x: + n = len(x) + L = [[0 for _ in range(len(x))] for _ in range(len(x))] + d = [0 for _ in range(len(x))] + for i in range(n): + sum_val = 0.0 + for k in range(i): + sum_val += (L[i][k] ** 2) * d[k] + d[i] = x[i][i] - sum_val + + for j in range(i + 1, n): + sum_val = 0.0 + for k in range(i): + sum_val += L[j][k] * L[i][k] * d[k] + L[j][i] = (x[j][i] - sum_val) / d[i] + L[i][i] = 1 + Lt = transpose(L) + return L, d, Lt + else: + return ValueError("Matriks tidak simetri") + + +def main(args=None): + import doctest + + doctest.testmod() + + +if __name__ == "__main__": + main() From b6496c3b885a5b06faf385fc82e0cbfcc635ab26 Mon Sep 17 00:00:00 2001 From: Arlan Tengga Date: Sun, 11 Jan 2026 02:32:39 +0700 Subject: [PATCH 2/2] fix: memperbaiki test --- implementation/linear_algebra/LDLT_decomposition.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/implementation/linear_algebra/LDLT_decomposition.py b/implementation/linear_algebra/LDLT_decomposition.py index 40f20c8e..92a9131c 100644 --- a/implementation/linear_algebra/LDLT_decomposition.py +++ b/implementation/linear_algebra/LDLT_decomposition.py @@ -1,6 +1,7 @@ # https://en.wikipedia.org/wiki/Cholesky_decomposition#LDL_decomposition -def transpose(x : list[list[int]]) -> list[list[int]]: + +def transpose(x: list[list[int]]) -> list[list[int]]: """ >>> transpose([[1, 2], [3, 4]]) [[1, 3], [2, 4]] @@ -9,7 +10,7 @@ def transpose(x : list[list[int]]) -> list[list[int]]: return x -def LDLT_decomposition(x : list[list[int]]) -> list[list[int]]: +def LDLT_decomposition(x: list[list[int]]) -> list[list[int]]: """ >>> L, D, Lt = LDLT_decomposition([[2, 4, 6], [4, 9, 14], [6, 14, 19]]) >>> L