def gauss(A,b,offset=(0,0)): ox,oy = offset if len(A)-1 < oy: return A,b for i in range(oy,len(A)): if A[i][ox] != 0: if i > oy: A[i], A[oy] = A[oy], A[i] b[i], b[oy] = b[oy], b[i] break for i in range(oy+1,len(A)): if A[i][ox] != 0: c = A[i][0]/A[oy][0] A[i] = [ (A[i][x] - A[oy][x]*c) for x in range(ox,len(A[i])) ] b[i] = b[i] - b[oy]*c return gauss(A,b,offset=(ox+1,oy+1)) def vprint(A): for i in range(len(A)): print("%3d" % A[i]) def pprint(A): for i in range(len(A)): print( " ".join(["%3d" % (A[i][j]) for j in range(len(A[i])) ]) ) A = [ [ 1, 1 ], [ 1,-1 ] ] b = [ 5, 3 ] pprint(A) vprint(b) A, b = gauss(A,b) pprint(A) vprint(b)