<jupyter_start><jupyter_text>$$\newcommand{\ket}[1]{\left|{1}\right\rangle}$$$$\newcommand{\bra}[1]{\left\langle{1}\right|}$$ Tehtävä 1Kvanttitietokoneen muistissa tieto esitetään kubittien avulla. Kertauksena viime kierrokselta, kubitin perustilat ovat $\ket 0$ ja $\ket{1}$, ja ne esitetään pystyvektoreina$$\begin{align}\ket 0 &= \pmatrix {1 \\ 0}, \\\ket 1 &= \pmatrix {0 \\ 1}.\end{align}$$NOT-portin matriisiesitys on seuraava:$$X=\pmatrix {0 & 1 \\ 1 & 0}$$Kierroksella 1 laskimme, että kun $X$-portti operoi kubittiin, niin kubitin tila muuttuu käänteiseksi (bit-flip gate), eli$$X\ket 0 = \ket 1 \\X\ket 1 = \ket 0$$Voit palauttaa a- ja b-kohdat Classroomiin haluamassasi muodossa.a) Osoita matriisiesitystä käyttäen, että$$\begin{align}XX\ket 0 &= \ket 0 \text{ja} \\XX\ket 1 &= \ket 1\end{align}$$ohjevideo NOT-portin toiminnastab) Osoita laskemalla matriisien tulo, että $XX=I$, missä $I$ on yksikkömatriisi. Tämä tarkoittaa, että $X$ on itsensä käänteismatriisi.c) Seuraavassa esimerkissä luodaan Qiskitiä käyttäen kvanttipiiri, jossa on yksi kubitti, jota operoidaan $X$-portilla.<jupyter_code># Otetaan qiskit-kirjasto käyttöön
from qiskit import *

# Luodaan kvanttipiiri muuttujaan circ, jossa on yksi kubitti (diagrammissa q).
circ1 = QuantumCircuit(1)

# Operoidaan kubittia 0, eli piirin ainoaa kubittia X-portilla.
circ1.x(0)

# Piirretään luotu piiri.
# Parametri output="mpl" kertoo, että piirto tapahtuu graafisesti.
circ1.draw(output="mpl")<jupyter_output><empty_output><jupyter_text>Kirjoita alle yllä olevan esimerkin mukaisesti Python-koodi, joka luo kvanttipiirin, jossa on kaksi kubittia. Sen jälkeen lisää piiriin portteja siten, että ensimmäiseen kubittiin tehdään kaksi $X$-operaatiota, ja toiseen yksi $X$-operaatio. Lopuksi piirrä luomasi piiri.<jupyter_code># Kirjoita koodisi tähän<jupyter_output><empty_output><jupyter_text>Tehtävä 2Hadamard eli $H$-portti muuttaa kubitin tilat $\ket 0$ ja $\ket 1$ superpositioon seuraavasti:$$H\ket 0 = \frac{1}{\sqrt 2} (\ket 0 +  \ket 1) = \ket +   \\H\ket 1 = \frac{1}{\sqrt 2} (\ket 0 -  \ket 1) = \ket -$$Huomaa, että näitä kyseisiä tiloja merkitään välillä myös $\ket +$ ja $\ket -$.$H$-portin matriisiesitys on seuraava:$$H = \frac{1}{\sqrt 2} \pmatrix {1 & 1 \\ 1 & -1}$$a) Osoita matriisiesitystä käyttäen, että$$\begin{align}HH\ket 0 &= \ket 0 \text{ja} \\HH\ket 1 &= \ket 1.\end{align}$$b) Osoita laskemalla matriisien tulo, että $HH=I$, missä $I$ on yksikkömatriisi. Tämä tarkoittaa jälleen, että $H$ on itsensä käänteismatriisi.ohjevideo H-portin toiminnastac) Seuraavassa esimerkissä luodaan Qiskitiä käyttäen kvanttipiiri, jossa on yksi kubitti ja $H$-portti.<jupyter_code>from qiskit import *

# Luodaan yhden kubitin kvanttipiiri kuten edellisessä esimerkissä.
circ2 = QuantumCircuit(1)

# Operoidaan kubittia 0 H-portilla.
circ2.h(0)

