% Gausselimination mit vollstaendiger Pivotierung
function x = gauss_vollpivot (A,b)
  
M = [A b];
n = length(b);
P = eye(n);

% Vorwaertselimination:
for j=1:n-1
  % Suche das Pivotelement
  [column_max, c_max_index] = max(abs(M(j:n,j:n)));
  [pivot, p] = max(column_max);
  ps = p+j-1;              % Spaltenindex des Pivots
  pz = c_max_index(p)+j-1; % Zeilenindex des Pivots
  % Vertausche j-te Zeile mit der Pivotzeile
  x       = M(j, :);
  M(j, :) = M(pz,:);
  M(pz,:) = x;
  % Vertausche j-te Spalte mit der Pivotspalte
  x       = M(:,j);
  M(:, j) = M(:,ps);
  M(:,ps) = x;
  % Speichere die Spaltenpermutation in der P-Matrix
  x       = P(:,j);
  P(:, j) = P(:,ps);
  P(:,ps) = x;
  % Jetzt weiter wie bisher...
  for k=j+1:n
    M(k,:) = M(k,:) - (M(k,j)/M(j,j)) * M(j,:);
  end
end

% Rueckwaerts einsetzen:
x = [zeros(n,1); -1];
for j=0:n-1
  x(n-j) = -M(n-j,:)*x / M(n-j,n-j);
end
x(n+1) = [];
x = P*x;