#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float abs(float x){
       if (x>0){
          return x;
          }
       else {
            return (-1)*x;
            }
       }

int main(){
    
    int i,j,k,l,n,r,v,w,y;
   
printf("bitte Zeilenanzahl eingeben: \n");
scanf ("%d",&n);

    float D[n][n],E[n][n],A[n][n],a[n][n],L[n][n],R[n][n],S[n-1][n][n],P[n][n][n],q;
    
    //Matrizen s mit Einheitsmatrizen vorbelegen:
    for (k=1;k<=n-1;k++){
        for (i=1;i<=n;i++){
            for (j=1;j<=n;j++){
                if (i==j) {S[k][i][j]=1;P[k][i][j]=1;}
                else {S[k][i][j]=0;P[k][i][j]=0;}
            }
        }
    }    
    // A eingeben:        
         for (i=1;i<=n;i++){
             for (j=1;j<=n;j++){
                 printf("bitte Eintrag A[%d][%d] eingeben:", i, j);
                 scanf("%f",&A[i][j]);
                 a[i][j]=A[i][j]; //für Aufgabenteil 4d 
             }
         }    
    // L und R mit Pivotisierung in A berechnen:    
       for (k=1;k<=n-1;k++){
           //Pivotierung:
           r=k;
           q=abs(A[k][k]);
           for (l=k+1;l<=n;l++){
               if (abs(A[l][k])>q){
               r=l;
               q=abs(A[l][k]);
               }
           }
       S[k][k][k]=0;
       S[k][r][r]=0;
       S[k][k][r]=1;
       S[k][r][k]=1;               
       for (i=1;i<=n;i++){
           for (j=1;j<=n;j++){
               D[i][j]=0;
               for (l=1;l<=n;l++){
                   D[i][j]=D[i][j]+S[k][i][l]*A[l][j];
               }
           }
       } 
       for (i=1;i<=n;i++){
           for (j=1;j<=n;j++){
               A[i][j]=D[i][j];
           }
       }    
       //Gauß:         
           for (i=k+1;i<=n;i++){
               A[i][k]=A[i][k]/A[k][k];
               for (j=k+1;j<=n;j++){
                   A[i][j]=A[i][j]-A[k][j]*A[i][k];
               }
           }
       }      
    // P berechnen:
    for (k=1;k<=n-1;k++){
         for (i=1;i<=n;i++){
           for (j=1;j<=n;j++){
               P[k+1][i][j]=0;
               for (l=1;l<=n;l++){
                   P[k+1][i][j]=P[k+1][i][j]+P[k][i][l]*S[n-k][l][j];
               }
           }
         }
    } 
    // L und R mit Nullen füllen:         
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            L[i][j]=0;
            R[i][j]=0;
        }
    }            
    // L und R mit den Einträgen aus A füllen:    
    for (i=1;i<=n;i++){
        for (j=1;j<i;j++){
              L[i][j]=A[i][j];
        }
    }
    
    for (i=1;i<=n;i++){
        L[i][i]=1;
    }
        
    for (j=1;j<=n;j++){
        for (i=1;i<=j;i++){
            R[i][j]=A[i][j];
        }      
    }    
    // Ausgabe von L:  
printf ("\nL ergibt sich zu : \n \n");
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n-1;j++){
            printf ("  %f\t", L[i][j]);
        }
        printf ("  %f\n", L[i][n]);
    }    
   // Ausgabe von R:  
printf ("\nR ergibt sich zu : \n \n");    
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n-1;j++){
            printf ("  %f\t", R[i][j]);
        }
        printf ("  %f\n", R[i][n]);
    } 
    // Ausgabe von P:
    printf ("\nP ergibt sich zu : \n \n");    
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n-1;j++){
            printf ("  %f\t", P[n][i][j]);
        }
        printf ("  %f\n", P[n][i][n]);
    }   
//Aufgabe 4c)

/*    float b[n],xSchlange[n],x[n];

    for (i=1;i<=n;i++){
            printf("\nb[%d] eingeben:",i);
            scanf("%f",&b[i]);
    }
    
           //Algorithmus:

    double summe; 
    for (i=1;i<=n;i++){
        xSchlange[i]=1/(L[i][i])*(b[i]-summe);   
        summe=0;     
        for (j=1;j<=i;j++){   
        summe=summe+xSchlange[j]*L[i+1][j];
        }
    }

    summe=0;
        for (i=n;i>=1;i--){
        x[i]=(1/R[i][i])*(xSchlange[i]-summe);
        summe=0;
                for (j=i;j<=n;j++){   
                summe=summe+x[j]*R[i-1][j];
                }
        }
 
        //Ausgabe von xSchlange
 
    for (i=1;i<n;i++){
        printf("%f  ",xSchlange[i]); 
        }  
        printf("%f  \n",xSchlange[n]);
        

        // Ausgabe der Lösung x:
        
    printf("Die Lösung von Ax=b ist:");    
    for (i=1;i<n;i++){
        printf("%f\t",x[i]);
        }
        printf("%f  \n",x[n]);
*/        
        
// Aufgabe 4d

   //Multiplikation von L und R:

   float B[n][n],z;
   for (i=1;i<=n;i++){
       for (j=1;j<=n;j++){
           z=0;
               for (k=1;k<=n;k++){
                   z=z+L[i][k]*R[k][j];
               }
           B[i][j]=z;
       }
   } 
   
   //Multiplikation von P und A:

   for (i=1;i<=n;i++){
       for (j=1;j<=n;j++){
           z=0;
               for (k=1;k<=n;k++){
                   z=z+P[n][i][k]*a[k][j];
               }
           E[i][j]=z;
       }
   }
     
   //Ausgabe von L*R:  
        
printf ("\nA-Schlange ergibt sich zu : \n \n");
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n-1;j++){
            printf ("  %f\t", B[i][j]);
        }
        printf ("  %f\n", B[i][n]);
    }    
    
    //Berechnung von P*A-L*R:
    
float C[n][n];
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            C[i][j]=E[i][j]-B[i][j];
        }
    }
    
        //Ausgabe von A-L*R:
    
printf ("\nDie Differenz von P*A und A-Schlange ergibt sich zu : \n \n");
    
    for (i=1;i<=n;i++){
        for (j=1;j<=n-1;j++){
            printf ("  %f\t", C[i][j]);
        }
        printf ("  %f\n", C[i][n]);
    }   
        
return 0;
}
         
         

