function result = aufgabe2()
    N = 40;
    time1 = zeros(N);
    err1 = zeros(N);
    
    time2 = zeros(N);
    err2 = zeros(N);
    
    for m = 2:2:N
        f = ones(m*m,1);
        A = AN(m);
        
        tic;
        [L, R] = LRZerlegung(A);
        x = Loesen(L, R, f);
        time1(m) = toc;
        
        err1(m) = norm(A*x-f);
        printf("m = %d,\tn = %d:\tt=%f,\tnorm=%f\n", m, m*m, time1(m), err1(m));
    end
    
    printf("-----------------------------------------\n");
    
    for m = 2:2:N
        f = ones(m*m,1);
        A = AN(m);
        
        tic;
        [L, R] = LRZerlegungBand(A);
        x = LoesenBand(L, R, f);
        time2(m) = toc;
        
        err2(m) = norm(A*x-f);
        printf("m = %d,\tn = %d:\tt=%f,\tnorm=%f\n", m, m*m, time2(m), err2(m));
    end
    
    result = NaN
end

function result = AN(m)
    B = 4*eye(m)-diag(ones(m-1,1),1)-diag(ones(m-1,1),-1);
    result = [];
    for i = 1:m
        row = [];
        for j=1:m
            if j == i
                add = B;
            elseif j == i-1 || j == i+1
                add = (-1)*eye(m);
            else
                add = zeros(m);
            end
            row = [row add];
        end
        result = [result; row];
    end
    result;
end

function [L, R] = LRZerlegung(A)
    [rows, cols] = size(A);
    if rows != cols
        L = NaN;
        R = NaN;
        return
    end
    
    n = cols;
    
    for i = 1:n
        A(i+1:n, i) = A(i+1:n, i)/A(i, i);
        A(i+1:n, i+1:n) = A(i+1:n, i+1:n) - A(i+1:n, i) * A(i, i+1:n);
    end
    R = triu(A);
    L = A-R+eye(n);
end

function x = Loesen(L, R, b)
    [cols, rows] = size(R);
    x = zeros(cols,1);
    y = zeros(cols,1);
    
    y(1) = b(1)/L(1,1);
    for i = 2:cols
        y(i) = (b(i) - L(i, 1:i-1)*y(1:i-1))/L(i,i);
    end
    
    x(cols) = y(cols)/R(cols,cols);
    for i = (cols-1):-1:1
        x(i) = (y(i) - R(i, i+1:cols)*x(i+1:cols))/R(i, i);
    end
end

function [L, R] = LRZerlegungBand(A)
    % Wir wissen, daß A eine Bandmatrix mit Bandbreite 2m ist. (m=Sqrt(n))
    [rows, cols] = size(A);
    if rows != cols
        L = NaN;
        R = NaN;
        return
    end
    
    n = cols;
    m = half_bw = sqrt(n);
    
    for i = 1:n
        A(i+1:min(i+m,n), i) = A(i+1:min(i+m,n), i)/A(i, i);
        A(i+1:min(i+m,n), i+1:min(i+m,n)) = A(i+1:min(i+m,n), i+1:min(i+m,n)) - A(i+1:min(i+m,n), i) * A(i, i+1:min(i+m,n));
    end
    R = triu(A);
    L = A-R+eye(n);
end

function x = LoesenBand(L, R, b)
    [cols, rows] = size(R);
    m = half_bw = sqrt(cols);
    x = zeros(cols,1);
    y = zeros(cols,1);
    
    y(1) = b(1)/L(1,1);
    for i = 2:cols
        y(i) = (b(i) - L(i, max(i-m,1):i-1)*y(max(i-m,1):i-1))/L(i,i);
    end
    
    x(cols) = y(cols)/R(cols,cols);
    for i = (cols-1):-1:1
        x(i) = (y(i) - R(i, i+1:min(i+m,cols))*x(i+1:min(i+m,cols)))/R(i, i);
    end
end