# Piirretään luotu piiri.
circ2.draw(output="mpl")<jupyter_output><empty_output><jupyter_text>Kirjoita alle yllä olevan esimerkin mukaisesti Python-koodi, joka luo kvanttipiirin, jossa on kaksi kubittia. Sen jälkeen lisää piiriin portteja siten, että ensimmäiseen kubittiin tehdään yksi $H$-operaatio, ja toiseen yksi $X$-operaatio. Piirrä myös tämä piiri.<jupyter_code># Kirjoita koodisi tähän<jupyter_output><empty_output><jupyter_text>Tehtävä 3 Kubittien tilat $\ket +$ ja $\ket -$ määritettiin$$ \ket + = \frac{1}{\sqrt 2} (\ket 0 +  \ket 1), \\ \ket - = \frac{1}{\sqrt 2} (\ket 0 -  \ket 1). $$Z-portin (ns. phase-flip gate) matriisiesitys on seuraava:$$Z=  \pmatrix {1 & 0 \\ 0 & -1}$$Osoita seuraavat yhtälöt oikeiksi laskemalla matriisien tulo:$$\begin{align}Z\ket + &= \ket - \text{ja}\\Z\ket - &= \ket +\end{align}$$  Tehtävä 4Tehtävät 1 - 3 käsittelivät yhden kubitin systeemiä. Seuraavassa kahdessa tehtävässä tarkastelemme controlled NOT -porttia ($\mathit{CNOT}$), joka on kahden kubitin välinen operaatio. Kahden kubitin kvanttipiirissä systeemin tila esitetään seuraavilla kantavektoreilla:$$\ket{00},\ \ket{01},\ \ket{10},\ \ket{11}, $$missä $$\ket{00}=\pmatrix{1 \\ 0 \\ 0 \\0},\ \ket{01}=\pmatrix{0 \\ 1 \\ 0 \\0},\ \ket{10}=\pmatrix{0 \\ 0 \\ 1 \\0},\ \ket{11}=\pmatrix{0 \\ 0 \\ 0 \\1}.$$$\mathit{CNOT}$-portin operoidessa ensimmäinen qubitti on ns. ohjaava kubitti (control qubi1t), ja jälkimmäinen on kohdekubitti (target qubit). $\mathit{CNOT}$ vaikuttaa koko systeemin tilaan seuraavasti:$$\ket{00} \rightarrow  \ket{00}   \\\ket{01} \rightarrow  \ket{01}   \\\ket{10} \rightarrow  \ket{11}   \\\ket{11} \rightarrow  \ket{10}   \\$$Tulos tarkoittaa, että jos ensimmäinen, ns. ohjaava kubitti on $0$, niin kohdekubitin tila ei muutu. Jos ohjaavakubitti $1$, niin kohdekubitin tila muuttuu. $\mathit{CNOT}$-portin matriisiesitys on seuraava:$$\mathit{CNOT} = \pmatrix {1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0} $$Huomaa, että vaikka matriisia merkitään monella kirjaimella, se ei ole monen matriisin tulo.Piirrosmerkki, jossa ylempänä esitetty kubitti on ohjaava, ja alempi toimii kohteena:![cnot](https://ollpu.fi/kvanttilaskenta-static/cnot.png)a) Laske CNOT-matriisin ja 2 kubitin tilaa kuvaavan pystyvektorin tulo, ja osoita että $$\ket{01} \rightarrow  \ket{01} \text{eli laske tulo  } \mathit{CNOT} \ket{01}  \\\ket{10} \rightarrow  \ket{11}  \text{eli laske tulo  } \mathit{CNOT} \ket{10} \\$$ohjevideo CNOT-portin toiminnasta b) Alla on esimerkki, jossa Qiskitillä luodaan kvanttipiiriin kaksi kubittia. Ensimmäistä kubittia operoi ensin Hadamard-portti $H$, jonka jälkeen tehdään molempien kubittien välinen $\mathit{CNOT}$-operaatio.<jupyter_code>from qiskit import *
circ3 = QuantumCircuit(2)

circ3.h(0)
circ3.cx(0,1)

# Piirretään luotu piiri.
circ3.draw(output="mpl")<jupyter_output><empty_output><jupyter_text>Huomaa, että kuvassa aika eli suoritusjärjestys etenee vasemmalta oikealle. Kirjoita alle koodi, joka luo kolmen kubitin kvanttipiirin.Ensimmäiseen kubittiin operoi H-portti.Tämän jälkeen kvanttipiirissä on $\mathit{CNOT}$-portti kubittien 0 ja 1 välillä siten, että kubitti 0 on ohjaava kubitti ja kubitti 1 kohde. Lisää piiriin $\mathit{CNOT}$-portti myös kubittien 1 ja 2 välille, jossa kubitti 1 on ohjaava.<jupyter_code># Kirjoita koodisi tähän<jupyter_output><empty_output><jupyter_text>Tehtävä 5Seuraavassa esimerkissä kvanttipiiriä täydennetään kahdella kvanttirekisterillä ja kahdella klassisella rekisterillä. Kvanttipiiri luodaan syöttämällä rekisterit parametrina komennolle QuantumCircuit(). Kun H-portti operoi systeemiin, niin systeemin, niin kubitin 0 tila on määritetty tilojen $\ket 0$ ja $\ket 1$ superpositiona. Kun piirin tila mitataan, niin silloin systeemi siirtyy tiettyyn hyvin määritettyyn tilaan, jonka arvo tallenetaan klassiseen rekisteriin. Kvanttimekaanisella systeemillä jokaisella mahdollisella mitatulla tilalla on tietty todennäköisyys, ja kaikkien eri tilavaihtoehtojen todennäköisyyksien summa on 1.<jupyter_code>from qiskit import *
# Luodaan 2 kubitin rekisteri piiriä varten.
qr = QuantumRegister(2)

# Luodaan kahden bitin klassinen rekisteri mittaustulosten tallentamista varten.
cr = ClassicalRegister(2)

# Luodaan nyt kvanttipiiri käyttäen juuri luotuja rekistereitä.
mycircuit = QuantumCircuit(qr, cr)

# H-portti operoi kubittiin 0Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads

mycircuit.h(qr[0])

# Määrätään piiri mittaamaan molemmat kubitit ja tallennetaan tulokset klassiseen rekisteriin.
mycircuit.measure(qr, cr)

mycircuit.draw(output='mpl')<jupyter_output><empty_output><jupyter_text>a) Kerro alla olevan kvanttipiirin toimintaperiate. Miten piiri toimii?![kvanttipiiri](https://ollpu.fi/kvanttilaskenta-static/kvanttipiiri.png)Lisämateriaalia: Measuring a qubit? Kirjoita vastauksesi tähän. b) Kokeile määritellä piiri Python-kooodilla.<jupyter_code># Kirjoita koodisi tähän<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11976274608783442, 'fraction_numerical': 0.024734982332155476, 'mean_word_length': 5.210815047021944, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '331076', 'license': 'MIT', 'n_tokens_mistral': 3553, 'n_tokens_neox': 3210, 'n_words': 819, 'path': 'kv_laskuharjoitukset/kierros2/Kvanttilaskenta, kierros 2.ipynb', 'repo_name': 'otaniemen-lukio/projects', 'size': '7924'}