% pt    partial transposition of a density matrix
%       for a qudit register.
%    pt(M,list,d) computes the matrix obtained from M
%    by partially transposing the qudits given in the list.
%    The numbering of the qudits starts with 1, not from 0.
%    Here d is the dimension of the qudits.
%    If d is not provided then d is taken to be 2 (qubits).
%    M is normalized making the trace 1 before any further
%    computation. If instead of a density matrix, a state vector
%    is provided for M, then this vector is transformed to 
%    a density matrix before computing the partial transpose.

function rhoT=pt(rho,list,varargin)

rho=ketbra2(rho);

if nargin==2,
   d=2;
elseif nargin==3,
   d=varargin{1};
else    
   error('Wrong number of input arguments.');
end %if
 
   for n=1:length(list)
      nn=list(n);
      nmax=d^(nn-1);
      nmax2=d^nn;
      [y,x]=size(rho);
      rhoT=zeros(y,x);

      % Partial transpostion #1
      for k=1:nmax
      for l=1:nmax
          rhoT(k:nmax:end,l:nmax:end)=rho(k:nmax:end,l:nmax:end).';
      end %for
      end %for

      rho=rhoT;

      % Partial transpostion #2
      for k=1:nmax2
      for l=1:nmax2
          rhoT(k:nmax2:end,l:nmax2:end)=rho(k:nmax2:end,l:nmax2:end).';
      end %for
      end %for 
      
      rho=rhoT;
   end %for