function T = tableausimplexe(A,b,c,B,R)
% TABLEAUSIMPLEXE renvoie le tableau du simplexe en optimisation.
%   T=tableausimplexe(A,b,c,B,R) renvoie le tableau du simplexe 
%   du problème Az=b, z>=0, c'*z--> max, pour les bases B et R.
%   où length(B)=size(A,1). Si A restreint aux colonnes indiquées 
%   par B n'est pas inversible, TABLEAUSIMPLEXE renvoie erreur.
%
%   T=tableausimplexe(A,b,c,B) équivaut à T=tableausimplexe(A,b,c,B,R) 
%   où R contient l'ensemble 1:size(A,2) privé de B ordonné dans l'ordre
%   croissant
%
%   T=tableausimplexe(A,b,c) équivaut à T=tableausimplexe(A,b,c,B,R) 
%   où B=[1:size(A,1)]' et R=[size(A,1)+1:size(A,2)]' 

m=size(A,1);
n=size(A,2);

if nargin <3
  error('pas assez d arguments')
end
if nargin <4
  B=[1:m]';
end
if nargin <5
  %On déduit le R à partir du B;
  R=[];
  for i=1:n
    if length(find(B==i))==0
      R=[R i];
    end
  end
end
if m~=length(B)
  error('B doit contenir size(A,1) indices');
end
if length(R)~=n-m
  error('R doit contenir n-m indices');
end

T(1:m,:)=A(:,B)\[A(:,R) b];
T(m+1,:)= -c(B)'*T(1:m,:) + [c(R)' 0];
