```% printv   Prints a state vector in product basis.
%   printv(s) gives a string describing the state vector
%   s as a linear combination of elements of the product basis
%   of a qubit register. The form printv(s,t) makes it possible
%   to give a threshold t above which an element
%   of the state vector is considered 0. The default for t
%   is 10^-4.

function s=printv(v,varargin);

% Setting the treshold
if length(varargin)==0,
vmin=1e-4;
elseif length(varargin)==1,
vmin=varargin{1};
else
error('Wrong number of input arguments.')
end %if

index=find(abs(v)>vmin);

N=log2(length(v));

s='';
for n=1:length(index)
ii=index(n);
vv=v(ii);
b=dec2bin(2^N+ii-1);
b=b(2:end);
if isempty(s),
if vv==1,
s=['|' b '>'];,
elseif vv==-1,
s=[ '-|' b '>'];,
elseif isreal(vv) && vv>0,
s=[ num2str(vv) '|' b '>'  ];
elseif isreal(vv) && vv<0,
s=[ '-' num2str(abs(vv)) '|' b '>'  ];
elseif isreal(vv/i) && vv/i>0,
if vv==i,
s=[ 'i|' b '>'  ];
else
s=[ num2str(vv/i) 'i|' b '>'  ];
end %if
elseif isreal(vv/i) && vv/i<0,
if vv==-i,
s=[ '-i|' b '>'  ];
else
s=[ '-' num2str(abs(vv/i)) 'i|' b '>'  ];
end %if
else
s=[ '(' num2str(vv) ')|' b '>'  ];
end %if
else
if vv==1,
s=[s '+|' b '>'];,
elseif vv==-1,
s=[s '-|' b '>'];,
elseif isreal(vv) && vv>0,
s=[ s '+' num2str(vv) '|' b '>'  ];
elseif isreal(vv) && vv<0,
s=[ s '-' num2str(abs(vv)) '|' b '>'  ];
elseif isreal(vv/i) && vv/i>0,
if vv==i,
s=[ s '+i|' b '>'  ];
else
s=[ s '+' num2str(abs(vv)) 'i|' b '>'  ];
end %if
elseif isreal(vv/i) && vv/i<0,
if vv==-i,
s=[ s '-i|' b '>'  ];
else
s=[ s '-' num2str(abs(vv/i)) 'i|' b '>'  ];
end %if
else
s=[ s '+(' num2str(vv) ')|' b '>'  ];
end %if
end %if
end %for
if isempty(s)
s='0';
end

```