diff --git a/qiskit/synthesis/evolution/lie_trotter.py b/qiskit/synthesis/evolution/lie_trotter.py index 0a4f42ad69eb..6d73e077bf90 100644 --- a/qiskit/synthesis/evolution/lie_trotter.py +++ b/qiskit/synthesis/evolution/lie_trotter.py @@ -76,7 +76,6 @@ def synthesize(self, evolution): # construct the evolution circuit evolution_circuit = QuantumCircuit(operators[0].num_qubits) - first_barrier = False if not isinstance(operators, list): pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operators.to_list()] @@ -86,20 +85,14 @@ def synthesize(self, evolution): # if we only evolve a single Pauli we don't need to additionally wrap it wrap = not (len(pauli_list) == 1 and self.reps == 1) - for _ in range(self.reps): - for op, coeff in pauli_list: - # add barriers - if first_barrier: - if self.insert_barriers: - evolution_circuit.barrier() - else: - first_barrier = True - - evolution_circuit.compose( - self.atomic_evolution(op, coeff * time / self.reps), wrap=wrap, inplace=True - ) + for i, (op, coeff) in enumerate(pauli_list): + evolution_circuit.compose( + self.atomic_evolution(op, coeff * time / self.reps), wrap=wrap, inplace=True + ) + if self.insert_barriers and i != len(pauli_list) - 1: + evolution_circuit.barrier() - return evolution_circuit + return evolution_circuit.repeat(self.reps).decompose() @property def settings(self) -> Dict[str, Any]: diff --git a/releasenotes/notes/faster-lie-trotter-ba8f6dd84fe4cae4.yaml b/releasenotes/notes/faster-lie-trotter-ba8f6dd84fe4cae4.yaml new file mode 100644 index 000000000000..2ca02d6f69f0 --- /dev/null +++ b/releasenotes/notes/faster-lie-trotter-ba8f6dd84fe4cae4.yaml @@ -0,0 +1,6 @@ +--- +features_synthesis: + - | + :meth:`.LieTrotter.synthesize` now uses :meth:`.QuantumCircuit.repeat` to generate additional reps + after the first. This reduces the number of :meth:`.QuantumCircuit.compose` calls by a factor of + ``reps`` and significantly reduces the runtime for larger operators.