stelsel = [
    [ 1, 1, 1, 0, 0, 0, 0, 0,  8 ], 
    [ 0, 0, 0, 1, 1, 0, 0, 0, 11 ], 
    [ 0, 0, 0, 0, 0, 1, 1, 1, 13 ],
    [ 1, 0, 0, 1, 0, 0, 1, 0, 17 ],
    [ 0, 1, 0, 0, 1, 0, 0, 1, 11 ],
    [ 0, 1, 0, 1, 0, 1, 0, 0,  7 ],
    [ 0, 0, 1, 0, 1, 0, 1, 0, 17 ],
    [ 0, 0, 1, 0, 0,-1, 0, 0,  0 ]
]


# pizzaraadsel - resulteert in een deling door 0
stelsel1 = [
    [ 1, 1, 0, 0, 6],
    [ 0, 0, 1, 1, 6],
    [ 0,-1, 0, 1, 1],
    [ 1, 0,-2, 0, 0]
]


# verwissel twee rijen (vergelijkingen) van een stelsel met elkaar
# de rijen staan op posities index_1 en index_2
def verwissel(stelsel, index_1, index_2):
    hulp = stelsel[index_1]
    stelsel[index_1] = stelsel[index_2]
    stelsel[index_2] = hulp


# deel de rij (vergelijking) door het gegeven getal (in-place)
def deel_door(rij, deler):
    for i in range(len(rij)):
        rij[i] /= deler
        

# verminder rij_1 met een aantal keer rij_2 (in-place)
def verminder_met_veelvoud(rij_1, rij_2, factor):
    for i in range(len(rij_1)):
        rij_1[i] -= rij_2[i] * factor


# zoek een element in kolom k dat niet nul is, en geef het rijnummer terug.
# Zoek enkel in de rijen onder rij k
def niet_nul_element (stelsel, k):
    r = k + 1
    while stelsel[r][k] == 0:
        r += 1
    return r


## de eliminatie
n = len(stelsel)

for k in range (0,n):   # kolomnummer
    # zorg dat er een 1 komt op plaats stelsel[k][k]
    #...
    if stelsel[k][k] == 0:
        r = niet_nul_element(stelsel,k)
        verwissel(stelsel,k,r)
    deel_door(stelsel[k], stelsel[k][k])
    # reduceer alle rijen, behalve rij k
    for r in range (0,n):
        if r != k:
            verminder_met_veelvoud(stelsel[r], stelsel[k], stelsel[r][k]) # !!!!

# toont het stelsel
for i in range(n):
    for j in range(n + 1):
        print(f"{stelsel[i][j]:<5.2f}  ", end="")
    print()

