QSWE
  • Welcome
  • Algorithms
    • BB84
    • Bell Inequality
    • Deutsch
    • Bernstein-Vazirani
    • Simon
  • Code
    • CirQ
      • BB84
      • Bell Inequality
      • Deutsch
      • Bernstein-Vazirani
      • Simon
  • Contact
Powered by GitBook
On this page
  1. Code
  2. CirQ

Deutsch

Cirq implementation of Deutsch algorithm

PreviousBell InequalityNextBernstein-Vazirani

Last updated 2 years ago

## Imports
import numpy as np
import cirq

class Deutch():

  def __init__(self):
    # Choose qubits to use.
    self.q0, self.q1 = cirq.LineQubit.range(2)

  def make_oracle(self, q0, q1, secret_function=[]):
    """Gates implementing the secret function f(x)."""
    # If secret function is not provided, pick a random function.
    # Encode secret function as the oracle circuit.
    if not secret_function:
      secret_function = [np.random.randint(0, 2) for _ in range(2)]
    print(f"Secret function:\nf(0, 1) = ({', '.join(str(e) for e in secret_function)})")
    if secret_function[0]:
        yield [cirq.CNOT(q0, q1), cirq.X(q1)]
    if secret_function[1]:
        yield cirq.CNOT(q0, q1)

  def make_deutsch_circuit(self, q0, q1, oracle):
    """Make circuit for Deutsch algorithm."""
    c = cirq.Circuit()
    # Initialize qubits.
    c.append([cirq.X(q1), cirq.H(q1), cirq.H(q0)])
    # Query oracle.
    c.append(oracle)
    # Measure in X basis.
    c.append([cirq.H(q0), cirq.measure(q0, key='result')])
    return c

  def run_deutsch_algorithm(self, secret_function=[]):
    self.oracle = self.make_oracle(self.q0, self.q1, secret_function)
    self.circuit = self.make_deutsch_circuit(self.q0, self.q1, self.oracle)
    print('Circuit:')
    print(self.circuit)

    # Simulate the circuit.
    simulator = cirq.Simulator()
    result = simulator.run(self.circuit)
    print('Result of f(0)⊕f(1):')
    print(result)


dsim = Deutch()
dsim.run_deutsch_algorithm()
Open in Colab notebook