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]