debug = True

def crc(nachricht,polynom = '10011'):
    """
    zu der 'nachricht' und zu dem 'polynom' (Strings aus 0 und 1)
    wird die CRC-'Prüfsumme' berechnet (String aus 0 und 1)
    """
    lp = len(polynom)
    ln = len(nachricht)
    # an die Nachricht so viele Nullen anhängen wie der Grad des Generatorpolynoms beträgt
    for j in range(lp-1):
        nachricht = nachricht+'0'

    if debug:
        print(nachricht)
        if nachricht[0] == '0':
            print('0'*lp)
        else:
            print(polynom)
        print('-'*lp)

    nachricht = list(nachricht)

    schieberegister = nachricht[:lp]
    for i in range(ln):
        if schieberegister[0] == '1':
            for j in range(lp):
                if schieberegister[j] == polynom[j]:
                    schieberegister[j] = '0'
                else:
                    schieberegister[j] = '1'
        if i < ln-1:
            schieberegister = schieberegister[1:lp]+list(nachricht[lp+i])

            if debug:
                print(' '*(i+1)+''.join(schieberegister))
                if schieberegister[0] == '1':
                    print(' '*(i+1)+polynom)
                else:
                    print(' '*(i+1)+'0'*lp)
                print(' '*(i+1)+'-'*lp)
        if debug and (i == ln-1):
            print(' '*i+''.join(schieberegister))

    return ''.join(schieberegister[1:])
