Can someone please help me making these gates on CIRQ programming:
- Decrement Gate (-1)
- Splitter Gate (If possible)
I was having trouble implementing these and was not sure if it's possible either.
Thanks in advance.
I'm not sure what a splitter operation is.
There is a class cirq.ArithmeticOperation
which is a helper class for implementing arithmetic. You can implement an increment gate with it like this:
import cirq
class Increment(cirq.ArithmeticOperation):
def __init__(self, target_register):
self.target_register = target_register
def registers(self):
return [self.target_register]
def with_registers(self, *new_registers):
return Increment(*new_registers)
def apply(self, target_value):
return [target_value + 1]
The helper class will ensure that several useful methods are implemented, such as a reasonably efficient simulation method. Note that the new register value returned in apply
automatically wraps modulo $2^n$ where $n$ is the size of the register. Also it is your responsibility to make sure the arithmetic operation is actually reversible.
Then you can use it like this:
register = cirq.LineQubit.range(2)
circuit = cirq.Circuit(Increment(register))
print(circuit)
# 0: ───<__main__.Increment object at 0x000002594B1F03C8>───
# │
# 1: ───#2──────────────────────────────────────────────────
print(cirq.unitary(Increment(register)))
# [[0.+0.j 0.+0.j 0.+0.j 1.+0.j]
# [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
# [0.+0.j 1.+0.j 0.+0.j 0.+0.j]
# [0.+0.j 0.+0.j 1.+0.j 0.+0.j]]