# cirq.interop.quirk.QuirkArithmeticOperation

Applies arithmetic to a target and some inputs.

Inherits From: `ArithmeticOperation`, `Operation`

Implements Quirk-specific implicit effects like assuming that the presence of an 'r' input implies modular arithmetic.

In Quirk, modular operations have no effect on values larger than the modulus. This convention is used because unitarity forces some convention on out-of-range values (they cannot simply disappear or raise exceptions), and the simplest is to do nothing. This call handles ensuring that happens, and ensuring the new target register value is normalized modulo the modulus.

`identifier` The quirk identifier string for this operation.
`target` The target qubit register.
`inputs` Qubit registers (or classical constants) that determine what happens to the target.

`gate`

`operation`

`qubits`

`tags` Returns a tuple of the operation's tags.
`untagged` Returns the underlying operation without any tags.

## Methods

### `apply`

View source

Returns the result of the operation operating on classical values.

For example, an addition takes two values (the target and the source), adds the source into the target, then returns the target and source as the new register values.

The `apply` method is permitted to be sloppy in three ways:

1. The `apply` method is permitted to return values that have more bits than the registers they will be stored into. The extra bits are simply dropped. For example, if the value 5 is returned for a 2 qubit register then 5 % 22 = 1 will be used instead. Negative values are also permitted. For example, for a 3 qubit register the value -2 becomes -2 % 23 = 6.
2. When the value of the last `k` registers is not changed by the operation, the `apply` method is permitted to omit these values from the result. That is to say, when the length of the output is less than the length of the input, it is padded up to the intended length by copying from the same position in the input.
3. When only the first register's value changes, the `apply` method is permitted to return an `int` instead of a sequence of ints.

The `apply` method must be reversible. Otherwise the operation will not be unitary, and incorrect behavior will result.

#### Examples:

A fully detailed adder:

``````def apply(self, target, offset):
return (target + offset) % 2**len(self.target_register), offset
``````

The same adder, with less boilerplate due to the details being handled by the `ArithmeticOperation` class:

``````def apply(self, target, offset):
return target + offset
``````

### `controlled_by`

View source

Returns a controlled version of this operation. If no control_qubits are specified, returns self.

Args
`control_qubits` Qubits to control the operation by. Required.
`control_values` For which control qubit values to apply the operation. A sequence of the same length as `control_qubits` where each entry is an integer (or set of integers) corresponding to the qubit value (or set of possible values) where that control is enabled. When all controls are enabled, the operation is applied. If unspecified, control values default to 1.

### `registers`

View source

The data acted upon by the arithmetic operation.

Each register in the list can either be a classical constant (an `int`), or else a list of qubits/qudits (a `List[cirq.Qid]`). Registers that are set to a classical constant must not be mutated by the arithmetic operation (their value must remain fixed when passed to `apply`).

Registers are big endian. The first qubit is the most significant, the last qubit is the 1s qubit, the before last qubit is the 2s qubit, etc.

Returns
A list of constants and qubit groups that the operation will act upon.

### `transform_qubits`

View source

Returns the same operation, but with different qubits.

Args
`qubit_map` A function or a dict mapping each current qubit into a desired new qubit.

Returns
The receiving operation but with qubits transformed by the given function.

Raises
`TypeError` qubit_map was not a function or dict mapping qubits to qubits.

### `validate_args`

View source

Raises an exception if the `qubits` don't match this operation's qid shape.

Call this method from a subclass's `with_qubits` method.

Args
`qubits` The new qids for the operation.

Raises
`ValueError` The operation had qids that don't match it's qid shape.

View source

### `with_qubits`

View source

Returns the same operation, but applied to different qubits.

Args
`new_qubits` The new qubits to apply the operation to. The order must exactly match the order of qubits returned from the operation's `qubits` property.

### `with_registers`

View source

Returns the same operation targeting different registers.

Args
`new_registers` The new values that should be returned by the `registers` method.

Returns
An instance of the same kind of operation, but acting on different registers.

### `with_tags`

View source

Creates a new TaggedOperation, with this op and the specified tags.

This method can be used to attach meta-data to specific operations without affecting their functionality. The intended usage is to attach classes intended for this purpose or strings to mark operations for specific usage that will be recognized by consumers. Specific examples include ignoring this operation in optimization passes, hardware-specific functionality, or circuit diagram customizability.

Tags can be a list of any type of object that is useful to identify this operation as long as the type is hashable. If you wish the resulting operation to be eventually serialized into JSON, you should also restrict the operation to be JSON serializable.

Args
`new_tags` The tags to wrap this operation in.

View source

### `__ne__`

View source

[{ "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" }]