common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

[21.10.15]光量子コンピュータのアプリケーション計算をちょっと試してみた

Yuichiro Minato

2021/10/14 16:16

#光量子計算

勉強してみたいので光量子コンピュータにチャレンジしてみます。わからないことは、少しずつ聞いてみたいと思います。多少の量子ビットの知識はありますが、光量子モードはよくわかりません。まずはインストールしてみます。

!pip install -U -q photonqat

使うライブラリはphotonqat https://github.com/BosoniQ-github/Photonqat

さっそく扉絵のチュートリアルを見てみると、

#Fock basis #Circuit import photonqat as pq import numpy as np import matplotlib.pyplot as plt # mode number = 2, cutoff dimension = 15 F = pq.Fock(2, cutoff = 15)

Fock basisというのがまずはよくわからない。photonqatとnumpyをimportしています。モード数とカットオフ数があるとのことですが、おそらく量子ビット数に対応する数字と、あとは精度に関する桁数みたいなものかと思われる。今回はビット数に対応するモード数が2、カットオフが15と設定され、Fockシミュレータに設定された。

フォック空間のwikipedia

https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%83%E3%82%AF%E7%A9%BA%E9%96%93

フォック空間 (英: Fock space)とは、くりこまれたパラメータを持つ自由粒子の集まりでできたヒルベルト空間のことである。個数演算子の固有ベクトルで張られた空間とも言える。 最初にフォック空間を導入したウラジミール・フォックにちなんで命名された。

概要 場の量子論は、ヒルベルト空間の次元だけでなく自由度も無限大である。 よってヒルベルト空間Hをどのように構成するのかという問題が生じる。 そこで一般的に、扱いたい状態を含んで、かつ、物理量が無駄なく既約に表現される空間にHを選ぶのが普通だが、その場合によく用いられるのがフォック空間である。 いつもフォック空間が適切なヒルベルト空間となる保証は無いのだが、便利なのでよく用いられる。

とのことですが、まったくわからないので、あとで質問するとして便利なフォック空間というのを使うと光量子コンピュータの計算ができるらしい。

次にゲートを適用していきます。こちらは量子ビットと同じですね。

alpha = (1 + 1j) r = -0.5 F.D(0, alpha) # Displacement to mode 0 F.S(1, r) # Squeezeng to mode 1
<photonqat.Fock.Fock at 0x7eff0817b2e0>

ゲートの名前は見慣れない変位ゲートとスクイージングゲートとなっています。それぞれ、変位量alphaをモード0に、スクイージングゲートでrの値?のものをモード1に。alphaやrの正体についてもそのうち質問をしてみたいと思います。

F.run()
<photonqat.Fock.Fock at 0x7eff0817b2e0>

実行しただけでは結果は取り出せないようです。

# Plot Wigner fucntion for mode 0 using matplotlib (x, p, W) = F.Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output

ちなみにつなげてもかけます。

(x, p, W) = pq.Fock(2, cutoff = 15).D(0, alpha).S(1, r).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output

なんかすごい怪しい模様が出ましたが、これが光量子コンピュータの計算結果のようです。

そして、フォックシミュレータのほかにガウスシミュレータもあるらしく(正式名称はわかりません)同じようにゲートを作用させて計算をしてみました。

# mode number = 2 G = pq.Gaussian(2) (x, p, W) = G.D(0, alpha).S(1, r).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output

ガウスシミュレータにはカットオフの設定はなく、モード数の設定ができました。計算結果は見た感じに似ているように見えますが、明るいところから遠方のエリアの描画が違う気がします。こちらのシミュレータのほうが速い?ようです。簡易的なものなのでしょうか。

もうちょっとやってみます。チュートリアルがあります。

https://github.com/BosoniQ-github/Photonqat/blob/master/examples/Basic%20Operations.ipynb

F = pq.Fock(1, cutoff = 15) # (qumode数, cutoff 数) F.n_photon(0, 4) # (qumode, photon number state) F.run() (x, p, W) = F.Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0) # plot Wigner function print("Photon number state:\n", F.state)
<Figure size 432x288 with 1 Axes>output
Photon number state:

 [0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j

 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]

今度はフォトン数状態みたいなのが出てきました。。。計算結果はカットオフ数だけの状態があり、4の状態の状態ベクトルが1になっているように見えます。

Wigner関数に関しては、光の量子状態は光子数状態で表す他に、Wigner関数を用いて(q,p)(q, p)位相平面上の関数としてプロットすることができます。と書いてあります。ここでプロットされた関数は、量子状態を位置qq, または運動量ppで測定する確率を表します。とのことです。確率分布をわかりやすく平面上に表記されているようです。

変位ゲートはこの確率分布を平面上で移動させるようです。複素数をパラメータに持ち、実部と虚部の値の設定によって変位量を調整できそうです。 ガウシアンシミュレータを使ってみます。

# mode number = 1 (x, p, W) = pq.Gaussian(1).D(0, 0).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output
(x, p, W) = pq.Gaussian(1).D(0, 1).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output
(x, p, W) = pq.Gaussian(1).D(0, 1j).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output

見ての通り、実数を設定すると左右に。虚数を設定すると上下に移動しますね。

(x, p, W) = pq.Gaussian(1).D(0, 1+1j).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0)
<Figure size 432x288 with 1 Axes>output

当然ですが斜めに移動させるにはこのような感じです。次にスクイージングゲートです。確率分布の形状をつぶせるようです。

(x, p, W) = pq.Gaussian(1).S(0, 0.5).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0) # plot Wigner function
<Figure size 432x288 with 1 Axes>output
(x, p, W) = pq.Gaussian(1).S(0, -0.5).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0) # plot Wigner function
<Figure size 432x288 with 1 Axes>output

プラスを設定すると縦に、マイナスを設定すると横に伸びました。

(x, p, W) = pq.Gaussian(1).S(0, -1).run().Wigner(0, plot = 'y', xrange = 5.0, prange = 5.0) # plot Wigner function
<Figure size 432x288 with 1 Axes>output

値を強くするとより潰れました。

ビームスプリッタゲートはちょっと飛ばしました、最後にKerrゲートというのがあったので試してみます。

光の媒質の中には屈折率が光の強度に依存するものが存在し、その現象はKerr効果と呼ばれます。 位相平面上では中心からの距離(=強度)によって異なる角度で位相が回転します。

とのことです。距離によって強度が変わる処理のようです。

(x, p, W) = pq.Gaussian(1).D(0, 1+1j).Kerr(0, .2).run().Wigner(0, method = 'clenshaw')
(x, p, W) = pq.Fock(1).D(0, 1+1j).Kerr(0, .2).run().Wigner(0, method = 'clenshaw')
<Figure size 432x288 with 1 Axes>output

Kerrゲートはガウシアンシミュレータでは実行できませんでした。また、中心からの距離によって強度が変わる処理のようで、中心からいったん変位ゲートで移動させてから適用させないと変化がありませんでした。

(x, p, W) = pq.Fock(1).Kerr(0, .2).run().Wigner(0, method = 'clenshaw')
<Figure size 432x288 with 1 Axes>output

変位ゲートを適用せずにKerrゲートを適用させた場合には特に変化がありません。

どうでしょう。このようにいろいろ試してみました。複雑な計算を将来的にやるにはフォックシミュレータがよさそうです。ガウシアンシミュレータは複雑なゲートはできませんでした。また、ゲートは当初思ってたよりは理解しやすかったです。今後はこのようなゲートを使ってどんな処理ができるのかアプリケーションが楽しみです。以上です。

© 2024, blueqat Inc. All rights reserved