Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_cirq_to_circuit():
q0 = cq.LineQubit(0)
q1 = cq.LineQubit(1)
q2 = cq.LineQubit(2)
gate = cirq_to_circuit(cq.Circuit(cq.X(q0)))[0]
assert isinstance(gate, qf.X)
assert gate.qubits == (0,)
gate = cirq_to_circuit(cq.Circuit(cq.X(q1)**0.4))[0]
assert isinstance(gate, qf.TX)
assert gate.qubits == (1,)
gate = cirq_to_circuit(cq.Circuit(cq.CZ(q1, q0)))[0]
assert isinstance(gate, qf.CZ)
assert gate.qubits == (1, 0)
gate = cirq_to_circuit(cq.Circuit(cq.CZ(q1, q0) ** 0.3))[0]
assert isinstance(gate, qf.CZPow)
assert gate.qubits == (1, 0)
def to_cirq_qubit(qubit: Qubit) -> cirq.Qid:
"""Convert qubit names (any python object) into
cirq qubits (subtypes of Qid). Returns either
a LineQubit (for integers), GridQubit (for tuples of row and column),
or a NamedQubit for all other objects.
"""
if isinstance(qubit, int):
return cirq.LineQubit(qubit)
elif isinstance(qubit, tuple) and len(qubit) == 2 \
and isinstance(qubit[0], int) and isinstance(qubit[1], int):
return cirq.GridQubit(row=qubit[0], col=qubit[1])
return cirq.NamedQubit(str(qubit))
register to a superposition state.
2. Multiple controlled-U**2**j operations implemented efficiently using
modular exponentiation.
3. Inverse Quantum Fourier Transform to kick an eigenvalue to the
exponent register.
Args:
x: positive integer whose order modulo n is to be found
n: modulus relative to which the order of x is to be found
Returns:
Quantum circuit for finding the order of x modulo n
"""
L = n.bit_length()
target = cirq.LineQubit.range(L)
exponent = cirq.LineQubit.range(L, 3 * L + 3)
return cirq.Circuit(
cirq.X(target[L - 1]),
cirq.H.on_each(*exponent),
ModularExp(target, exponent, x, n),
cirq.QFT(*exponent, inverse=True),
cirq.measure(*exponent, key='exponent'),
)
C: Algorithm parameter, see above.
t: Algorithm parameter, see above.
register_size: The size of the eigenvalue register.
memory_basis: The basis to measure the memory in, one of 'x', 'y', 'z'.
input_prep_gates: A list of gates to be applied to |0> to generate the
desired input state |b>.
Returns:
The HHL circuit. The ancilla measurement has key 'a' and the memory
measurement is in key 'm'. There are two parameters in the circuit,
`exponent` and `phase_exponent` corresponding to a possible rotation
applied before the measurement on the memory with a
`cirq.PhasedXPowGate`.
"""
ancilla = cirq.LineQubit(0)
# to store eigenvalues of the matrix
register = [cirq.LineQubit(i + 1) for i in range(register_size)]
# to store input and output vectors
memory = cirq.LineQubit(register_size + 1)
c = cirq.Circuit()
hs = HamiltonianSimulation(A, t)
pe = PhaseEstimation(register_size+1, hs)
c.append([gate(memory) for gate in input_prep_gates])
c.append([
pe(*(register + [memory])),
EigenRotation(register_size + 1, C, t)(*(register + [ancilla])),
pe(*(register + [memory]))**-1,
cirq.measure(ancilla, key='a')
])
"""Program for generating random bits in Cirq."""
# Imports
import cirq
# Helper function for visualizing output
def bitstring(bits):
return ''.join('1' if e else '0' for e in bits)
# Get a qubit and quantum circuit
qbit = cirq.LineQubit(0)
circ = cirq.Circuit()
# Add the Hadamard and measure operations to the circuit
circ.append([cirq.H(qbit), cirq.measure(qbit, key="z")])
# Simulate the circuit
sim = cirq.Simulator()
res = sim.run(circ, repetitions=10)
# Print the outcome
print("Bitstring =", bitstring(res.measurements["z"]))
# Diagonalize it classically
evals, evecs = np.linalg.eig(unitary)
# =============================================================================
# Building the circuit for QPE
# =============================================================================
# Number of qubits in the readout/answer register (# bits of precision)
n = 8
# Readout register
regA = cirq.LineQubit.range(n)
# Register for the eigenstate
regB = cirq.LineQubit.range(n, n + m)
# Get a circuit
circ = cirq.Circuit()
# Hadamard all qubits in the readout register
circ.append(cirq.H.on_each(regA))
# Hadamard all qubits in the second register
#circ.append(cirq.H.on_each(regB))
# Get a Cirq gate for the unitary matrix
ugate = cirq.ops.matrix_gates.TwoQubitMatrixGate(unitary)
# Controlled version of the gate
cugate = cirq.ops.ControlledGate(ugate)
if dynamic_decoupling_sequence is None:
raise ArgumentsValueError('No dynamic decoupling sequence provided.',
{'dynamic_decoupling_sequence': dynamic_decoupling_sequence})
if not isinstance(dynamic_decoupling_sequence, DynamicDecouplingSequence):
raise ArgumentsValueError('Dynamical decoupling sequence is not recognized.'
'Expected DynamicDecouplingSequence instance',
{'type(dynamic_decoupling_sequence)':
type(dynamic_decoupling_sequence)})
if gate_time <= 0:
raise ArgumentsValueError(
'Time delay of gates must be greater than zero.',
{'gate_time': gate_time})
target_qubits = target_qubits or [cirq.LineQubit(0)]
if algorithm not in [FIX_DURATION_UNITARY, INSTANT_UNITARY]:
raise ArgumentsValueError('Algorithm must be one of {} or {}'.format(
INSTANT_UNITARY, FIX_DURATION_UNITARY), {'algorithm': algorithm})
unitary_time = 0.
if algorithm == FIX_DURATION_UNITARY:
unitary_time = gate_time
rabi_rotations = dynamic_decoupling_sequence.rabi_rotations
azimuthal_angles = dynamic_decoupling_sequence.azimuthal_angles
detuning_rotations = dynamic_decoupling_sequence.detuning_rotations
offsets = dynamic_decoupling_sequence.offsets
time_covered = 0
input_prep_gates: A list of gates to be applied to |0> to generate the
desired input state |b>.
Returns:
The HHL circuit. The ancilla measurement has key 'a' and the memory
measurement is in key 'm'. There are two parameters in the circuit,
`exponent` and `phase_exponent` corresponding to a possible rotation
applied before the measurement on the memory with a
`cirq.PhasedXPowGate`.
"""
ancilla = cirq.LineQubit(0)
# to store eigenvalues of the matrix
register = [cirq.LineQubit(i + 1) for i in range(register_size)]
# to store input and output vectors
memory = cirq.LineQubit(register_size + 1)
c = cirq.Circuit()
hs = HamiltonianSimulation(A, t)
pe = PhaseEstimation(register_size+1, hs)
c.append([gate(memory) for gate in input_prep_gates])
c.append([
pe(*(register + [memory])),
EigenRotation(register_size + 1, C, t)(*(register + [ancilla])),
pe(*(register + [memory]))**-1,
cirq.measure(ancilla, key='a')
])
c.append([
cirq.PhasedXPowGate(
exponent=sympy.Symbol('exponent'),
phase_exponent=sympy.Symbol('phase_exponent'))(memory),