import numpy as np def resolve_up(A: np.array, b: np.array) -> np.array: x = np.zeros(len(b)) for i in range(len(A) - 1, -1, -1): right_of_diagonal = 0.0 for k in range(i+1, len(A)): right_of_diagonal += A[i, k] * x[k] x[i] = (b[i] - right_of_diagonal) / A[i,i] return x def resolve_down(A: np.array, b: np.array) -> np.array: x = np.zeros(len(b)) for i in range(len(A)): sum = 0.0 for k in range(i): sum += A[i,k] * x[k] x[i] = (b[i] - sum) / A[i, i] return x if __name__ == '__main__': A = np.array([ [2, 4, -6], [0, -1, 1], [0, 0, -2], ], dtype=float) b = np.array([2, 3, -7], dtype=float) A_down = np.array([ [2, 0, 0], [4, -1, 0], [-6, 1, -2], ]) b_down = np.array([2, 3, -7]) print(resolve_up(A, b)) print(resolve_down(A_down, b_down))