Quantum – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 Qiskit ../../../202301151549/ Sun, 15 Jan 2023 01:05:02 +0000 ../../../?p=1549 前回の量子のもつれ状態について、QiskitというPythonライブラリを使ってテストしてみまた。
JupyterNotebookを使いますが、可視化ツールがよくできていてモチベーションがあがります。

前回と同じ、アダマールゲートとCNOTを使った回路を作ってみましたが、その前に可視化ツールのテストをしたかったので、回路図とブロッホ球の表示をしてみました。(In/Out[4]まで)
In/Out[5]からは、量子ピットを2にして目的のテストをしています。

参考)
https://qiskit.org/textbook/ja/ch-gates/multiple-qubits-entangled-states.html

環境) Jupyter Notebook 6.0.3 / Python 3.7.6 / Anaconda 1.9.12 / Wndows 10

インストール)
pip install qiskit

00と11しか出現しないことを確認しました。手順は上記URLの参考サイト「複数量子ビットともつれ状態」に詳しく書かれています。また上記動画ではツールのインストール、使用方法などを参考にしました。この動画のシリーズは長時間かけてとてもわかりやすく説明されていますのでおすすめです。
もつれ状態では、ブロッホ球がうまく表示できないことから、最後にQ-sphereを使って可視化しています。
使用したコードを下記をのせました。部分コピペで実行します。

from qiskit import QuantumCircuit, QuantumRegister, Aer,assemble
from qiskit.visualization import plot_bloch_multivector, plot_histogram
from qiskit.visualization import array_to_latex
from qiskit.providers.aer.library import save_statevector
from mpl_toolkits.mplot3d import axes3d, Axes3D 
from qiskit.visualization import plot_state_qsphere

qc = QuantumCircuit()
qr = QuantumRegister(1)
qc.add_register(qr)
qc.x(qr[0])
qc.draw()

sim=Aer.get_backend('statevector_simulator')
res = sim.run(qc).result()
state = res.data()["statevector"]
array_to_latex(state, prefix="\\text{Statevector = }")

print(state)
plot_bloch_multivector(state)


qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0,1)
qc.draw()


svsim = Aer.get_backend('aer_simulator')
qc.save_statevector()
qobj = assemble(qc)
result = svsim.run(qobj).result()
final_state = result.get_statevector()
array_to_latex(final_state, prefix="\\text{Statevector = }")


plot_histogram(result.get_counts())

print(final_state)
plot_bloch_multivector(final_state)

plot_state_qsphere(final_state)

以上、今回は主にツールの使い方を学びました。
これをベースにまた理解を深めたいと思います。

]]>
Quantum Computer ../../../202301031525/ Tue, 03 Jan 2023 03:44:09 +0000 ../../../?p=1525 今年初めは、量子コンピュータにチャレンジです。C言語で簡単な演算をシミレートしてみました。
参考)
CQ出版「インターフェイス」(2019/3)
インプレス「いちばんやさしい量子コンピュータの教本」

インターフェイス誌はちょっと前のものになっていますが、C言語による説明が書かれているのでそれを参考にしました。演算の考え方については量子コンピュータ教本の量子アルゴリズムを参考にしました。

環境)
https://godbolt.org/

量子コンピュータの考え方は、他を参考にしていただいて、下記は量子ビットが重ね合わせ状態になるアダマールゲートの図です。


この重ね合わさった状態では、0と1が50%の確率で出現します。

(1/√2は、三角関数のサイン/コサイン45度の値)
ベクトルで表現された2量子ビットを使い、片方にHゲート、もう片方にCNOTゲートを使って演算します。

(黒丸:制御量子ビット 白丸:ターゲット量子ビット 制御が1のときターゲットを反転)

まずは、Cで複素数が使える環境の確認と、演算結果を確率で表示する関数の確認です。

答えが確率によって毎回変わるのは、普通の考え方では使えないのですが、答えを絞りこむことはできます。
(今回、これを実装してみたかった)

#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <math.h>

int measure(double complex c){
    int ret;
    double r = (double)rand()/(double)0x7fffffff;
    double a = pow(cabs(c), 2.0);
    if(r < a){
        ret  = 0;
    }
    else{
        ret = 1;
    }
    return ret;
}
int main(void)
{
    double complex q;
    int q1[2], q2[2], a0=0, a1=0, a2=0, a3=0;
    q2[0] = 0;
    q2[1] = 1;
    q = 1.0/sqrt(2) + 0.0i;
    for(int i=0;i<10;i++){
        int ret;
        ret = measure(q);
        q1[0] = ret;
        q1[1] = ret==1?0:1;
        q2[0] = ret==1?1:0;
        q2[1] = q2[0]==1?0:1;
        printf("%d %d %d %d \n", q1[0], q1[1], q2[0], q2[1]);
        if(q1[0] == 0 && q2[0] == 0) a0 ++;
        if(q1[0] == 0 && q2[0] == 1) a1 ++;
        if(q1[0] == 1 && q2[0] == 0) a2 ++;
        if(q1[0] == 1 && q2[0] == 1) a3 ++;
    }
    printf("Answer: %d %d %d %d\n", a0, a1, a2, a3);
    return 0;
}


(演算の評価(観測)は最後にやるべきですが、簡単にするためHゲートの後にやっています。)
量子ビットq1,q2の値をベクトルで表現しています。[0]と[1]は反するものとして表現しています。
量子ビットの値としては[0]になります。
2bitのとりうるすべて値(00,01,10,11)の出現数をカウントしました。
すると、00と11のみとなります。量子のもつれによる結果の絞り込み、というそうです。

他にもさまざまなアルゴリズムがありますが、Cで実装するにはかなり難しくなります。
今後は他の言語やツールを使って試してみる予定です。

まずは第一歩でした。

]]>