# cirq.SumOfProducts

Represents control values as AND (product) clauses, each of which applies to all N qubits.

`SumOfProducts` representation describes the control values as a union of n-bit tuples, where each n-bit tuple represents an allowed assignment of bits for which the control should be activated. This expanded representation allows us to create control values combinations which cannot be factored as a `ProductOfSums` representation.

#### For example:

1) `(|00><00| + |11><11|) X + (|01><01| + |10><10|) I` represents an operator which flips the third qubit if the first two qubits are `00` or `11`, and does nothing otherwise. This can be constructed as

`````````
>>> xor_control_values = cirq.SumOfProducts(((0, 0), (1, 1)))
>>> q0, q1, q2 = cirq.LineQubit.range(3)
>>> xor_cop = cirq.X(q2).controlled_by(q0, q1, control_values=xor_control_values)
```
``````

2) `(|00><00| + |01><01| + |10><10|) X + (|11><11|) I` represents an operators which flips the third qubit if the `nand` of first two qubits is `1` (i.e. first two qubits are either `00`, `01` or `10`), and does nothing otherwise. This can be constructed as:

``````<pre class="devsite-click-to-copy prettyprint lang-py">
<code class="devsite-terminal" data-terminal-prefix="&gt;&gt;&gt;">nand_control_values = cirq.SumOfProducts(((0, 0), (0, 1), (1, 0)))</code>
<code class="devsite-terminal" data-terminal-prefix="&gt;&gt;&gt;">q0, q1, q2 = cirq.LineQubit.range(3)</code>
<code class="devsite-terminal" data-terminal-prefix="&gt;&gt;&gt;">nand_cop = cirq.X(q2).controlled_by(q0, q1, control_values=nand_control_values)</code>
<code class="no-select nocode">    </code>
</pre>
``````

`is_trivial`

## Methods

### `expand`

View source

Returns an expanded `cirq.SumOfProduct` representation of this control values.

### `validate`

View source

Validates that all control values for ith qubit are in range [0, qid_shaped[i])

### `__and__`

View source

Returns a cartesian product of all control values predicates in `self` x `other`.

The `and` of two control values `cv1` and `cv2` represents a control value object acting on the union of qubits represented by `cv1` and `cv2`. For example:

````cv1 = cirq.ProductOfSums([(0, 1), 2])`
`cv2 = cirq.SumOfProducts([[0, 0], [1, 1]])`
`assert cirq.num_qubits(cv1 & cv2) == cirq.num_qubits(cv1) + cirq.num_qubits(cv2)`
```

Args
`other` An instance of `AbstractControlValues`.

Returns
An instance of `AbstractControlValues` that represents the cartesian product of control values represented by `self` and `other`.

View source

### `__iter__`

View source

Returns the combinations tracked by the object.

View source

### `__or__`

View source

Returns a union of all control values predicates in `self` + `other`.

Both `self` and `other` must represent control values for the same set of qubits and hence their `or` would also be a control value object acting on the same set of qubits. For example:

````cv1 = cirq.ProductOfSums([(0, 1), 2])`
`cv2 = cirq.SumOfProducts([[0, 0], [1, 1]])`
`assert cirq.num_qubits(cv1 | cv2) == cirq.num_qubits(cv1) == cirq.num_qubits(cv2)`
```

Args
`other` An instance of `AbstractControlValues`.

Returns
An instance of `AbstractControlValues` that represents the union of control values represented by `self` and `other`.

Raises
`ValueError` If `cirq.num_qubits(self) != cirq.num_qubits(other)`.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Missing the information I need" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Too complicated / too many steps" },{ "type": "thumb-down", "id": "outOfDate", "label":"Out of date" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Samples / code issue" },{ "type": "thumb-down", "id": "otherDown", "label":"Other" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Easy to understand" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Solved my problem" },{ "type": "thumb-up", "id": "otherUp", "label":"Other" }]