IsProductOperator

IsProductOperator is a function that determines if a bipartite or multipartite operator is an elementary tensor or not. If it is an elementary tensor, its tensor decomposition can be provided.

Syntax

 * IPO = IsProductOperator(X)
 * IPO = IsProductOperator(X,DIM)
 * [IPO,DEC] = IsProductOperator(X,DIM)

Input arguments

 * X: An operator that acts on a bipartite or multipartite Hilbert space.
 * DIM (optional, by default has all subsystems of equal dimension): A specification of the dimensions of the subsystems that X lives on. DIM can be provided in one of three ways:
 * If DIM</tt> is a scalar, it is assumed that X</tt> lives on the tensor product of two spaces, the first of which has dimension DIM</tt> and the second of which has dimension length(X)/DIM</tt>.
 * If $X \in M_{n_1} \otimes \cdots \otimes M_{n_p}$ then DIM</tt> should be a row vector containing the dimensions (i.e., DIM = [n_1, ..., n_p]</tt>).
 * If the subsystems aren't square (i.e., $X \in M_{m_1, n_1} \otimes \cdots \otimes M_{m_p, n_p}$) then DIM</tt> should be a matrix with two rows. The first row of DIM</tt> should contain the row dimensions of the subsystems (i.e., the mi's) and its second row should contain the column dimensions (i.e., the ni's). In other words, you should set DIM = [m_1, ..., m_p; n_1, ..., n_p]</tt>.

Output arguments

 * IPO</tt>: Either 1 or 0, indicating that X</tt> is or is not an elementary tensor.
 * DEC</tt> (optional): If IPO = 1</tt> (i.e., X</tt> is an elementary tensor), then DEC</tt> is a cell containing two or more operators, the tensor product of which is X</tt>. If <tt>IPO = 0</tt> then <tt>DEC</tt> is meaningless.

Examples
The following code verifies that the 8-by-8 identity operator (interpreted as living in 3-qubit space) is indeed a product operator:

As we can see, the tensor decomposition that is returned is not always the "cleanest" one that exists. However, we can verify that it is indeed a valid tensor decomposition of the identity operator: