#!/usr/bin/env python3
# -*- coding: utf-8 -*-


# Musterlösung für Aufgabe 31

import numpy as np

def zeilenstufen(A):
    B = A.astype('float')
    m, n = B.shape
    zeilen_fertig = 0
    
    for k in range(n):
        # suche alle Einträge in B[zeilen_fertig:, k], die ungleich null sind
        allnonzero = np.flatnonzero(B[zeilen_fertig:, k])
        
        # falls in der k-ten Zeile alle null sind, sind wir fertig, ansonsten:
        if len(allnonzero)!=0:
            #nehme den ersten Eintrag, der ungleich 0 ist und vertausche die
            #entsprechenden Zeilen in B (falls nonzero=0 passiert in der Ver-
            #tauschung nichts)
            nonzero = allnonzero[0]
            B[[zeilen_fertig, nonzero+zeilen_fertig], :] =\
                B[[nonzero+zeilen_fertig, zeilen_fertig], :]
            
            #danach sorgen wir für die restlichen Nullen in der Spalte:
            for j in range(zeilen_fertig+1, m):
                B[j, :] -= (B[j, k]/B[zeilen_fertig, k])*B[zeilen_fertig, :]
                
            #Der Laufindex zeilen_fertig liefert uns direkt den Rang
            zeilen_fertig += 1
            
    return B, zeilen_fertig
