-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Closed
Closed
Copy link
Labels
Description
What should we add?
The current code for StatePreparation
and Initialize
is based on [1], but there is a more efficient code in [2] which is currently implemented in Isometry
.
Therefore, it would be better to replace the internal implementation of StatePreparation
and Initialize
by the one implemented in Isometry
.
References
[1] Shende, Bullock, Markov. Synthesis of Quantum Logic Circuits (2004) https://arxiv.org/abs/quant-ph/0406176v5
[2] Iten et al., Quantum circuits for isometries (2016). Phys. Rev. A 93, 032318
For example,
for n_qubits in [5, 7, 10, 12, 15]:
state = np.random.rand(2 ** n_qubits) + np.random.rand(2 ** n_qubits) * 1j
state = state/np.linalg.norm(state)
# State preparation
qc = QuantumCircuit(n_qubits)
qc.append(StatePreparation(state), range(n_qubits))
transpiled = transpile(qc, basis_gates=['u', 'cx'], optimization_level=0)
cx_sp = transpiled.count_ops()['cx']
# Isometry
reg_iso = QuantumRegister(n_qubits)
circuit_iso = QuantumCircuit(reg_iso)
isom = Isometry(state, 0, 0)
qc = QuantumCircuit(n_qubits)
qc.append(isom, range(n_qubits))
transpiled = transpile(qc, basis_gates=['u', 'cx'], optimization_level=0)
cx_isom = transpiled.count_ops()['cx']
print ("num qubits=", n_qubits, "cx count StatePreparation=", cx_sp, "cx count Isometry=", cx_isom)
gives:
num qubits= 5 cx count StatePreparation= 52 cx count Isometry= 26
num qubits= 7 cx count StatePreparation= 240 cx count Isometry= 120
num qubits= 10 cx count StatePreparation= 2026 cx count Isometry= 1013
num qubits= 12 cx count StatePreparation= 8166 cx count Isometry= 4083
num qubits= 15 cx count StatePreparation= 65504 cx count Isometry= 32752