Source code for qlauncher.routines.qiskit.algorithms.shor

 1import numpy as np
 2from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
 3from qiskit.circuit.library import QFTGate
 4
 5from qlauncher.base import Algorithm, Result
 6from qlauncher.base.models import ShorCircuit
 7from qlauncher.routines.qiskit.backends.qiskit_backend import QiskitBackend
 8
 9
[docs] 10class Shor(Algorithm[ShorCircuit, QiskitBackend]): 11 def __init__(self, n_shots: int, **alg_kwargs): 12 super().__init__(**alg_kwargs) 13 self.n_shots = n_shots 14
[docs] 15 def run(self, problem: ShorCircuit, backend: QiskitBackend) -> Result: 16 n_qubits = problem.n_phase_kickback_qubits 17 phase_kickback = QuantumRegister(n_qubits, 'phase') 18 eigen_state = QuantumRegister(problem.num_qubits - 1, 'eigen') 19 classical_reg = ClassicalRegister(n_qubits, 'creg') 20 21 qft = QFTGate(num_qubits=n_qubits) 22 qft_i = qft.inverse() 23 24 full_circuit = QuantumCircuit(phase_kickback, eigen_state, classical_reg) 25 26 if not problem.eigen_state_prep: 27 full_circuit.x(eigen_state[0]) 28 else: 29 full_circuit.append(problem.eigen_state_prep, eigen_state[: problem.eigen_state_prep.num_qubits]) 30 31 full_circuit.h(phase_kickback) 32 33 for qubit_ix in range(n_qubits): 34 full_circuit.append( 35 problem.gates[n_qubits - qubit_ix - 1], 36 [phase_kickback[n_qubits - qubit_ix - 1]] + eigen_state[: problem.gates[qubit_ix].num_qubits], 37 ) 38 39 full_circuit.append(qft_i, phase_kickback) 40 41 full_circuit.measure(phase_kickback, classical_reg) 42 43 job = backend.sampler.run([full_circuit], shots=self.n_shots) 44 45 return job.result()[0]