From 553953bb22a2588a9d1def60e5c99c0afb66d0b5 Mon Sep 17 00:00:00 2001 From: Arlan Tengga Date: Mon, 16 Feb 2026 15:38:51 +0700 Subject: [PATCH 1/3] feat: menambahkan special matriks --- matrix/matriks_special.py | 147 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 matrix/matriks_special.py diff --git a/matrix/matriks_special.py b/matrix/matriks_special.py new file mode 100644 index 00000000..df3aaae4 --- /dev/null +++ b/matrix/matriks_special.py @@ -0,0 +1,147 @@ +# https://en.wikipedia.org/wiki/Hankel_matrix +# https://en.wikipedia.org/wiki/Toeplitz_matrix +# https://en.wikipedia.org/wiki/Pascal_matrix +# https://id.wikipedia.org/wiki/Matriks_identitas +from typing import Union + + +def faktorial(n) -> int: + """ + >>> faktorial(5) + 120 + """ + if n < 0: + raise ValueError('nilai harus positif') + if n == 0: + return 1 + else: + f = 1 + for i in range(1, n + 1): + f *= i + return f + + +def kombinasi(n : int, r : int) -> int: + """ + >>> kombinasi(5, 2) + 10.0 + """ + if n < 0 or r < 0: + raise ValueError("Nilai Harus Positif") + if r > n: + return 0 + else: + penyebut = faktorial(n) + pembilang = faktorial(r) * faktorial(n - r) + C = penyebut / pembilang + return C + + +def identity(n : int = 2) -> list[list[Union[int]]]: + """ + Membuat matriks identitas + + >>> identity(3) + [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + """ + A = [] + for i in range(n): + row = [] + for j in range(n): + if (j == i): + row.append(1) + else: + row.append(0) + A.append(row) + return A + + +def hankel(A, b=1) -> list[list[Union[int, float]]]: + """ + Membuat matriks hankel + + >>> hankel(3) + [[1, 2, 3], [2, 3, 4], [3, 4, 5]] + """ + res = [] + for i in range(b, A + 1): + row = [] + for j in range(b, A + 1): + row.append(i + j - 1) + res.append(row) + return res + + +def toeplite(A, b=1) -> list[list[Union[int, float]]]: + """ + Membuat matriks hankel + + >>> toeplite(3) + [[0, -1, -2], [1, 0, -1], [2, 1, 0]] + """ + res = [] + for i in range(b, A + 1): + row = [] + for j in range(b, A + 1): + row.append(i - j) + res.append(row) + return res + + +def hilbert(A, b=1) -> list[list[Union[int, float]]]: + """ + Membuat matriks hilbert + + >>> hilbert(2) + [[1.0, 0.5], [0.5, 0.3333333333333333]] + """ + res = [] + for i in range(b, A + 1): + row = [] + for j in range(b, A + 1): + row.append(1 / (i + j - 1)) + res.append(row) + return res + + +def pascal(n, kind='simetri') -> list[list[Union[int, float]]]: + """ + Membuat matriks pascal dengan beberapa tipe + + >>> pascal(3) + [[1.0, 1.0, 1.0], [1.0, 2.0, 3.0], [1.0, 3.0, 6.0]] + >>> pascal(3, kind = 'lower') + [[1.0, 0, 0], [1.0, 1.0, 0], [1.0, 2.0, 1.0]] + """ + L_n = [] + for i in range(n): + colum = [] + for j in range(n): + x = kombinasi(i, j) + colum.append(x) + L_n.append(colum) + + r, c = len(L_n), len(L_n[0]) + t = [[0] * r for _ in range(c)] + for i in range(r): + for j in range(c): + t[j][i] = L_n[i][j] + + res = [[0 for _ in range(len(L_n))] for _ in range(len(L_n))] + for i in range(len(L_n)): + for j in range(len(t[0])): + for k in range(len(t)): + res[i][j] += L_n[i][k] * t[k][j] + + if kind.lower() == 'lower': + return L_n + elif kind.lower() == 'upper': + return t + else: + return res + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From f5185734d780820bc9f010923716a4520a1cb0af Mon Sep 17 00:00:00 2001 From: Arlan Tengga Date: Mon, 16 Feb 2026 15:46:47 +0700 Subject: [PATCH 2/3] fix: memperbaiki test --- matrix/matriks_special.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/matrix/matriks_special.py b/matrix/matriks_special.py index df3aaae4..2cc65400 100644 --- a/matrix/matriks_special.py +++ b/matrix/matriks_special.py @@ -11,7 +11,7 @@ def faktorial(n) -> int: 120 """ if n < 0: - raise ValueError('nilai harus positif') + raise ValueError("nilai harus positif") if n == 0: return 1 else: @@ -21,7 +21,7 @@ def faktorial(n) -> int: return f -def kombinasi(n : int, r : int) -> int: +def kombinasi(n: int, r: int) -> int: """ >>> kombinasi(5, 2) 10.0 @@ -37,7 +37,7 @@ def kombinasi(n : int, r : int) -> int: return C -def identity(n : int = 2) -> list[list[Union[int]]]: +def identity(n: int = 2) -> list[list[Union[int]]]: """ Membuat matriks identitas @@ -48,7 +48,7 @@ def identity(n : int = 2) -> list[list[Union[int]]]: for i in range(n): row = [] for j in range(n): - if (j == i): + if j == i: row.append(1) else: row.append(0) @@ -104,7 +104,7 @@ def hilbert(A, b=1) -> list[list[Union[int, float]]]: return res -def pascal(n, kind='simetri') -> list[list[Union[int, float]]]: +def pascal(n, kind="simetri") -> list[list[Union[int, float]]]: """ Membuat matriks pascal dengan beberapa tipe @@ -133,9 +133,9 @@ def pascal(n, kind='simetri') -> list[list[Union[int, float]]]: for k in range(len(t)): res[i][j] += L_n[i][k] * t[k][j] - if kind.lower() == 'lower': + if kind.lower() == "lower": return L_n - elif kind.lower() == 'upper': + elif kind.lower() == "upper": return t else: return res From 06ba43487ccc2e774ec8485ef656be50b498536a Mon Sep 17 00:00:00 2001 From: Arlan Tengga Date: Mon, 16 Feb 2026 15:52:57 +0700 Subject: [PATCH 3/3] fix: memperbaiki test --- matrix/matriks_special.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/matrix/matriks_special.py b/matrix/matriks_special.py index 2cc65400..d2e28ca7 100644 --- a/matrix/matriks_special.py +++ b/matrix/matriks_special.py @@ -128,9 +128,12 @@ def pascal(n, kind="simetri") -> list[list[Union[int, float]]]: t[j][i] = L_n[i][j] res = [[0 for _ in range(len(L_n))] for _ in range(len(L_n))] - for i in range(len(L_n)): - for j in range(len(t[0])): - for k in range(len(t)): + x = len(L_n) + y = len(t) + y1 = len(t[0]) + for i in range(x): + for j in range(y1): + for k in range(y): res[i][j] += L_n[i][k] * t[k][j] if kind.lower() == "lower":