Nobisuke
Dekisugi
RAG
Privacy policy
2021/02/02 07:15
量子コンピュータは量子と呼ばれる小さい単位をつかって波動の計算をします。量子の中には光子もあり、光量子コンピュータがあります。今回はこの光量子コンピュータが通常の量子ビットを使った計算と異なるということを確認して少し全体概要をみてみたいと思います。
今回利用するのはXANADUというトロントのベンチャー企業のツールですが、国内外で光量子コンピュータに取り掛かっている方々おります。今回の内容はそういった活動の理解にも繋がる気がします。弊社でもphotonqatを提供しています。
フォトニクスチップを利用した研究開発を行なっている量子コンピュータ企業です。 https://www.xanadu.ai/
光パルスの演算とメモリの二重ループを活用したマシン。内側の演算ループに各ゲートのスイッチが確認できる。 http://www.alice.t.u-tokyo.ac.jp/
では早速概要を見ていきます。。。
光量子コンピュータで使われる原理は連続量プログラミングと呼ばれていて、量子ビットとは原理が違うようです。
XANADUのドキュメントから比較が確認できます。今後の図表はすべてこのページから参照いたします。
https://strawberryfields.readthedocs.io/en/latest/introduction.html
超電導量子ビットが「量子ビット」と呼ばれる単位で計算をする一方で、光マシンは「Qumode」と呼ばれる単位で計算するそうです。
単位は1nat(ビット)という単位のようです。
演算子や量子状態が異なります。 ゲートも異なったゲートがとられ、測定もいくつかあります。
状態に関しても、量子ビットのような|0>と|1>の組み合わせとは少し違うようです。
ガウス状態を基本としていくつかの状態があるようです。 コヒーレント状態、スクイーズド状態など様々な状態があります。 通常これらの状態はwigner分布と呼ばれる分布上で表現されるようです。
光連続量計算をする際に指標とするべき値があるはずですが、光連続量の場合には位置と運動量がその指標となり、調和振動子と呼ばれるバネの動きをベースにしているようです。
調和振動子(ちょうわしんどうし、英: harmonic oscillator)とは、質点が定点からの距離に比例する引力を受けて運動する系である。調和振動子は定点を中心として振動する系であり、その運動は解析的に解くことができる。
https://ja.wikipedia.org/wiki/%E8%AA%BF%E5%92%8C%E6%8C%AF%E5%8B%95%E5%AD%90
超電導量子ビットの状態ベクトルのような固有状態を持っていて、のようにかけるようです。
詳しくはこちらの方が詳しいです。 「Strawberry Fieldsで光量子計算をする(その1)」 https://qiita.com/ryuNagai/items/b106f81c17224d512189
状態も異なりますから、状態を遷移させるためのゲート操作も当然量子ビットとは異なりそうです。量子ビットではブロッホ球上で表現された回転角をゲート操作で回転操作を行いますが、CVプログラミングでは、wigner分布上のcv状態を様々なゲート操作で変化させるようです。変位や回転、スクイージングなどがあります。
上記のCubic PhaseゲートはNon-Gaussian gatesとよばれ、量子ビットにおけるnon-Clifford gatesに対応する特徴的な物のようです。
量子ビットのユニタリ操作に対応するものとして別の操作があります。
・変位
・回転
・スクイーズド
・ビームスプリッタ
などで、ガウス状態を別のガウス状態に変換することで計算ができます。上記は量子ビットにおけるクリフォードゲートに対応し、非ガウス状態の扱いはnon-クリフォードゲートに対応する操作がまた別途であるようです。
Dゲート,Rゲート,Sゲート、BSゲートのようにゲート操作を対応できるので、量子ビット同士にかけることができます。BSゲートは2入力2出力の2量子ビットゲートなのでうまく使えばもつれなどを生成できそうです。
\mid \psi \rangle = \exp(-itH)\mid 0 \rangle
という真空状態の状態ベクトルから始まり、時間発展シミュレーションで状態を変化させることができ、光連続量の場合にはガウス状態というのを維持しながら計算ができるようです。
さまざまな状態はガウス状態として記述できるようです。
・コヒーレント状態 ・スクイーズド状態 ・変位スクイーズド状態 ・x固有状態 ・p固有状態 ・真空状態
光連続量計算における状態の記述はガウス状態と非ガウス状態に分けられるようです。
量子力学においてフォック状態 (英: Fock state) または数状態 (英: number state)、または粒子数状態とは、 粒子(または量子)の数が明確に定義されたフォック空間のベクトルである量子状態のこと。ソビエトの物理学者ウラジミール・フォックにちなんで名づけられた。 また多体系や量子場をフォック状態で表すことをフォック表示、占有数表示などと呼ぶ。量子光学では光子数状態あるいは光子数確定状態とも呼ばれる。
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E7%8A%B6%E6%85%8B
どうやらWigner関数とフォック状態で計算基底を変えて観測ができるようです。混合状態もあるようですので、つかいわけなど今後のアプリケーションなどをみながら確認してみたいです。
上記の状態の記述はWigner分布によって表現できるようです。詳しくは、
https://qiita.com/ryuNagai/items/b106f81c17224d512189
でみていただけるとあれですが、位置xと運動量pを軸として極座標で表示し、確率分布で分散がそれぞれxとp方向にあり、確率分布として得られるようです。
計算は、
・ガウス状態 ・フォック状態
で計算できるようですが、ガウス状態での計算は非ガウス状態の表記はどうするかなどきになるところです。
自分自身は光量子計算ができるシミュレータを通じて光量子コンピュータ向けのアプリケーション環境を構築したいと考えているので、先駆者のシミュレータ環境はとても気になります。
ガウス状態を操作するオペレータやガウス状態の記述はWigner関数を使えばできそうな気がしますので、大丈夫ですが、非ガウス操作ができないとなると利用価値があるのかどうかとかその辺りがわからないです。
今後もっとみてみます。
「一般に完全な連続量量子計算を実現するには無限大の光子数状態が必要なのですが、計算面でも物理実装面でも不可能なので有限個で近似します。」 https://qiita.com/ryuNagai/items/1a19484b7cf6252789df
このあたりがfockシミュレータで誤差が出やすいという理由なのでしょうか。
測定もいくつかの種類があります。
・ホモダイン測定
・ヘテロダイン測定
・フォトンカウンティング
ホモダイン測定はx軸に射影することで位相がわかるようです。
光ヘテロダイン検出受信機は、アンテナを使って電場を検出するのではなく、光に対してヘテロダイン操作を行い、その結果を光電効果で電気に変換して処理する。さらに言えば、光ヘテロダイン検出において、局部発振器の発する光の帯域幅と入力信号ビームの帯域幅は解析において無視できない広さである。一般にそれらを混合した結果の方が帯域幅がずっと狭くなるため、処理しやすい。
https://ja.wikipedia.org/wiki/%E3%83%98%E3%83%86%E3%83%AD%E3%83%80%E3%82%A4%E3%83%B3
フォトンカウンティングは、
実際には光子そのものを計数するわけではなく、光子ひとつのエネルギー (hν) によって光電子増倍管の光電陰極 (Photocathode) から叩き出されたひとつの光電子が、ダイノード (Dynode) を通過する過程にて数百万個に増倍されて生じた電流パルスを陽極 (Anode) から外部に取り出し、アンプや波高弁別回路を通した後でパルスカウンタを使用して計数するものである。
光子エネルギーを電子エネルギーに変換(光電変換)する光電陰極の効率は量子効率 (Quantum efficiency: QE) と呼ばれ、波長依存性はあるが通常の光電子増倍管では25%以下である。光電子が第一ダイノードに導かれる効率は「収集効率 (Collection efficiency)」と呼ばれ80%前後、それが最終的に陽極に到達する効率や、さらに後続の回路系の計数効率までを考慮すると、最終的な光子計数効率はそれらを掛け合わせた18%程度となる。現実的には、量子効率が10%以下の波長域で測光することも多く、その場合の光子計数効率としては数%にまで低下していることに留意すべきである。
量子ビットと一緒でサンプリングに利用できそうです。実用的なサンプリングに関してのパラメータやサンプリング数は同様にアプリケーションや理論によって変わってきそうですが、
「Strawberry Fieldsで光量子計算をする(その4) ボゾンサンプリング」 https://qiita.com/ryuNagai/items/bb12dfc0831eff328678
まぁ、量子ゲートや量子アニーリングのようにちょっと機械学習で生成モデルとかにはつかそうな気はします。
解くハミルトニアンはイジングモデルではなくボースハバードモデルと呼ばれる格子モデルということでしょうか。
「Strawberry Fieldsで光量子計算をする(その5) ハミルトニアンの最小化」 https://qiita.com/ryuNagai/items/4f73757abd7e77815cce
こちらには、もはや現実のアプリケーションから離れてきていますが、Kerrゲートを利用しているため、非ガウス状態となっています。結果の取り出しもなんかわかりやすい方法が欲しいところです。。。
計算エンジンは
state = eng.run('fock', cutoff_dim=10)
やはり非ガウス状態を扱うのでフォック状態を使うのでしょうか。実際アプリケーションが動くのはとても面白いので、もっと細かい使い方を少しずつ今後はみていきたいと感じました。
シミュレータを作るとしたらまずはガウス状態のみを扱う高速シミュレータを作った上で、フォック状態を扱う汎用的なシミュレータを作ればいいのではないかという知見が得られました。
これらのざっくりした知識を使ってCVプログラミングの例を見てみたいと思います。例題ではこれだけ豊富なものが揃っています。
量子テレポーテーション回路を選んでみます。wikipediaによると、離れた場所に量子状態を転送することのようです。量子もつれと古典的な測定を組み合わせます。
量子テレポーテーション(りょうしテレポーテーション、英:Quantum teleportation)とは、古典的な情報伝達手段と量子もつれ (Quantum entanglement) の効果を利用して離れた場所に量子状態を転送することである。
テレポーテーションという名前であるものの、粒子が空間の別の場所に瞬間移動するわけではない。量子もつれの関係にある2つの粒子のうち一方の状態を観測すると瞬時にもう一方の状態が確定的に判明することからこのような名前がついた。また、この際に粒子間で情報の伝達や物理的作用は起こっていない。これは、観測により任意の量子状態を実現することは不可能であることからもわかる。したがって、量子テレポーテーションを用いれば超光速通信が実現できるなどということはない。
回路は上のようになっていて、ビームスプリッタ回路と測定、XゲートとZゲートを使うようです。よくみたら初期状態は二種類の真空スクイーズド状態のようです。
今回は汎用型量子ゲートマシンでのblueqatSDKを利用して量子テレポーテーションを実装したいと思います。
今回は量子状態を追っての数式は細かくは確認しませんが、主には各量子ビットの状態をゲートごとに変換して状態の係数をみていくことで量子テレポーテーションの内部の量子状態を追うことができます。こちらが詳しいので、勉強したい方はこちらを参照ください。
吾輩は量子プログラミング言語である。名前はまだ無い。 Microsoftで生れ量子テレポーテーションした事だけは記憶している。 https://qiita.com/piyo7/items/0c80181c567b3075c00f
最初にq0の状態を決めます。ここでは?にしています。次に、最初に量子もつれを作るのはq1とq2です。q1にHゲート、q1,q2にCXをかけることで、EPRペアと呼ばれる量子もつれ状態を実現できます。そして、ベル測定という部分ですが、q0,q1にもつれを発生させ、q0にHゲートをかけてから測定をします。今回は測定の代わりにCX/CZ回路で代替します。本来はCX/CZの代わりに測定をして、Xゲート、Zゲートを適用させます。
q0 -?-----*-H---*-------
q1 ---H-*-X---*-|-------
q2 -----X-----X-Z-------
コードはとてもシンプルですので、実行して結果を見ます。
Copy from blueqat import Circuit #量子テレポーテーション回路 a = Circuit().h[1].cx[1,2].cx[0,1].h[0].cx[1,2].cz[0,2].m[:] a.run(shots=100) #Counter({'010': 21, '000': 30, '100': 28, '110': 21})
Counter({'110': 27, '100': 26, '010': 21, '000': 26})
これを見ると、初期のq0はq2の値を見ればいいので0がテレポートしたことがわかります。q0とq1の測定結果によらずq2にq0の元の状態の0が移っています。次に1を写して見ます。
Copy (Circuit().x[0] + a).run(shots=100) #Counter({'001': 25, '111': 23, '101': 24, '011': 28})
Counter({'101': 24, '001': 30, '011': 26, '111': 20})
最初にq0をXゲートを使って1にして見ると、同様にq0とq1の測定結果によらず、q0の状態の1が移ってます。最後にHゲートをq0にかけてみると、
Copy (Circuit().h[0] + a).run(shots=100)
Counter({'000': 18,
'111': 16,
'110': 12,
'010': 14,
'011': 7,
'101': 9,
'100': 13,
'001': 11})
約半々でq2に0と1が約半々ででるようになって重ね合わせ状態が移っています。このように簡単にBlueqatで量子テレポーテーションが実装できました。ちょっと工夫することで複雑なコードがどんどん簡単になります。みんなで頑張りましょう。
コードが量子ビットと異なります。
Copy #!/usr/bin/env python3 import numpy as np import strawberryfields as sf from strawberryfields.ops import * from strawberryfields.utils import scale # initialise backend, engine and register eng, q = sf.Engine(3, hbar=0.5) with eng: Coherent(1+0.5j) | q[0] Sgate(2, 0) | q[2] Sgate(-2, 0) | q[1] BSgate(0.7854, 0) | (q[1], q[2]) BSgate(0.7854, 0) | (q[0], q[1]) MeasureP | q[1] MeasureX | q[0] Xgate(scale(q[0], 1.41421356237000)) | q[2] Zgate(scale(q[1], 1.41421356237000)) | q[2] state = eng.run('fock', cutoff_dim=5)
こうなりました。 初期状態は1+0.5jのコヒーレント状態からスタート。Sゲートはスクイージングを実現しますが、それぞれ値が異なっています。BSゲートもパラメータが割り振られています。位相のパラメータでしょうか。そして、P測定、X測定。そしてその測定結果を使って、Xゲートで変位、Zゲートで変位となっています。
一番上の量子ビットの初期状態の量子状態を決めて、二番目三番目の量子ビットにスクイージングをかけます。その後、ビームスプリッターで量子もつれを実現し、ベル測定でベル基底へ射影し量子状態を測定。その後、測定結果を持って、再現をします。
ベル測定とは、ベル基底への射影測定を指す。2準位系のベル基底は次の4つとなる。 引用:https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%86%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
一番目と二番目の量子モードをベル測定することによって、三番目の量子モードの状態が量子もつれによって決まり、最終的に測定結果からパウリ演算子をかけることによって状態を再現することができます。
© 2024, blueqat Inc. All rights reserved