def _construct_diffusion_circuit(): num_variable_qubits = n var_reg2 = QuantumRegister(num_variable_qubits) qc = AncillaCircuit(var_reg2) qc.h(var_reg2) qc.u(np.pi, 0, np.pi, var_reg2) qc.u(np.pi / 2, 0, np.pi, var_reg2[-1]) qc.mcx(var_reg2[:-1], var_reg2[-1]) qc.u(np.pi / 2, 0, np.pi, var_reg2[-1]) qc.u(np.pi, 0, np.pi, var_reg2) qc.h(var_reg2) return qc
def GroverQpp( n, oracle ): # oracle should be an ancilla gate on n + 1 qb, result in last qb _num_iterations = int(np.floor(np.pi / 4.0 * np.sqrt(pow(2, n)))) def _construct_diffusion_circuit(): num_variable_qubits = n var_reg2 = QuantumRegister(num_variable_qubits) qc = AncillaCircuit(var_reg2) qc.h(var_reg2) qc.u(np.pi, 0, np.pi, var_reg2) qc.u(np.pi / 2, 0, np.pi, var_reg2[-1]) qc.mcx(var_reg2[:-1], var_reg2[-1]) qc.u(np.pi / 2, 0, np.pi, var_reg2[-1]) qc.u(np.pi, 0, np.pi, var_reg2) qc.h(var_reg2) return qc def qc_amplitude_amplification_iteration(): reg = QuantumRegister(n + 1, name='reg') _qc_aa_iteration = AncillaCircuit(QuantumRegister(n + 1)) _qc_aa_iteration.append(oracle, reg) _qc_aa_iteration.append( _construct_diffusion_circuit().to_ancilla_gate(), reg[:-1]) return _qc_aa_iteration var_reg = QuantumRegister(n, name='var_reg') out_reg = QuantumRegister(1, name='out_reg') qc = AncillaCircuit(var_reg, out_reg) qc.u(np.pi, 0, np.pi, out_reg) # x qc.u(np.pi / 2, 0, np.pi, out_reg) # h qc.h(var_reg) for _ in range(_num_iterations): qc.append(qc_amplitude_amplification_iteration().to_ancilla_gate(), [*var_reg, out_reg]) return (qc, var_reg)
def makesDJ(num_qubits, oracle_gate=None): #Builds the Deutsch Jozsa circuit for n + 1 qubits, finding the value 111...111 var_reg = QuantumRegister(num_qubits, name='vals') out_reg = QuantumRegister(1, name='out') circ = AncillaCircuit(var_reg, out_reg) circ.h(var_reg) circ.x(out_reg) circ.h(out_reg) if oracle_gate: circ.append(oracle_gate, [*var_reg, out_reg[0]]) else: circ.mcx(var_reg, out_reg) circ.h(var_reg) return (circ, var_reg)
def makesGroverCircuit(n, oracle=None, nb_sols=1): # grover circuit on n qubits, without measurements as uncomp cannot deal with that yet nbIter = int(np.floor(np.pi / 4.0 * np.sqrt(pow(2, n)))) working_qubits = QuantumRegister(n, name='r') phase_qubit = QuantumRegister(1, name='p') circ = AncillaCircuit(working_qubits, phase_qubit) circ.x(phase_qubit[0]) circ.h(phase_qubit[0]) circ.h(working_qubits) for l in range(nbIter): if oracle: circ.append(oracle, [*working_qubits[:], phase_qubit[0]]) else: circ.mcx(working_qubits, phase_qubit) #Grover diffusion operator circ.h(working_qubits) circ.x(working_qubits) circ.h(working_qubits[-1]) circ.mcx(working_qubits[:-1], working_qubits[-1]) circ.h(working_qubits[-1]) circ.x(working_qubits) circ.h(working_qubits) # bring the phase qubit back to 0, we can't uncompute it, as it went through cz, non qfree -> no need to uncomp it, Qiskit doesn't #circ.h(phase_qubit[0]) #circ.x(phase_qubit) return (circ, working_qubits)