# IsProductOperator

Jump to navigation
Jump to search

IsProductOperator | |

Determines if an operator is an elementary tensor | |

Other toolboxes required | none |
---|---|

Related functions | IsProductVector OperatorSchmidtDecomposition OperatorSchmidtRank |

Function category | Entanglement and separability |

` 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)`

## Argument descriptions

### 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`is a scalar, it is assumed that`X`lives on the tensor product of two spaces, the first of which has dimension`DIM`and the second of which has dimension`length(X)/DIM`. - If $X \in M_{n_1} \otimes \cdots \otimes M_{n_p}$ then
`DIM`should be a row vector containing the dimensions (i.e.,`DIM = [n_1, ..., n_p]`). - 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`should be a matrix with two rows. The first row of`DIM`should contain the row dimensions of the subsystems (i.e., the m_{i}'s) and its second row should contain the column dimensions (i.e., the n_{i}'s). In other words, you should set`DIM = [m_1, ..., m_p; n_1, ..., n_p]`.

- If

### Output arguments

`IPO`: Either 1 or 0, indicating that`X`is or is not an elementary tensor.`DEC`(optional): If`IPO = 1`(i.e.,`X`is an elementary tensor), then`DEC`is a cell containing two or more operators, the tensor product of which is`X`. If`IPO = 0`then`DEC`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:

```
>> [ipo,dec] = IsProductOperator(eye(8),[2,2,2])
ipo =
1
dec =
[2x2 double] [2x2 double] [2x2 double]
>> celldisp(dec)
dec{1} =
0.9170 0
0 0.9170
dec{2} =
-0.9170 0
0 -0.9170
dec{3} =
-1.1892 0
0 -1.1892
```

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:

```
>> Tensor(dec)
ans =
1.0000 0 0 0 0 0 0 0
0 1.0000 0 0 0 0 0 0
0 0 1.0000 0 0 0 0 0
0 0 0 1.0000 0 0 0 0
0 0 0 0 1.0000 0 0 0
0 0 0 0 0 1.0000 0 0
0 0 0 0 0 0 1.0000 0
0 0 0 0 0 0 0 1.0000
```

## Source code

Click here to view this function's source code on github.