#!/usr/bin/env python3import numpy as np
import qiskit as q
defdj_oracle(case:str, num_qubits:int)-> q.QuantumCircuit:# This circuit has num_qubits+1 qubits: the size of the input,# plus one output qubit
oracle_qc = q.QuantumCircuit(num_qubits +1)# First, let's deal with the case in which oracle is balancedifcase=="balanced":# First generate a random number that tells us which CNOTs to# wrap in X-gates:
b = np.random.randint(1,2**num_qubits)# Next, format 'b' as a binary string of length 'n', padded with zeros:
b_str =format(b,f"0{num_qubits}b")# Next, we place the first X-gates. Each digit in our binary string# correspopnds to a qubit, if the digit is 0, we do nothing, if it's 1# we apply an X-gate to that qubit:for index, bit inenumerate(b_str):if bit =="1":
oracle_qc.x(index)# Do the controlled-NOT gates for each qubit, using the output qubit# as the target:for index inrange(num_qubits):
oracle_qc.cx(index, num_qubits)# Next, place the final X-gatesfor index, bit inenumerate(b_str):if bit =="1":
oracle_qc.x(index)# Case in which oracle is constantifcase=="constant":# First decide what the fixed output of the oracle will be# (either always 0 or always 1)
output = np.random.randint(2)if output ==1:
oracle_qc.x(num_qubits)
oracle_gate = oracle_qc.to_gate()
oracle_gate.name ="Oracle"# To show when we display the circuitreturn oracle_gate
defdj_algorithm(oracle: q.QuantumCircuit, num_qubits:int)-> q.QuantumCircuit:
he Oracle Circuit passed in arguments
dj_circuit = q.QuantumCircuit(num_qubits +1, num_qubits)# Set up the output qubit:
dj_circuit.x(num_qubits)
dj_circuit.h(num_qubits)# And set up the input register:for qubit inrange(num_qubits):
dj_circuit.h(qubit)# Let's append the oracle gate to our circuit:
dj_circuit.append(oracle,range(num_qubits +1))# Finally, perform the H-gates again and measure:for qubit inrange(num_qubits):
dj_circuit.h(qubit)for i inrange(num_qubits):
dj_circuit.measure(i, i)return dj_circuit
defdeutsch_jozsa(case:str, num_qubits:int)-> q.result.counts.Counts:# Use Aer's qasm_simulator
simulator = q.Aer.get_backend("qasm_simulator")
oracle_gate = dj_oracle(case, num_qubits)
dj_circuit = dj_algorithm(oracle_gate, num_qubits)# Execute the circuit on the qasm simulator
job = q.execute(dj_circuit, simulator, shots=1000)# Return the histogram data of the results of the experiment.return job.result().get_counts(dj_circuit)if __name__ =="__main__":print(f"Deutsch Jozsa - Constant Oracle: {deutsch_jozsa('constant',3)}")print(f"Deutsch Jozsa - Balanced Oracle: {deutsch_jozsa('balanced',3)}")