Determinante (eliminazione di Gauss)

Vedi la discussione

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