Si tratta di una prima stesura, si può rendere più leggibile!
def eliminazione_di_gauss(M):
nr = len(M)
nc = len(M[0])
cambi = 0
for pivot in range(nr):
# Eventuale scambio di righe
if(M[pivot][pivot] == 0):
riga = pivot+1
while(riga < nr) and (M[riga][pivot] == 0):
riga +=1
if(riga == nr):
return -1
M[pivot], M[riga] = M[riga], M[pivot]
cambi += 1
# Aggiorna le righe successive
for r in range(pivot+1, nr):
if(M[r][pivot]):
mp = M[r][pivot] / M[pivot][pivot]
for c in range(nc):
M[r][c] -= mp * M[pivot][c]
return cambi
#------------------------------------------------------------------
def prod_diag(m):
n = len(m)
prod = 1
for i in range(n):
prod *= m[i][i]
return prod
#------------------------------------------------------------------
from copy import deepcopy
A = [ [1, 1, 2],
[1, 1, 1],
[2, 3, 1]
]
C = deepcopy(A)
esito = eliminazione_di_gauss(C)
if(esito == -1): # L'eliminazione di Gauss è fallita
det = 0
else:
segno = +1 if(esito%2 == 0) else -1
det = segno * prod_diag(C)
print(esito, C, det) # 1 [[1, 1, 2], [0.0, 1.0, -3.0], [0.0, 0.0, -1.0]] 1.0