Vuosikymmenten ajan ympäristön melua on pidetty kvanttiteknologian arkkivihollisena. Usein vuorovaikutukset kvanttisysteemin ja ympäristön välillä johtavat kvanttiominaisuuksien nopeaan häviämiseen ja ikävästi juuri lomittumisen ja koherenssin menetykseen, jotka olisivat keskeisiä kvanttiedun tarjoajia. Näkökulma tähän muuttui merkittävästi, kun fyysikot osoittivat, että muokkaamalla keinotekoista ympäristöä sopivalla tavalla (quantum reservoir engineering) systeemiä voidaan ohjata kohti haluttua tilaa, kuten vaikka maksimaalisesti lomittunutta tilaa [J. T. Barreiro, et al., Nature 470, 486 (2011), J. T. Barreiro et al., Nat. Phys. 6, 943 (2010)]. Näin ollen ajatus ympäristöstä kvanttiteknologian vihollisena kääntyi aivan päälaelleen.
Seurailemme tutkimusta J. T. Barreiro, et al., Nature 470, 486 (2011) ja simuloimme kokeellisesti puoliryhmän Markovin mestariyhtälön kahden kubitin avoimelle systeemille, jolla on asymptoottisena, stationaarisena tilana Bellin tila $|\psi^- \rangle = \frac{1}{\sqrt{2} }(|01\rangle - |10\rangle)$, jossa $|0\rangle$ ja $|1\rangle$ muodostavat kubittien laskennallisen kannan. Käytämme merkintää $| 01\rangle = |0\rangle_1 |1\rangle _2$. Näin ollen voimme valmistaa maksimaalisen lomittuneen tilan systeemin luonnollisen kehityksen, eli tässä tapauksessa avoimen systeemin dissipatiivisen dynamiikan tuloksena.
Neljä Bellin tilaa ovat:
\begin{align} |\psi^- \rangle = \frac{1}{\sqrt{2} }(|01\rangle - |10\rangle) \\ |\psi^+ \rangle = \frac{1}{\sqrt{2} }(|01\rangle + |10\rangle) \\ |\phi^- \rangle = \frac{1}{\sqrt{2} }(|00\rangle - |11\rangle) \\ |\phi^+ \rangle = \frac{1}{\sqrt{2} }(|00\rangle + |11\rangle) \end{align}Jokainen niistä on uniikki, ominaisarvoa $\pm1$ vastaava ominaistila operaattoreille $\sigma_z^{(1)} \otimes \sigma_z^{(2)}$ ja $\sigma_x^{(1)}\otimes\sigma_x^{(2)}$, jossa $\sigma_x^{(i)}$ and $\sigma_z^{(i)}$, $i=1,2$, ovat Paulin $x$- ja $z$-operaattoreita kubiteille 1 ja 2.
Dissipatiivinen dynamiikka, joka pumppaa kaksi kubittia mielivaltaisesta alkutilasta Bellin tilaan $|\psi^- \rangle $ toteutetaan yhdistelmän kahdesta kanavasta, jotka pumppaavat vakauttajaoperaattorien (stabiliser operators) $\sigma_z^{(1)} \otimes \sigma_z^{(2)}$ ja $\sigma_x^{(1)} \otimes \sigma_x^{(2)}$ ominaisavaruudesta $+1$ ominaisavaruuteen $–1$.
Erityisesti tarkastelemme kahta $p$-parametrisoitua joukkoa CPTP-kuvauksia $\Phi_{zz} \rho_S = E_{1z} \rho_S E_{1z}^{\dagger} + E_{2z} \rho_S E_{2z}^{\dagger} $, jossa
\begin{equation} \begin{aligned} E_{1z} &=\sqrt{p} \mathbb{I}^{(1)} \otimes \sigma_x^{(2)} \frac{1}{2}\left( \mathbb{I}+ \sigma_z^{(1)} \otimes \sigma_z^{(2)} \right), \\ E_{2z} &= \frac{1}{2} \left( \mathbb{I}-\sigma_z^{(1)}\otimes\sigma_z^{(2)} \right) \\ &+ \sqrt{1-p} \frac{1}{2} \left( \mathbb{I}+ \sigma_z^{(1)}\otimes\sigma_z^{(2)} \right), \end{aligned} \end{equation}ja $\Phi_{xx}\rho_S = E_{1x} \rho_S E_{1x}^{\dagger} + E_{2x} \rho_S E_{2x}^{\dagger} $, jossa $E_{1x}$:llä ja $E_{2x}$:llä on sama muoto kuin $E_{1z}$:lla ja $E_{2z}$:lla, sillä erolla, että korvaamme $\sigma_x^{(2)}$:n $\sigma_z^{(2)}$:lla ja $\sigma_z^{(1)}\otimes\sigma_z^{(2)}$:n korvaamme $\sigma_x^{(1)}\otimes\sigma_x^{(2)}$:lla.
Muuttamalla parametria $0 \le p \le 1$ voimme simuloida erityyppisiä avointen systeemien dynamiikkoja. Jos $p\ll1$, esimerkiksi operaattorin $\Phi_{zz}$ toistuva käyttö tuottaa Lindbladin muodossa olevan mestariyhtälön, jossa hyppyoperaattori on $V=\frac{1}{2} \mathbb{I}^{(1)}\otimes\sigma_x^{(2)}\left( \mathbb{I}+ \sigma_z^{(1)} \otimes \sigma_z^{(2)} \right)$. Jos taas $p=1$, kuvaus $\Phi_{xx} \circ \Phi_{zz}$ tuottaa tilan $|\psi_- \rangle $ mistä vain alkutilasta.
Tutkimuksessa J. T. Barreiro, et al., Nature 470, 486 (2011) esitellään piirit, joilla voi toteuttaa Bellin tilojen pumppaamisen. Portit, joista nämä piirit koostuvat, ovat luonnollinen valinta tutkimuksessa käytettävälle trapped-ions-tyyppiselle alustalle, mutta niiden suora kopioiminen IBM:n kvanttilaitteelle johtaisi aivan liian pitkiin piireihin. Siispä käytämme piirejä, joiden toimintaperiaate on sama kuin tutkimuksen piireillä, mutta joiden suunnittelussa on huomioitu IBM:n laitteiden ominaisuudet.
Pumppauspiirit koostuvat neljästä osasta:
Olennaiset tiedot systeemin tilasta kuvataan apukubiteille (eli onko systeemi vakauttajaoperaattorien $+1$- vai $-1$-ominaisavaruudessa).
Systeemin tilaa muokataan riippuen apukubittien tilasta.
Kohdan 1 kuvauspiiri käännetään ympäri.
Tässä vaiheessa pumppauskierros on valmis. Jos apukubitteja on tarkoitus käyttää uudelleen seuraavalla pumppauskierroksella, ne täytyy nollata, mikä on neljäs askel.
Seuraamme tutkimuksen suuntaviivoja ja suunnittelemme piirit, jotka suorittavat samat vaiheet mahdollisimman pienellä määrällä portteja. Ennen tarkempaa perehtymistä näihin piireihin on hyvä mainita, että meidän on käytettävä eri apukubitteja jokaisella pumppauskierroksella, sillä kaikista IBM:n laitteista ei löydy nollaustoimintoa (joka olisi aika meluisa joka tapauksessa).
Kuvaamme tiedot ominaisavaruuksista apukubiteille soveltamalla ensin CNOT-porttia systeemikubitteihin. Oletetaan, että kubitit $s_1$ ja $s_2$ ovat aluksi jossakin Bellin tilassa, esimerkiksi tilassa $| \phi^{\pm} \rangle = (| 00 \rangle \pm | 11 \rangle)/\sqrt{2}$. Kubitin $s_1$ kontrolloima CNOT-portti muuttaa tilan tilaksi $|\pm\rangle|0\rangle$. Sen sijaan tila $| \psi^{\pm} \rangle$ muuttuisi tilaksi $|\pm\rangle|1\rangle$. Näin ollen operaattorin $\sigma_x^{(1)}\otimes\sigma_x^{(2)}$ ominaisavaruutta koskeva tieto (käytännössä merkki) sisältyy kubitin $s_1$ tilaan muunnoksen jälkeen, kun taas operaattorin $\sigma_z^{(1)}\otimes\sigma_z^{(2)}$ ominaisavaruutta koskeva tieto sisältyy kubittiin $s_2$.
Tarkastellaan nyt piiriä, joka toteuttaa $\sigma_z^{(1)}\otimes\sigma_z^{(2)}$ -pumpun:
from qiskit import QuantumRegister, QuantumCircuit
import numpy as np
#######################
# ZZ pump #
#######################
# Quantum register
q = QuantumRegister(3, name='q')
# Quantum circuit
zz = QuantumCircuit(q)
# ZZ pump acting on system qubits
## Qubit identification
system = [2, 1]
a_zz = 0
## Define pump efficiency
## and corresponding rotation
p = 0.5
theta = 2 * np.arcsin(np.sqrt(p))
## Construct circuit
### Map information to ancilla
zz.cx(q[system[0]], q[system[1]])
zz.x(q[a_zz])
zz.cx(q[system[1]], q[a_zz])
### Conditional rotation
zz.cu(theta, 0.0, 0.0, 0, q[a_zz], q[system[1]])
### Inverse mapping
zz.cx(q[system[1]], q[a_zz])
zz.cx(q[system[0]], q[system[1]])
# Draw circuit
zz.draw(output='mpl')
Kuvataksemme tiedot ominaisavaruuksista ympäristöapukubitille $a_\textrm{ZZ}$ käytämme sopivan kubitin ($s_2$) kontrolloimaa CNOT-porttia. Näiden kahden portin jälkeen (ja olettaen, että apukubitin alkutila on $|1\rangle$)), $a_\textrm{ZZ}$:n tila tulee olemaan $|1\rangle$, jos systeemin alkutila on $| \phi^{\pm} \rangle$ ja $|0\rangle$, jos systeemin alkutila on $| \psi^{\pm} \rangle$. Siispä ehdollinen kiertoportti (conditional rotation gate) toimii ainoastaan ensimmäisessä tapauksessa, kun taas toisessa tapauksessa se ei muokkaa tilaa. Kontrolloidun kierron kulma puolestaan määrää pumppauksen $p$ tehokkuuden relaation $\theta = 2 \arcsin{\sqrt{p} }$ mukaisesti. Viimeiset kaksi CNOT-porttia pelkästään kääntävät piirin kuvausosan.
Toimintaperiaate $\sigma_x^{(1)}\otimes\sigma_x^{(2)}$ -pumpulle on käytännössä sama. Tarvitaan kuitenkin yksi ylimääräinen Hadamardin portti muuttamaan $s_1$:n tila ennen informaation kuvaamista apukubitille $a_\textrm{XX}$:
#######################
# XX pump #
#######################
# Quantum register
q = QuantumRegister(4, name='q')
# Quantum circuit
xx = QuantumCircuit(q)
# XX pump acting on system qubits
## Qubit identification
system = [1, 0]
a_xx = 3
## Define pump efficiency
## and corresponding rotation
p = 0.5
theta = 2 * np.arcsin(np.sqrt(p))
## Construct circuit
### Map information to ancilla
xx.cx(q[system[0]], q[system[1]])
xx.h(q[system[0]])
xx.x(q[a_xx])
xx.cx(q[system[0]], q[a_xx])
### Conditional rotation
xx.cu(theta, 0.0, 0.0, 0, q[a_xx], q[system[0]])
### Inverse mapping
xx.cx(q[system[0]], q[a_xx])
xx.h(q[system[0]])
xx.cx(q[system[0]], q[system[1]])
# Draw circuit
xx.draw(output='mpl')
Yhdistelmäpumpun tapauksessa voimme yksinkertaisesti ketjuttaa kaksi piiriä. Huomaa, että jos piirit laittaa suoraan yhteen, systeemikubittien väliin jää kaksi peräkkäistä CNOT-porttia, jotka voidaan poistaa.
###########################
# ZZ-XX pumps #
###########################
# Quantum register
q = QuantumRegister(5, name='q')
# Quantum circuit
zz_xx = QuantumCircuit(q)
# ZZ and XX pumps acting on system qubits
## Qubit identification
system = [2, 1]
a_zz = 0
a_xx = 4
## Define pump efficiency
## and corresponding rotation
p = 0.5
theta = 2 * np.arcsin(np.sqrt(p))
## Construct circuit
## ZZ pump
### Map information to ancilla
zz_xx.cx(q[system[0]], q[system[1]])
zz_xx.x(q[a_zz])
zz_xx.cx(q[system[1]], q[a_zz])
### Conditional rotation
zz_xx.cu(theta, 0.0, 0.0, 0, q[a_zz], q[system[1]])
### Inverse mapping
zz_xx.cx(q[system[1]], q[a_zz])
#zz_xx.cx(q[system[0]], q[system[1]])
## XX pump
### Map information to ancilla
#zz_xx.cx(q[system[0]], q[system[1]])
zz_xx.h(q[system[0]])
zz_xx.x(q[a_xx])
zz_xx.cx(q[system[0]], q[a_xx])
### Conditional rotation
zz_xx.cu(theta, 0.0, 0.0, 0, q[a_xx], q[system[0]])
### Inverse mapping
zz_xx.cx(q[system[0]], q[a_xx])
zz_xx.h(q[system[0]])
zz_xx.cx(q[system[0]], q[system[1]])
# Draw circuit
zz_xx.draw(output='mpl')
Tämän projektin tavoitteena on ohjata näitä piirejä käyttäen systeemi maksimaalisen sekoittuneesta tilasta tilaan $|\psi^-\rangle$. Tässä projektissa emme käytä tomografista rekonstruktiota kahden kubitin tilasta. Sen sijaan mittaamme neljän Bellin tilan populaatioita kannanvaihdon avulla.
Tehtävä 1 (1p)
Kirjoita kolme funktiota, yksi jokaiselle kanavalle (ZZ, XX ja niiden yhdistelmät). Funktion tulee palauttaa annetulle tehokkuusparametrin $p$ arvolle kvanttipiiri, joka toteuttaa kyseisen kanavan systeemikubiteille. (Yhdistelmien tapauksessa oleta yhtä suuret tehokkuudet molemmille.) Piirien täytyy sisältää systeemikubitin mittaus Bellin kannassa käyttäen CNOT:ia ja Hadamardin porttia sopiviin kubitteihin. Vihje: poista peräkkäiset CNOT-portit (ja yhden kubitin portit), jotka johtavat vain identiteettiportteihin.
Alla on ehdotus funktioiden rakenteeksi.
def zz_pump(q, c, p, system, ancilla):
"""Returns a QuantumCircuit implementing the ZZ pump channel on the system qubits
Args:
q (QuantumRegister): the register to use for the circuit
c (ClassicalRegister): the register to use for the measurement of the system qubits
p (float): the efficiency for the channel, between 0 and 1
system (list): list of indices for the system qubits
ancilla (int): index for the ancillary qubit
Returns:
A QuantumCircuit object
"""
def xx_pump(q, c, p, system, ancilla):
"""Returns a QuantumCircuit implementing the XX pump channel on the system qubits
Args:
q (QuantumRegister): the register to use for the circuit
c (ClassicalRegister): the register to use for the measurement of the system qubits
p (float): the efficiency for the channel, between 0 and 1
system (list): list of indices for the system qubits
ancilla (int): index for the ancillary qubit
Returns:
A QuantumCircuit object
"""
def zz_xx_pump(q, c, p, system, ancillae):
"""Returns a QuantumCircuit implementing the composition channel on the system qubits
Args:
q (QuantumRegister): the register to use for the circuit
c (ClassicalRegister): the register to use for the measurement of the system qubits
p (float): the efficiency for both channels, between 0 and 1
system (list): list of indices for the system qubits
ancillae (list): list of indices for the ancillary qubits
Returns:
A QuantumCircuit object
"""
Tehtävä 2 (3p)
Meidän täytyy asettaa kahden kubitin systeemi aluksi maksimaalisen sekoittuneeseen tilaan $\rho = I_4/4$, jossa $I_4$ on $4\times4$ -yksikkömatriisi. Periaatteessa tämän voisi tehdä lomittamalla systeemin toisten apukubittien kanssa, mutta se vaatisi kaksi kubittia lisää simulaatioomme. Voimmekin luoda sopivan tilastollisen sekoituksen (proper statistical mixture). Tämä tarkoittaa, että voimme saada $\rho$:n sekoittaen neljä alun perin puhdasta tilaa, esimerkiksi kahden kubitin laskennallisen kannan tilat.
Käytä kolmea kanavaa eri arvoilla $p \in [0,1]$ jokaiselle kubittien alkutilalle $|00\rangle$, $|01\rangle$, $|10\rangle$ ja $|11\rangle$, ja tallenna lopputuloksena saatavat Bellin populaatiot seuraavaa tehtävää varten.
Tehtävä 4 (3p)
Aja piirit meluisalla simulaattorilla (esim. FakePerth) lukuvirheen vaimennusta käyttäen ja piirrä kuvaajat tuloksista. Lukuvirheen vaimennukseen voit käyttää esimerkiksi koeluokkaa LocalReadoutError ja käyttää vaimenninta tuloksiin.