I bought Quantum Computation and Quantum Information 10th Anniversary Edition by Michael A. Nielsen and Isaac L. Chuang at https://www.ebooks.com. I read one with Bluefire Reader on my iPad. Here is an Official errata list.
It looks ePUB edition used in Kindle contains a lot more errata. In ePUB 10th Anniversary Edition, chapter 1 starts at page 30, chapter 4 starts at page 201, and chapter 8 starts at page 372.
p.88 read |0>=(|+> for Recall that |0>=(1+>+|->)
p. 124 read |ψm> for set |ψ1>, ..., |ψm of linearly
p.132
read
state ρi with probability pi, then the density operator for the system is Σi piρi
for
state pi with probability pi, then the density operator for the system is →i pipi
p.134 read set for We say the set IW)
p.239 read ε > 0 for distance ε? 0 using
read |ψ(0)> for |ψ(0)>>, given
p.258 Exercise 5.18 read 91 for gcd(64-1, 19) = 7
p.394 read P0 = |0><0| for |0<(0|
p.397 read |kb> for b†b as |kb),
p.398 read A single atom for Asingleatom
p.406 read ε(|ψj><ψj|) for ε(|ψj><ψj output from
p.407 read ε(|n><n|) for combinations of ε(|n<>n|)
p.419 read tr(ε(S)) for thus tr(ε(Q))=tr(ε(MS))
p.431 read pρ + (1-p)ZρZ for ZρZ (subscript)
p.432 (1) read F(ρ, ε) for 0<= F(ρ, E)
p.438 read error-correcting for errorcorrecting code
p.445 read (capital) P for let p be the projector
read α for By assumption ε is a Hermitian
p.462 read (small) gl for g1, ..., Gl
p.465 read (small) i for Fix I in the range
p.466 read
then Ug1U†,...,UglU† generate USU†
for
then Ug1U†,..., Y ,UglU† generate USU†
p.469 read <ψ| for absorb it into >ψ|
p.471 read Eg for Eg = gE
p.485 read C2 for C2 by a fault-tolerant
p.507 Box 11.1 read |<c|d>| for max c,d |>c|d<|
p.586 read
in either the Z basis|0>,|1>(if a'=1),or in the X basis |±>=(|0>±|1>)/√2(if a'=0)
for
in either the Z basis|0>,|1>(if a'=0),or in the X basis |±>=(|0>±|1>)/√2(if a'=1)
page xxx
三角関数の復習
2π ラジアンは一回り。 sin(θ)^2+cos(θ)^2=1; sin(-θ)=- sin(θ); cos(-θ)=cos(θ);
sin(0)=0; cos(0)=1; sin(π/4)=cos(π/4)=1/√2;sin(π/2)=1; cos(π/2)=0;sin(π)=0; cos(π)=-1;
exp(iθ)=cos(θ)+i sin(θ); e^0=1; e^iπ=-1; e^iπ/2 = i;
exp(iθ)* = exp(-iθ)
(1.4) Bloch 球表現 |ψ> = α |0> + β |1> := cos(θ/2) |0> + e^iφ sin(θ/2) |1>
θ == 0 が、北極で、|0>、θ == π が、南極で、|1>。φ == 0 は、 x 軸。
Hadamard gate (1.14)
|0> <=H=> (|0>+|1>)/√2
|1> <=H=> (|0>-|1>)/√2
H^2=I; H†=H
(1.16) Controlled-NOT
これは、 00 01 10 11 を基底とした行列表現。
1 0 0 0 0 0
0 1 0 0 * 0 == 0
0 0 0 1 1 0
0 0 1 0 0 1
CNOT |10> == |11> と書くときもあるし、(2.50) 2x2 行列2つのテンソル積を使って、こうも書く。
I11 ⊗ X 0 ただし、 I11 はゼロなので、X は発動しないで、I
0 I22 ⊗ X
CNOT |A, B> = |A, A ⊕ B> where ⊕ は、mod 2 の加算、と書くこともできる。
CNOT |+>|-> == |->|-> になる。ターゲットが、 |-> だと、ターゲットが変わらずに、制御ビットが変わるという、不思議なことになる。
|+>|-> == 1/2(|0> + |1>)(|0> - |1>) これに CNOT をかける。最初に書いた |+> が制御ビット。
1/2[|0>(|0> - |1>) + |1>(|1>- |0>)] == 1/2[(|0> - |1>)(|0> - |1>)] == |->|->
1.3.6 Bell 状態
1.4.3 Deutsch's algorithm (1.42) の後、
|x>(|0> - |1>)/√2 に、 Uf を作用させると、の、計算。
|x>(|0 ⊕ f(x)> - |1 ⊕ f(x)>)/√2
になって、 f(x)==0 なら、そのまま、 f(x)==1 なら、|1> - |0> になるので、 -1 がつく。この結果、
(-1)^f(x) * |x>(|0> - |1>)/√2
p. 68 (2.28) |<v|w>|^2 <= <v|v><w|w> Cauchy-Schwarz 不等式
パウリ行列
XY=-YX=iZ; YZ=-ZY=iX; ZX=-XZ=iY; XX=YY=ZZ=I
交換しなければ、反交換する。
phase gate S は、 SS† =I
Ex. 2.11
X の固有値と固有ベクトルは、λ=1 (|0>+|1>)/√2, λ=-1 (|0>-|1>)/√2
Y: λ=1 (|0>+i|1>)/√2, λ=-1 (|0>-i|1>)/√2
Z: λ=1 |0>, λ=-1 |1>
X|0>=|1>; X|1>=|0>; NOT ゲート
Y|0>=i|1>; Y|1>=-i|0>
Z|0>=|0>; Z|1>=-|1>
|+> := (|0>+|1>)/√2; |-> := (|0>-|1>)/√2 として、これは、X の固有状態。
X|+>=|+>; X|->=-|->
Z|+>=|->; Z|->=|+>
H|0>=|+>; H|1>=|->; H|+>=|0>; H|->=|1>
|0> = (|+> + |->) / √2; |1> = (|+> - |->) / √2
<0|+>=<0|->=<1|+>= 1 / √2; <1|-> = -1 / √2
H の固有値と固有ベクトルは、λ=1 (1+√2)|0>+|1>, λ=-1 (1-√2)|0>+|1>
numpy, scipy で固有値も出るんだ。
x=np.array([0,1,1,0]).reshape(2,2)
y=np.array([0,-1j,1j,0]).reshape(2,2)
z=np.array([1,0,0,-1]).reshape(2,2)
h=np.array([1,1,1,-1]).reshape(2,2)*1/np.sqrt(2)
s=np.array([1,0,0,1j]).reshape(2,2)
t=np.array([1,0,0,np.exp(1j*np.pi/4)]).reshape(2,2)
for a in x,y,z,h,s,t:
print(a)
val,vec=linalg.eig(a)
print("eigenvalue=", val, "\neigenvector=\n", vec)
[[0 1]
[1 0]]
eigenvalue= [ 1.+0.j -1.+0.j]
eigenvector=
[[ 0.707 -0.707]
[ 0.707 0.707]]
[[ 0.+0.j -0.-1.j]
[ 0.+1.j 0.+0.j]]
eigenvalue= [ 1.+0.j -1.+0.j]
eigenvector=
[[-0. -0.707j 0.707+0.j ]
[ 0.707+0.j 0. -0.707j]]
[[ 1 0]
[ 0 -1]]
eigenvalue= [ 1.+0.j -1.+0.j]
eigenvector=
[[1. 0.]
[0. 1.]]
[[ 0.707 0.707]
[ 0.707 -0.707]]
eigenvalue= [ 1.+0.j -1.+0.j]
eigenvector=
[[ 0.924 -0.383]
[ 0.383 0.924]]
[[1.+0.j 0.+0.j]
[0.+0.j 0.+1.j]]
eigenvalue= [1.+0.j 0.+1.j]
eigenvector=
[[1.+0.j 0.+0.j]
[0.+0.j 1.+0.j]]
[[1. +0.j 0. +0.j ]
[0. +0.j 0.707+0.707j]]
eigenvalue= [1. +0.j 0.707+0.707j]
eigenvector=
[[1.+0.j 0.+0.j]
[0.+0.j 1.+0.j]]
Ex. 4.13 HXH=Z; HYH=-Y; HZH=X; (4.18)
(AB)†=B†A†
エルミート: H†=H、固有値は実数、
normal: AA† = A†A, エルミートなら、 normal.
ユニタリ: U†U=I
Ex. 2.16 Projector P^2=P, P はエルミート
Ex. 2.18 ユニタリ行列の固有値は、実数θで、 exp(iθ) と書ける。
positive 演算子:<v|A|v> 任意のベクトル v に対して、実数の非負値
Ex.2.22 エルミート演算子の異なる2つの固有値の固有ベクトルは、直交する。
射影演算子の固有値は、0か1
定理2.1 スペクトル分解定理: normal なら、対角化できる。
(2.50) テンソル積の行列表現 A⊗B=
| A11B A12B |
| A21B A22B |
(2.59) tr(A):= ΣAii
(2.61) tr(A|ψ><ψ|) = <ψ|A|ψ>
トレースは、A|ψ><ψ|11 + A|ψ><ψ|22 という意味なのだが、基底を変換して、ψ が最初の基底になるようにすれば、<ψ|A|ψ>11 の項だけになる。演算子のトレース、を計算するときに便利。
tr(|ψ><ψ|) = <ψ|ψ>, 基底なら 1.
tr(AB) = tr(BA); tr(A + B) = tr(A) + tr(B); tr(zA) = z tr(A);
Ex. 2.39 Hilbert-Schmidt inner product 演算子間の内積
(2.65) (A, B) := tr(A† B)
Ex. 2.40 [X, Y]=2iZ; [Y, Z]=2iX; [Z, X]=2iY
Ex. 2.41 {σi, σj} = 0; σi^2=I
定理2.3 polar 分解。A=UJ=KU where U ユニタリ、J, K positive; J:=√A†A, K:=√ AA†
2.2.1 量子力学の仮定1 物理システムは状態空間で表される。
仮定2 状態の時刻変化は、ユニタリ演算子で表される。|ψ'> = U |ψ>
仮定2’ 状態の時刻変化は、シュレディンガー方程式で表される。ih d|ψ>/dt = H |ψ>
仮定3 測定は、測定演算子の集まり、 {Mm} で表される。結果 m が起きる確率は、 p(m) = <ψ|Mm†Mm|ψ> である。
測定後の状態は、Mm|ψ>/√<ψ|Mm†Mm|ψ>
2.2.5 projective measurement
測定 M とは、直交する基底への射影演算である。
(2.102) M = Σ m Pm where Pm は、M の固有値 m の固有空間への射影。
結果 m が起きる確率は、 p(m) = <ψ|Pm|ψ> である。(2.103)
測定後の状態は、Pm |ψ> / √ p(m)
測定の期待値は、 E(M) = Σ m p(m) = <ψ|M|ψ> (2.110) - (2.113)
measure in basis とは、射影 Pm := |m><m| where m は直交する基底 による測定。
例えば、|ψ> := |0> + |1> / √ 2 を、 Z で測定するとは、Z の固有値、固有状態は Ex. 2.11 より、
M := |0><0| - |1><1|
測定結果、Z の固有値1が得られる確率は、p(1) = <ψ|0><0|ψ> = 1/2
E(M) = (+1)/2 + (-1)/2 = 0 = <ψ|(|0><0| - |1><1|)|ψ> = 0
2.2.6 POVM
Positive Operator-Valued Measure
(2.117) Em := Mm†Mm; Σm Em = I; p(m) = <ψ|Em|ψ>
演算子 Em を、 POVM element と呼ぶ。
仮定4 composite 物理システムの状態空間は、要素のテンソル積。
密度演算子 ρ
|0> は、1 0。 |1> は 0 0。 1/√2(|0> + |1>) は 1/2 1 1。 |0> と |1> の半分づつの混合状態は、 1/2 1 0。
0 0 0 1 1 1 0 1
ρ へのユニタリー演算は、 U ρ U† になるので、例えば、 H |0><0| H† は、|+><+| になる。
1/2 1 1 * 1 0 * 1 1 == 1/2 1 1
1 -1 0 0 1 -1 1 1
(2.138) 密度演算子 ρ := Σ pi |ψi><ψi| where ψi は、純粋状態、pi はそこにいる確率。
結果 m を得る測定演算子 Mm
初期状態が i のとき、結果 m を得る確率は、 (2.140) p(m|i) = <ψi|Mm†Mm|ψi> = tr(Mm†Mm |ψi><ψi|)
(2.143) すべての i を合わせると、結果 m を得る確率は、p(m) = tr(Mm†Mm ρ)
初期状態が i のとき、結果 m を得た後の状態を、|ψi^m> と書く。
結果 m を得た後の密度演算子 ρm = Mm ρ Mm†/ tr(Mm†Mm ρ) (2.147)
純粋状態では、 tr(ρ^2)=1, 混合状態では、 <1
2.4.3 縮約密度演算子
系 A と B の密度演算子が ρ^AB のとき、系 A の縮約密度演算子 ρ^A := trB(ρ^AB)
(2.178) partial trace trB(|a1><a2|⊗|b1><b2|) := |a1><a2|tr(|b1><b2|)
ex. 2.72 混合状態は、 Bloch 球の内部になる。QCQI Exercise Solutions (Chapter 2)
必要な倍角の公式
cosθ^2 == 1/2(1+cos2θ), sinθ^2 == 1/2(1-cos2θ)
sinθcosθ == 1/2 sin2θ
藤井 物性研究 (46)、1504.01444 (1.14) より。
(rx, ry, rz) = (Tr[Xρ], Tr[Yρ], Tr[Zρ])
|ψ> = cos θ/2 |0> + e^iφ * sin θ/2 |1> ならば、座標は、(sinθcosφ, sinθsinφ, cosθ) になる。
純粋度は、 Tr[ρ^2] = rx^2 + ry^2 + rz^2 なので、純粋状態は球面上、混合状態は内部になる。
|0>, |1> の確率1/2での混合状態 1/2(|0><0| + |1><1|) は原点になる。
(4.6) Rz(θ)=
|exp(-iθ/2) 0|
|0 exp(iθ/2)|
(4.7) 行列の指数関数とは exp(A) := Σ 1/k! A^k where k=0..∞
Ex. 4.8 ユニタリ演算子 U= exp(iα)Rn(θ) と書ける。 where Rn(θ) := exp(-iθ n*σ /2)
定理4.1 U= exp(iα)Rz(β)Ry(γ)Rz(δ) に分解できる。
系 4.2 U= exp(iα)AXBXC, where ABC=I でそれぞれユニタリ
Ex. 4.13 HXH=Z; HYH=-Y; HZH=X; (4.18)
Ex. 4.17 CNOT は、 H-CZ-H と同じ
---+--- ---+---
| == |
---X--- -H-Z-H-
4.5.3
T, H の組み合わせは、 cos θ/2 = cos π/8 ^2 の回転と書ける。
θ = 2 * arccos(cos π/8 ^2) であり、ほぼ、1.09 ラジアン、 6.2 度だけど、重要なのは、π の無理数倍なので、なんどもかければ、 k θ mod 2π になって、いくらでも近似できること。
日本語訳の38ページ、この方が正確と思う。
誤
Ω(2^1/ε) 個のゲートを必要とする。
正
Ω(2^1/ε) 個のゲートを必要とするとしよう。
話の流れとして、一つ、Ω(2^1/ε) とすると、m 個のゲートだと、いくつになって、指数関数的で良くない。
一様な分布だから、もっとゆるく、Ω(1/ε) してもいいだろう。これは、納得できる。例えば、0から1の区間で、10個のサンプルが一様にあれば、0.1までで近似できるから。
しかし、Solovay-Kitaev の定理によると、 log(1/ε) 個のゲートがあればよいという、さて、これは素晴らしい。付録の定理の証明を読んだけど、わからんかった。SU(2) って、なんか、特別なんだっけ。
4.7.2 量子シミュレーション
(4.96) |ψ(t)> = exp(-iHt) |ψ(0)> シュレディンガー方程式をときたい。
ハミルトニアンが、ローカルな相互作用の和で書ける系だとうれしい。しかし、一般的には、exp(-i(A+B)t) != exp(-iAt)exp(-iBt) である。しかし、
定理 4.3 Trotter の公式 (4.98) lim (exp(iAt/n) * exp(iBt/n))^n = exp(i(A+B)t)
これより、近似的に、(4.103)(4.104)
exp(i(A+B)Δt) ~= exp(iAΔt)exp(iBΔt) ~= exp(iAΔt/2)exp(iBΔt)exp(iAΔt/2)
(4.105) Baker-Campbell-Hausdorf 公式 exp((A+B)Δt) ~= exp(AΔt)exp(BΔt)exp(-1/2[A, B]Δt^2)
TODO: ハバードモデルとイジングモデル、理解すること。
慶應義塾 量子コンピュータ授業 #6 量子フーリエ変換
https://www.youtube.com/watch?v=weH43bUaPQg&t=0s
こんなに本格的な内容の動画とは知りませんでした。(5.5) から (5.10) つまり、積形式への式変形の説明がきっちりあります。
和の公式の復習
a1 = a; an = r * an-1 で定められる等比級数において、
n
Σ ak = a(1 - r^n) / (1 - r)
k=1
なぜならば、和を Sn とおくと、r * Sn - Sn = a (r^n - 1); 最初と最後の項だけが残るから。
演習問題 5.13 で使う形で述べておくと、
r-1
Σ exp(λs) = (1 - exp(λr)) / (1 - exp(λ))
s=0
Doing "elementary algebra" on (5.2) for small n.
量子フーリエ展開 (5.2) が、積の形、(5.4) になることを、小さい n=2 で確かめる。
まず、5.2の基底の変換を書き下してみる。5.4も書き下してみる。なるほど、同じみたい。
5.5から5.9の式の変形を書き下す。
R2(5.12) = (5.13) を示す。
j2=0 なら、I なのでそのまま、 j2=1 なら、
|1 0 | 1/√2 (|0> + exp(2πi 0.j1))
|0 exp(2πi/4) |
で、1/4 は、 0.0j2 と書けるので、|1> の係数は、 0.j1 + 0.0j2 = 0.j1j2 が exp に乗った形に書けて、(5.13) になる。
ここまでの結論。量子フーリエ展開は、(5.4)の積の形に書くことができる。すると、Rk ゲートを使って、図5.1の量子回路で計算することができる。
図5.1の回路を、2ビット系で、実際に変換をしてみる。
あれ、最初に、(5.2)を書き下したのと、少し違う。しまった。スワップも必要だった。
(5.20)ん?コントロールビットは、変化しないのでなかったっけ。
t=1 で計算する。
H|0>=1/√2 (|0> + |1>) に、 controlled-U^2^j をかける。
1/√2 (|0>|u> + |1>U|u>) で、固有値は e^2πiφ なので、= 1/√2 (|0> + e^2πiφ|1>) |u>
で、前半を、first register の値にしたのでしょうか。演習問題 4.34 で既にそういうやり方が出ていた。
Ex. 5.5 逆量子フーリエ変換の量子回路を書け。
ユニタリ演算子だから、† を取れば良いのだよね。(5.2), (5.10) で、 exp に乗っているものに -1 をつける。 Rk が、 exp(-2πi/2^k)
になるのは、回路としてどう書けばいい?
Box 5.1 (5.19) に、ω/√8 とか出てくるけど、いくつなの? 0.25+0.25 i です。qcqi5.19.py を添付する。
Three qubit quantum Fourier transform matrix representation (5.19)
0.35 0.35 0.35 0.35 0.35 0.35 0.35 0.35
0.35 0.25+0.25j 0.35j -0.25+0.25j -0.35 -0.25-0.25j -0.35j 0.25-0.25j
0.35 0.35j -0.35 -0.35j 0.35 0.35j -0.35 -0.35j
0.35 -0.25+0.25j -0.35j 0.25+0.25j -0.35 0.25-0.25j 0.35j -0.25-0.25j
0.35 -0.35 0.35 -0.35 0.35 -0.35 0.35 -0.35
0.35 -0.25-0.25j 0.35j 0.25-0.25j -0.35 0.25+0.25j -0.35j -0.25+0.25j
0.35 -0.35j -0.35 0.35j 0.35 -0.35j -0.35 0.35j
0.35 0.25-0.25j -0.35j -0.25-0.25j -0.35 -0.25+0.25j 0.35j 0.25+0.25j
5.2 のまとめ
量子フーリエ展開は、量子回路で計算できる。しかし、私達は状態ベクトルの amplitude を測定できないので、この回路を直接、役に立てることはできない。なので、何らかの問題の途中で、量子フーリエ展開が出てくるものを探す必要がある。
位相推測は、「essential feature at the heart of this procedure is the ability of the inverse Fourier transform」とあるように、うまくいった例だ。
x の order r とは、x^r = 1 mod N.
order-finding は、(5.36) U|y> := |xy mod N> の位相推測。
U の固有ベクトル、固有値は、 s <= r-1 ごとに、 (5.37), exp(2πi s/r) 。s/r を推測できる。
s/r <1 が統計的に出るが、私達がほしいのは、整数 r で、一般に割り切れない小数を2つの整数の分数で表すために、連分数展開。
5.3のまとめ
order finding は、Σ Uj という項が現れるので、量子フーリエ展開が使える。演算子 U は、Box 5.2 で与えられる。なぜ、可逆計算の話が出るのか理解できなかった。固有状態は、 (5.37) で与えられる。second register に、U の固有状態でなく、 |1> を使えばいいのは、演習問題 5.14 にある。これもよくわからんかった。これで、前節の位相推測回路にのせることができる。測定結果から、 r を得るには、連分数分解をする。ここから、 Shor の素因数分解までは、数論の問題。
(5.64)
15を素因数分解するための完全な回路は、慶應義塾 量子コンピュータ授業 #7 の、阿部先生のスライドの40枚目にある。
https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc7.pdf
reflection about y (y を中心とした折り返し)
0--------y--------2y
-->x
--------------x'<--
一般論として、 x を、 y を中心として折り返すと、 x' == 2y - x である。
N=4, M=1 とすると、 (6.10)
|ψ> = √3/4 |α> + √1/4 |β> == cosθ/2|α> + sinθ/2|β>
sinθ/2 = 1/2 より、θ = arcsin 1/2 * 2 == 1.04 ラジアン == 60度。なので、最初は、x 軸つまり、外れのα から30度回ったところにいて、1回のイテレーションで、60度回って、ちょうど、当たりの y 軸つまりβに一致する。
Grover 反復は、βに収束するのではないので、N, M を知らないと、どんどん回って通り過ぎてしまう。
6.1.4 arccos√M/N 回転すると、ψはβになる。なんで?
e^iθ := cosθ + i sinθ だったので、 e^i(π/2 - θ) を計算すると、 sin θ == cos (π/2 - θ) であることがわかる。
Ex.6.3 に出てくる sin 2θ == 2 sin θ cos θ は、倍角の公式。e^i2θ を計算すると得られる。
(6.16) θ/2 >= sin θ/2 は、なんで?
(8.7) がわからん。
E(ρ) の定義 (8.6) =trenv[U(ρ⊗ρenv)U†] で、env は、ゼロ固定なので、 ρenv=|0><0|.
密度演算子の定義、(2.138) より、a, b を確率として、ρ = a|0><0| + b|1><1| と置いて代入する。
E(ρ) = trenv[U((a|0><0| + b|1><1|)⊗|0><0|)U†]
U は、 c-not で、ρ が0なら I、1なら、フリップなので、
= trenv[a|0><0|⊗|0><0| + b|1><1|⊗|1><1|]
部分トレースの定義、(2.178) に従い、= a|0><0| + b|1><1| あれ、これは、ρ に戻っただけか。
射影演算子、 P0 := |0><0| を使うと、 a = P0 ρ P0 と書けるので、(8.7)になる。
(8.9) 演算子和表現 E(ρ) := ΣEk ρ Ek†, where Ek := <ek|U|e0>
k は、環境系の基底。
E は、マップで、 quantum operation
ρ は、主系の密度演算子。
マップ E が trace preserving : tr(E(ρ)) = 1 ならば、 その operation elements Ek は、completeness relation ΣEk† Ek = I を満たす。
(8.18) がわからん。
最初の状態が、ρ⊗|e0><e0| で、(2.158) より、系の時間発展はユニタリ演算子であらわすので、U ではさむ。次に、環境系で k が観測されたということは、(2.147) より、ρk MkρMk† に比例する。(2.102)により、射影観測は射影演算子なので、|ek><ek| ではさむ。
trE というのは、 tr env つまり環境系における部分トレースのこと。
(2.140)に示すように、状態ベクトルで表現した場合に確率密度がベクトルの長さになることは、密度演算子で表現した場合には、トレースになる。
合成系における観測は、系全体の観測演算子に、されない系の部分トレースを取って、されない系を除いたものであることは、 Box 2.6 にある。
というわけで、(8.18)が、ρk ただし長さ1に正規化してないもの、になるのだろうな。
話の流れは、
閉じた系では、密度演算子 ρ に演算子 U をかけた結果は、 UρU† になる。
開いた系では、それを、E(ρ) とあらわす。演算子和表現では、環境系の基底を使って、 Ek := <ek|U|e0> により、ΣEk ρ Ek† とあらわす。
美しい物理的解釈が見られる、といわれても、ピンと来ないなあ。
8.3.3 例題 2.72 をやること。
Theorem 8.1 写像 ε は、(8.50) ε(ρ) = Σ Ei ρ Ei† の時に公理 A1, A2, A3 を満たす。
Theorem 8.2 2つの量子演算は、演算要素がユニタリ変換による線形結合で対応づく時に等しい。
(8.87) ρ = (I + r * σ)/2; Bloch 表現 (2.175) Ex. 2.72
(8.88) ρ = 1/2
| 1+rz, rx - iry |
| rx + iry, 1-rz |
混合状態の Bloch 球表示は、球の内部になる。なんで?
答えex. 2.72
Bit flip の結果、 Bloch 球は、y-z 平面方向が、小さく縮む。
easy to verify tr(ρ^2) = (1 + |r|^2)/2
(8.96) と書けるのは、(8.68) に示したとおり。P0 ρ P0 は、北極、 |0> への射影観測。なので、 phase flip p=0.5 は、 z 軸への射影になる。
8.3.4 Depolalize
(8.100) E(ρ) = pI/2 + (1 - p)ρ =
| p/2 + (1-p)/2(1+rz), (1-p)(rx-iry) | ここで、 p=1/2 とすると、
| (1-p)(rx+iry), p/2 + (1-p)(1-rz) |
| 1+rz/2, (rx-iry)/2 |*1/2 なので、r が半分になった球になる。
| (rx+iry)/2, 1-rz/2 |
Bloch 球が半分になるって、どういうこと?確率密度とか、観測、に関係あるの?
Ry(θ) := exp(-iθY/2) = cos(θ/2)I - isin(θ/2)Y (4.5)
(8.101) I/2 = 1/4(ρ + XρX + YρY + ZρZ)
古典的な
トレース距離 (9.1) D(px, qx) := 1/2 Σ |px - qx| where x はインデックス、px, qx は、確率分布
fidelity (9.2) F(px, qx) := Σ √ px qx
量子密度演算子 ρσ に対して、
トレース距離(9.11) D(ρ, σ) := 1/2 tr| ρ - σ | ; |A| := √A† A
(9.12)
ρ と σ が交換するなら、同じ基底で対角化できる。なんでだっけ?定理2.2 (2.72)
ρσ が交換すると、古典的なトレース距離になる。(9.13) = 1/2 tr | Σ (ri - si) |i><i| | = D(ri, si) where i は基底状態。
(9.20) (r - s) * σ の固有値は、 +-|r-s| である。
なぜならば、X, Y, Z いずれも、固有値は +-1 だから。演習問題 2.11
(9.21) D(UρU†,UσU†)=D(ρ,σ) わからん。
右辺 = 1/2 tr √UρρU† + UσσU† - UσρU† - UρσU† で、この後、簡単にならない。
(9.22) の証明が追えない。|ρ - σ| = Q + S なのはなぜ? max over projector というのはどこに効いているの?
Ex.9.7 により、ρ - σ = Q - S; Q, S は直交する support を持つので、QS という項はゼロ。
定義から、D(ρ,σ) = 1/2 tr | ρ - σ |; = 1/2 tr(Q + S); トレース内の加算は、外に出せるので、=(tr(Q)+tr(S))/2
tr(ρ) = tr(σ) = 1; 密度演算子だから。P を、 Q の support への射影とすると、=tr(P(ρ-σ)) = tr(Q) になる。
P をそれ以外の射影とすると、ロスがあるので、不等号になる。
(9.32) = (9.33) がわからない。
定理2 (9.35) D(ε(ρ), ε(σ)) <= D(ρ, σ) トレースを保存する操作なら、操作後、トレース距離は縮まる。
(9.38)->39 は、ε が trace preserving だから。
Ex. 9.12 depolarizing channel ε(ρ) = pI/2 + (1-p)ρ で、D(ε(ρ), ε(σ)) <= D(ρ, σ) を明示的に計算して示せ。
fidelity (9.53) F(ρ, σ) := tr √ √ρ σ √ρ
ρσ が交換すると、古典的な fidelity になる。(9.58) = F(ri, si)
(9.59) F(|ψ>, ρ) = √ <ψ|ρ|ψ> がわからん。そもそも、|ψ>^1/2 って、なんだ?
(2.138) 密度演算子 ρ は、純粋状態の和で書ける。
(9.59) F(|ψ>, ρ) で、tr √ の中は、ρ の展開中、純粋状態 |ψ> の項だけが残るので、スカラー <ψ|ρ|ψ> が外へ出て、トレースは、<ψ|ψ> = 1
Ex. 9.14 for any positive operator A, √UAU† = U√AU†
(9.65) コーシー・シュワルツ不等式 (2.28) を、ヒルベルト・シュミット内積 (2.65) に使う、とは、
|tr(A† B) |^2 <= tr(A†A) tr(B†B)
|A|^0.5 と、|A|^0.5 VU にあてはめる。すると、不等式の右辺は、 tr|A| * tr(U†V†|A|^0.5 * |A|^0.5 VU)
トレースの中は、交換できるから、右辺 = tr|A|^2
なので、不等式の平方根をとる。不等式の左辺は、(9.64) | tr(AU) | <= tr |A|
Uhlmann の定理4 F(ρ, σ) = max |<ψ|φ>| where max は、全ての purifications ψ, φ
角度 (9.82) A(ρ, σ) := arccos F(ρ, σ)
(9.112) F(|ψ>, ε(|ψ><ψ|)) = √ 1 - p/2, for depolarizing channel. ε(ρ) = pI/2 + (1-p)ρ
(9.59) を使う。ε(ρ) を代入する。
(9.116) for the phase damping channel (9.115) ε(ρ) = pρ + (1-p)ZρZ
(9.127) F- := Σ pj F(ρj, ε(ρj)^2 アンサンブル平均 fidelity
(9.128) F(ρ, ε) := F(RQ, R'Q')^2 エンタングルメント fidelity
= Σ | tr(ρEi) |^2 (9.135) where Ei は、ε の operation elements
(9.135) F(ρ, ε) = Σ | tr(ρ Ei)| ^2, where Ei は、operation element
phase damping ならば、(9.136) = p + (1-p) tr(ρZ)^2
(10.6) P1 := |100><100| + |011><011|; 4つの射影演算子がある。(10.5)-(10.8)
P1 は、最初がビットフリップすると、1が観測される。
(10.12) Z1Z2 := (|00><00| + |11><11|) ⊗ I - (|01><01| + |10><10|) ⊗ I
最初と次が同じなら、 +1, 違うなら、 -1 が観測される。
(10.13) Shor code: |0> -> |0L> := (|000> + |111>)(|000> + |111>)(|000> + |111>)/2√2
定理 10.1 量子誤り訂正が可能な必要十分条件。
(10.16) P Ei† Ej P = αij P
where α はエルミート行列。C は量子コード。P は C への射影。ε はノイズで、Ei はその演算子要素。
定理 10.2 演算子要素 Ei による誤りを訂正できるコードは、 Ei の線形結合を演算子要素として持つ誤りも訂正できる。
(10.81) G1 := I, X, Y, Z に、+, -, i, -i をかけたものを要素とする群。 Gn はその n ビット版。
その後、Let's look at a simple example のまとめ。3ビットのビットフリップコード。
n=3, k=1, S = { I, Z1Z2, Z2Z3, Z1Z3 } がスタビライザ。これは、群。
S で安定化するベクトル空間 Vs の基底は、{ |000>, |111> } これは、 S の固有値1の固有状態。
S のジェネレータは、Z1Z2, Z2Z3 であり、l=2. g1,g2 とも書く。
その2つが S 全体を生成することを、 S = < Z1Z2, Z2Z3 > と書く。
S の check matrix は、l*2n=2*6 行列で、
1 2 3 1 2 3
Z1Z2 0 0 0 1 1 0 これを、r(Z1Z2) と書く。
Z2Z3 0 0 0 0 1 1 同じく、r(Z2Z3)
r(Z1Z2) Λ r(Z2Z3) = 0 になることがわかる。
Z1Z2 と Z2Z3 は交換する。
code word C(S) は、 Vs つまり、 |000>, |111>。論理1ビット。
10.5.1 定理 10.5
n ビットのパウリ群で、 n-k 個のスタビライザジェネレータの固有空間は、論理 k ビットのコードワードになる。
ジェネレータは独立で、交換し、スタビライザは -I を含んではいけない。
これの証明中に、 (I + g)/2 は、 g の固有値 +1 固有空間への射影である。とあったけど、なんでだっけ。
|ψ> = a |g+> + b |g-> where g |g+> = |g+> とすると、
(I + g)/2 |ψ> = (a |g+> + b |g->)/2 + (a |g+> - b |g->)/2 なので、 g+ だけ残って、 a |g+>
10.5.2
ユニタリ演算子による作用、U|ψ> スタビライザへの作用 USU† として見ることができる。
Fig. 10.7. HXH† = Z と読む。
(10.81) の後、Ex.10.30 の前。
Vs がゼロでない条件
(a) S の要素が交換する。
(b) -I が S に入ってない。
10.5.3 測定
g を測定とする。 g がジェネレータと交換するなら、g は実はジェネレータに含まれており、測定後もジェネレータは同じ。
パウリ行列とするので、交換しないなら反交換する。その時、測定値が +1 だったなら、状態は、 |ψ+> := (I + g) |ψ> / √ 2 であり、ジェネレータは、 g と交換しない g1 を除いて代わりに g が入る。
10.5.6 に、3ビットのビットフリップの例が続く。
エラーの検出とは、ジェネレータの測定のこと。Z1Z2, Z2Z3
{ I, X1, X2, X3 } から2つを取ってかけた要素の集合は、少なくともジェネレータの1つと反交換するので、定理 10.8 により、訂正可能である。
Z1Z2*X1 + X1*Z1Z2 = (Z1X1 + X1Z1)Z2 で、XY=-YX なので、ゼロ。つまり、 X1 はジェネレータと反交換する。
phase flip 誤りの集合、 { I, Z1, Z2, Z3 } は、例えば、 Z1Z2*Z1 - Z1*Z1Z2 = 0 であり、交換するけど、 S の要素でないので、訂正できない誤り。
X1 エラーが起きると、X1(Z1Z2)X† = -Z1Z2 になる。Fig. 10.7 より。
シンドローム測定は、ジェネレータ演算であるので、Z1Z2 ジェネレータをかけた結果が -1 になり、ビット1のエラー発生を示す。
Z(S) : centralizer. Eg = gE for all g ∈ S, E ∈ Gn
N(S): normalizer. EgE† ∈ S
Ex. 10.40 解答
https://web.mit.edu/2.111/www/2010/ps6_2010Sol.pdf
Fig. 10.9 の回路による構成は、Gottesman Knill 定理の証明の一部らしい。
Ex.10.43 S ⊆ N(S)
Ex.10.44 S が -I を含まないなら、 N(S) = Z(S)
定理 10.8 全ての j, k に対して、Ej† Ek (not ∈) N(S) -S ならば、{ Ej } は、コード C(S) で訂正可能な誤りの集合。
N(S) -S とは、 E が交換するけど S でない、前のパラグラフの real danger な場合。
対数関数の復習 底は2とする。
log 1 = 0; log(xy) = log x + log y; log(x/y) = log x - log y; log x = ln x / ln 2
d ln x / dx = 1/x; d log x / dx = log e / x
シャノンのエントロピー (11.1) H(x) := Σ px log(px); where x は事象、p は確率分布。
(11.8) Hbin(p) := -p log p - (1-p)log(1-p)
(11.12) 相対エントロピー H(p(x)||q(x)) := Σ p(x) log (p(x)/q(x)) == -H(X) - Σ p(x) log q(x)
は、2つの確率分布の間の距離とみなせる。
定理 11.1 H(p(x)||q(x)) >= 0
log x * ln 2 = ln x <= x -1
(11.18) joint エントロピー H(X, Y) := - Σ p(x, y) log p(x, y)
は、X と Y の組についての不確かさ。
(11.19) Y を知っている条件下での X のエントロピー H(X | Y) := H(X, Y) - H(Y)
(11.20) mutual 情報 H(X : Y) := H(X) + H(Y) - H(X, Y) は、共通の情報
11.3 フォンノイマンエントロピー
(11.39) S(ρ) := -tr( ρ log ρ ) = - Σ λx log λx where λx は固有値
このへんからぜんぜんわからん。
定理 11.7 Klein の不等式
S( ρ || σ ) >= 0
subadditivity 不等式 (11.72) S(A, B) <= S(A) + S(B)
三角不等式 (11.73) S(A, B) >= | S(A) - S(B) |
11.4 強い subadditivity
(11.95) S(A, B, C) + S(B) <= S(A, B) + S(B, C)
12.6.3 B92 protocol
Bob のふるまい、逆、誤植じゃない?a'=0 なら、X 基底、 a'=1 なら、Z 基底で測定する。
2.2.5 projective measurement を参照。
a=0 なら、 |0> を送る。 a'=0 なら、X 基底で測定する。期待値 E(M) = <0| (|+><+| + (-1) |-><-|) |0> = 0 これが、 b になる。 |0> を、Z 測定したら、固有状態だから必ず +1 が観測される。
で、 b=1 の時だけを採用する。Alice のキーは、 a で、Bob のキーは、 1 - a'。
当たり前か。どの基底を使ったかを秘密にしておいて、相手と自分が同じ基底を使ったなら測定結果は、100%、固有値になるはず。違っていれば、ランダムで二分の一。
See also QCQI Exercise Solutions (Index) by Nakai-san.
Ex. 2.70 ψ がベルの状態で、E が positive のとき、<ψ|E x I|ψ> はすべて同じ値になることを示せ。
例えば、(2.134) (|00> + |11>)/√2 で計算してみる。|0>|0> に E x I をかけると、前は、 E|0> うしろはそのまま。<0|1> のような内積項は直交しているから消える。<β00|E x I|β00> = (<0|E|0> + <1|E|1>)/2
ほかも同じでしょう。 positive というのは、どこに効いたの?
盗聴者は、アリスのビット、前半だけを、E で観測することができるが、ベル状態4つとも、測定値は同じなので、区別はつかない。
Ex.2.71 密度演算子 ρ について、tr(ρ^2) <= 1 を示せ。iff 純粋状態なら1を示せ。
(2.138) ρ := Σ pi |ψi><ψi| で、 pi は確率なので、Σ pi = 1
tr(ρ^2) = tr[ΣΣ pi pj |ψi><ψi||ψj><ψj|]. 基底は直交するから、tr[Σ pi^2 |ψi><ψi|] になって、(2.61) より、= Σ pi^2
pi <= 1 より、二乗の和は <= 1 であり、pi == 1 の時だけ、 ==1 となる。
Ex. 4.18 行列表現は、 |00>, |01>, |10>, |11> の基底で並べる。最初のカラムに、 |00> に演算した結果を置く。control bit はそのまま出て、control bit が1のときだけ、演算、Z, X, U が target bit に行われる。
Ex.4.20 の続きは、中井さんのQCQIの解答を見てください。
Ex. 4.21 cotrol bit が1,1の時、target は、VV=U が演算される。他の3つの組み合わせも書き下すと、C^2(U) に等しいことがわかる。
Ex. 4.31
(4.32) CX1C == X1X2 を示せ。
まずは、|00>|01> |10> |11> を基底とする4X4行列で計算する。CNOT は、(4.23) にある。
X1 =X ⊗ I =
0 0 1 0
0 0 0 1
1 0 0 0
0 1 0 0
X2 = I ⊗ X =
0 1 0 0
1 0 0 0
0 0 0 1
0 0 1 0
CX1C == X1X2 ==
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
であることがわかる。
同じことを、2X2行列で計算すると、
X1X2 ==
0 I X 0
I 0 0 X
CX1C ==
I 0 0 I I 0
0 X I 0 0 X
==
0 X で、同じになることがわかる。
X 0
Ex. 5.9
Ex.10.48
z~ := X1X2X3X4X5X6X7X8X9 と、 x~ が、(10.13) で定義された Shor コードに対する論理 Z と X であることを確かめよ。
Fig. 10.11 の g1 - g8 と独立であること。z~, x~ は、X, Z を奇数個持つので、それらを偶数個持つ g1 - g8 からは作れない。
交換すること。 g1 - g8 を見ると、Z は偶数個あるので、全ての9個の X からなる z~ と交換する。 X も偶数個あるので、x~ と交換する。
例えば、 Z1Z2X1X2 = (-X1Z1)(-X2Z2) = X1X2Z1Z2
z~ と x~ は反交換する。奇数個だから、(-1)^9 = -1
実際に論理 Z, X であることを確かめる。
(10.13) |0L> := (|000> + |111>)(|000> + |111>)(|000> + |111>)/2√2
z~|0L> = 最初の項に、 X1X2X3 をかけると、(|111> + |000>) になる。以下同じで、 |0L> のまま。
z~|1L> = 最初の項は (|000> - |111>) なので、(|111> - |000> になり、3つあるので、 -|1L>
x~|0L> = 最初の項に、 Z1Z2Z3 をかけると、(|000> - |111>) になる。以下同じで、|1L>
x~|1L> = (|000> + |111>) になり、|0L>
というか、ニールセン・チャンを読んだ後に読みたいもの。最近の動向がわかるもの。
Noisy intermediate-scale quantum (NISQ) algorithms
https://arxiv.org/abs/2101.08448v1
Adiabatic Quantum Computing
https://arxiv.org/abs/1611.04471v2
Quantum computational chemistry
https://arxiv.org/abs/1808.10402
----
Quantum Native Dojo https://dojo.qulacs.org/
慶應義塾 量子コンピュータ授業 #8 量子コンピュータの歴史
https://www.youtube.com/watch?v=wBilQWKd1yU&t=0s
数式は出てこない。歴史と人間ドラマ。とてもわくわくする。
同じく古田さんの書かれた、日経サイエンス 2018年4月号 特集 量子コンピューター とあわせて見るべし。
藤井 啓祐 先生の講義録
http://quantphys.org/wp/keisukefujii/?page_id=56
量子コンピュータの基礎と物理との接点 (第62回物性若手夏の学校 講義)物性研究電子版 DOI: 10.14989/229039 藤井 啓祐
http://mercury.yukawa.kyoto-u.ac.jp/~bussei.kenkyu/wp/wp-content/uploads/6200-064217.pdf
同じく藤井先生の書かれた、表面符号の説明を含む教科書。
Quantum Computation with Topological Codes: from qubit to topological fault-tolerance
https://www.amazon.co.jp/Quantum-Computation-Topological-Codes-Fault-Tolerance/dp/9812879951/
https://arxiv.org/abs/1504.01444
変分量子固有値ソルバー
猫でもわかる Surface Code 量子計算
https://web.sfc.wide.ad.jp/~kurosagi/public-posts/2017-12-24-surface-code.html
わからんかった。
T-QARDの日々 第5回 「スペシャルゲスト藤井啓祐さんと語る量子コンピューティング・前編」
https://www.youtube.com/watch?v=epNfItVUALA&t=21s
Interface 2019年3月号 算数&電子工作から始める量子コンピュータ
https://interface.cqpub.co.jp/magazine/201903/
トポロジカル量子コンピュータ
A Short Introduction to Topological Quantum Computation
Ville Lahtinen, Jiannis K. Pachos
https://arxiv.org/abs/1705.04103
Preskill 先生の講義録
Topological quantum computation
http://www.theory.caltech.edu/~preskill/ph219/topological.pdf
いずれも5ページで挫折した。さらに本格的な参考文献は Pachos にある。
量子化学への量子コンピュータの応用
Quantum computational chemistry
https://arxiv.org/abs/1808.10402
2020/1 に、バージョン3が出ました。以下、略号。
M は軌道の数、 N は、電子の数
Hartree-Fock (HF)
self-consistent field method (SCF)
confguration interaction (CI), coupled cluster (CC) methods
full confguration interaction (FCI) wavefunction.
Slater-type orbitals (STO)
Gaussian-type orbital (GTO)
cc-PVnZbasis sets (correlation consistent polarised valence n zeta)
reduced density matrices (RDMs)
Jorda-Wigner (JW) encoding
Bravyi-Kitaev (BK) encoding
quantum phase estimation algorithm(QPE)
variational quantum eigensolver (VQE)
unitary coupled cluster (UCC) ansatz
simultaneous perturbation stochastic approximation (SPSA) algorithm
witness-assisted variational eigenspectra solver (WAVES)
UCC ansatz truncated at single and double excitations (known as UCCSD)
natural orbital occupation number (NOON)
single excitations (CIS), double excitations (CISD), and triple excitations (CISDT)
Natural Molecular Orbital (NMO) basis
このレビュー論文を読んでいて、はて?と思ったら、ザボ著、新しい量子化学 を読みましょう。2章を読めば、かなりわかる。
7章の水素分子の例で、(92) σg と σu は何の略だろう。偶 gerade, 奇 ungerade です。フェルミオンの反対称性と関係あるのか?ありません。
(95) HF 状態は、なぜ、 |0011> なのだ。(98) なぜ、|1100> の補正項だけがあらわれるのだ。ザボ(2.78) 参照。
Quantum computational chemistry の説明スライドを書いた。物理学と化学の専門でない人向け。
を読み始めたのだが、演習問題が解けない。解答を探したら、あった。感謝。けど、数式がくずれて読めない。
https://www.claudiug.com/9780486691862/chapter.php?c=1&e=18 - Modern Quantum Chemistry
MathML というので書かれていて、 Firefox, Safari しかサポートされてないのだそうな。
前記解答の、1.18 の途中の計算が間違っている。 Upon evaluating the integrals の前の行、 exp(-αx^2) は前と後ろにあるので、例えば2つ目の積分項は、
α ∫ exp(-2αx^2) dx == √ π / 2α になる。答えはあっているけどね。
1.19 も違う。Evaluating the integral の前の行、 4α^2r^2 - 6α は間違いで、-2α^2r^2 + 3α
3.5.2 STO-3G を使った H2 の計算 を、 psi4 で忠実に行った例。
https://www.slideshare.net/NakataMaho/quantum-chemistry-on-quantum-computer-handson-by-q-201984mdr-hongo-tokyo - quantum chemistry on quantum computer handson by Q#
https://dojo.qulacs.org/ja/latest/notebooks/6.1_openfermion_basics.html は、distance = 0.65 なので、 本の、 R==1.4 a.u. と違う。
distance = 1.4*0.52918 # in bohr 0.740852
にして、 Colab で計算しなおす。
HF energy: -1.116714115091591 (Hartree) これは、問題 3.27 Etot なのかな。
FCI energy: -1.1372759045541474 (Hartree)
1 電子積分 hij
[[-1.25279470e+00 -9.26457967e-17] これは、181ページの h11
[-1.85605391e-16 -4.75604752e-01]] h22
2電子積分 hijkl
[[[[ 6.74593339e-01 -8.56271364e-17] これが、<11 | 11> J11 なのか。
[ 4.99265657e-17 1.81258133e-01]]
[[ 4.99265657e-17 1.81258133e-01]
[ 6.63563313e-01 1.26336957e-16]]]
[[[-8.56271364e-17 6.63563313e-01]
[ 1.81258133e-01 2.36398942e-16]]
[[ 1.81258133e-01 2.36398942e-16]
[ 1.26336957e-16 6.97494628e-01]]]] <22|22> J22
これ、どういう並びなのだ?
help(molecule)
| two_body_integrals
| A 4-dimension array for electron repulsion integrals in the MO
| representation. The integrals are computed as
| h[p,q,r,s]=\int \phi_p(x)* \phi_q(y)* V_{elec-elec} \phi_r(y) \phi_s(x) dxdy
print(molecule.overlap_integrals)
[[1. 0.65931565] (3.229) S なのかな。
[0.65931565 1. ]]
このページは何?
2018年現在、量子コンピュータの教科書を独習しています。その読書ノートです。ePUB 版の誤植の指摘もあります。
amazon のレビューで、Kindle 版には固有の誤植がたくさんあると書いてありました。私自身も、Computability and Logic Unofficial Errata (For Kindle edition) で苦労したので、https://www.ebooks.com で電子版を買いました。私が気づいた誤植を、Unofficial Errata for ePUB edition にまとめています。それほど、致命的なものはないようです。10th Anniversary Edition で改善があったのかは不明です。ePUB 版と pdf 版とで差があるようです。
普段は iPad で読んでいます。最初、ebooks.com の Ebook Reader を使いましたが、ページをめくるのに30秒かかり、これは失敗したかと思いましたが、ebooks.com で同じく紹介されている、Bluefire Reader を使ったら、快適でした。
Windows で epub 形式を読んでいるときに、Bluefire Reader からテキストをクリップボードにコピーできたことがあります。できないこともあります。選択した英単語の辞書が引けるときと引けないときがあります。詳細不明。
Windows で Adobe Digital Editions からは、印刷が、できます。
マイクロソフトの、実機って、動いているの?
ニールセン・チャン輪読会のスライド第2章量子力学と密度演算子
Notes on
Quantum Computation with Topological Codes: from qubit to topological fault-tolerance
藤井先生のご本を、少し読みました。
(1.40) ラムダ Λ は、 controlled ゲートを意味する。CNOT Λc,t (X) は、(1.38) の後のパラグラフで出る。c はコントロールビット、 t はターゲット。
パウリ群は、Pn と書き、(2.1) に出る。
グラフ状態 |G> のスタビライザジェネレータは、(2.19) Ki := Xi Π Zj where i はある頂点、j はその頂点につながる全ての頂点。クラスタ状態とも呼ぶ。
(2.20) の前、 CZ gate on each of the graphs: とあるのは、vertices の誤りでない?
0 -- 1
2頂点で考える。
K0 := X0 Z1, K1 := X1Z0
|G> := Λ(Z)0,1 *|++>
Λ(Z)0,1 *|1+> == |1->; Λ(Z)0,1 == |0X0| * I + |1X1| * Z を使って計算すると、
|G> = 1/√2 |0+> + |1-> == 1/2 |00> + |01> + |10> - |11>
スタビライザーで、グラフ状態は変わらない。
K0|G> == X0 Z1 1/2 |00> + |01> + |10> - |11> == 1/2 |10> - |11> + |00> + |01> == |G>
CNOT=
1 0 0 0
0 1 0 1
0 0 1 0
CZ =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 -1
CZ*CZ == CX*CX == I
CZ == |0X0| *I + |1X1| * Z, CZ|0+> == |0+>, CZ|1+> == |1->
|G> := CZ01 |++> == CZ01 X0 |++> ∵ + は X の固有状態だから
== CZ01 X0 CZ01 CZ01 |++> ∵ CZ*CZ== I だから
== X0Z1 |G> ∵ CZ01 X0 CZ01 は、 X0Z1 になるんだっけ。
頂点がたくさんあるときは、X0に隣接する CZij 以外は、交換するから I になって消える。
この結果、|G> はスタビライザーで変わらないことが示された。
[[n, k, d]] stabilizer code とは、n ビットを使って、論理 k ビットを表し、距離 d つまり、 (d - 1)/2 個の誤りまで直すことができる。
2.6 Measurement-based quantum computation (MBQC)
3.1
頂点 vk, 辺 el, 面 fm で、0-chain c0 は、頂点 vk の線形結合。係数は0と1.
(3.2) 1-chain c1 := Σ zl el, where zl = { 0, 1 } は、辺。 2-chain は面。
(3.4) 境界演算子 ∂ は、∂i * ∂i-1 = 0 として定義される。cycle cl とは、∂ cl = 0 であるもの。何かの境界は必ず cycle である。
係数は0と1なので、向きは考えなくていい。∂ 辺1 := 頂点1 + 頂点2 == 頂点1 - 頂点2
+---+ +---+ +
| ∂ f | + | = |
+---+ + +---+
∂ f + c1 == c1'
(3.5) ホモロジー群 hi := ker(∂i) / Img(∂i+1)
それぞれの辺に、 qubit があると思う。X, Z 演算子は、 1-chain つまり辺の線形結合に対して定義される。
c1 が qubit 0, 2 の和なら、 X(c1) = X0 * X2 つまり、その2つをフリップする操作になる。
(3.8) c1 * c1' = 0 iff X(c1)Z(c1') = Z(c1')X(c1)
例を考える。 c1 := a e0 + b e1; c1' := c e0 + d e1
X(c1)Z(c1') = X0^a X1^b Z0^c Z1^d; Z(c1')X(c1) = Z0^c Z1^d X0^a X1^b
これが交換するためには、a=b=c=d=1 で負号が2つになるか、XZ という項が出ないために a*c=0 and b*d=0 であるかのいずれか。これは内積ゼロと同じ。
(3.14) スタビライザジェネレータ Ak := Π Zl where l は、頂点 vk を含む辺
δ vk := ∂ f~ 頂点 vk を含む辺の集合。双対グラフで考えたときの面 f~ の境界とも言える。
ある頂点に基づくスタビライザジェネレータ Ak は、その頂点の両側にいる qubit をフェーズフリップする操作になる。
Π Ak = I;なぜならば、 Z0Z1 * Z1Z2 * Z2Z0 で2回ずつ出るから。
(3.15) logical Lx := X(∂ f1) つまり、全ての辺 についての X の積。 X0 * X1 * X2 ... 赤道上の n 個の qubit を全部フリップする操作。
Logical Z は、任意の辺の Z
3.3 toric code
qubit は、トーラスを格子に区切った辺にある。
スタビライザジェネレータ (3.16) Am := Z(∂ fm) 面 m を囲む辺にある qubit への Z 操作。Bk := X(δ vk) 頂点 k を含む辺にある qubit への X 操作。
使うビットは、 n*n; 論理ビットは 2; 距離 n
論理XとZは、自明でないループ c1(1), c1(2), 2つを構成する辺にある qubit 操作。双対格子についても同様。
例えば、論理ゼロは、どう表現するの?
論理 Z の固有状態は、 (3.26) s1, s2 って、何?
このへんで、挫折。
マイクロソフトの Q# チュートリアルとサンプル
Writing a Quantum Program - https://docs.microsoft.com/en-us/quantum/quickstart?view=qsharp-preview&tabs=tabid-vs2017
をやった。
ゲートの結果を表示させてみた。なるほど。
using (qubits = Qubit[1]) {
Message("|0>");
DumpRegister((), qubits);
Message("X");X(qubits[0]); DumpRegister((), qubits);X(qubits[0]);
// |+>
Message("H");H(qubits[0]); DumpRegister((), qubits); // もとに戻さない。
Message("Z");Z(qubits[0]); DumpRegister((), qubits);Z(qubits[0]);
Message("Y");Y(qubits[0]); DumpRegister((), qubits);Y(qubits[0]);
let res = M(qubits[0]);
Message($"M={res}"); DumpRegister((), qubits);
ResetAll(qubits);
}
結果
|0>
Ids: [0;]
Wavefunction:
0: 1 0 // |0> 基底の実部と虚部
1: 0 0 // 同じく、 |1>
X
Ids: [0;]
Wavefunction:
0: 0 0
1: 1 0
H
Ids: [0;]
Wavefunction:
0: 0.707107 0 // 1/√2
1: 0.707107 0
Z
Ids: [0;]
Wavefunction:
0: 0.707107 0
1: -0.707107 0
Y
Ids: [0;]
Wavefunction:
0: 0 -0.707107
1: 0 0.707107
M=One // 観測結果は、毎回違う。
Ids: [0;]
Wavefunction:
0: 0 0
1: 1 0
DumpRegister の説明は、以下にある。
https://docs.microsoft.com/ja-jp/quantum/techniques/testing-and-debugging
3: というのは、 |11> の振幅で、ただし、引数で与える qubit 配列の順とは限らないので、表示される Ids: [3;2;1;0;] の並びに注意とのこと。
QCQI Box 5.1 3 qubit 量子フーリエ変換
を、コーディングした。
operation qft3(qs: Qubit[]) : Unit {
// QCQI Box 5.1 Three qubits quantum Fourier transform
// 2, 0 を逆にしたら動いた。うーん。
H(qs[2]);// こっちが、 qs[0] だと思ってたのだが、結果が合わなかった。
Controlled S([qs[1]], qs[2]);
Controlled T([qs[0]], qs[2]);
H(qs[1]);
Controlled S([qs[0]], qs[1]);
H(qs[0]);
SWAP(qs[0], qs[2]);
}
周期4の状態を用意して、フーリエ変換する。
using (qs = Qubit[3]) {
Message("period:4");
H(qs[2]);
DumpRegister((), qs);
qft3(qs);
DumpRegister((), qs);
ResetAll(qs);
period:4
Ids: [2;1;0;]
Wavefunction:
0: 0.707107 0
1: 0 0
2: 0 0
3: 0 0
4: 0.707107 0
5: 0 0
6: 0 0
7: 0 0
Ids: [2;1;0;]
Wavefunction:
0: 0.5 0
1: 0 0
2: 0.5 0
3: 0 0
4: 0.5 0
5: 0 0
6: 0.5 0
7: 0 0
(5.19) の表を再現する。
for (i in 0..7) {
Message($"{i}");
let reg = LittleEndian(qs);
InPlaceXorLE(i, reg);
DumpRegister((), qs);
qft3(qs);
DumpRegister((), qs);
ResetAll(qs);
}
1
Ids: [2;1;0;]
Wavefunction:
0: 0 0
1: 1 0
2: 0 0
3: 0 0
4: 0 0
5: 0 0
6: 0 0
7: 0 0
Ids: [2;1;0;]
Wavefunction:
0: 0.353553 0
1: 0.25 0.25
2: 0 0.353553
3: -0.25 0.25
4: -0.353553 0
5: -0.25 -0.25
6: 0 -0.353553
7: 0.25 -0.25
ライブラリ関数もある。
let reg = LittleEndian(qs);
InPlaceXorLE(j, reg);
QFTLE(reg);
DumpRegister((), qs);
DumpRegister の表示で、注意点
Qubit は、実行のたびに id が変わるので、配列の最初のが、 id=0 とは限らない。
Qubit[] とか、ResetAll して作ったのものは、|0> 状態にあるが、
Wavefunction:
0: 1 0
1: 0 0
にならないことが多い。これは、グローバルな位相がかかっている。例えば、
0: 0.707107 -0.707107
これは、 exp(-iπ/4) がかかっている。ゲート操作してもずっとついてくる。
プログラムから操作可能なデータで返してくれると加工して位相を除いて表示することもできるのだが、ファイルだからめんどう。
IntegerFactorization
動かした。うまく行ったときの表示と、説明。
Factoring 15
15 の素因数分解をする。
Estimating period of 7
15までの乱数を1つ選んだ。これを、 r 乗して、 mod 15 が1になる数をオーダーと言って、それが素因数の候補のネタになる。
Estimated eigenvalue is 128/2^9.
量子フーリエ変換でオーダーを探す。周期推測したら、s/r=128/2^9 だった。
なお、中核の計算は、Microsoft.Quantum.Canon.QuantumPhaseEstimation にあって、このソースには出てこない。
128/2^9 == 128/512 == 1/4 で割り切れてしまったので、連分数展開するまでもなく、r は4.
Estimated divisor of period is 4, we have projected on eigenstate marked by 1.
これで、オーダーがわかった。7^4 % 15 = 1
あとは、gcd(7^r/2 -1, 15) と、gcd(7^r/2 +1, 15) を計算して、それが 15 を割るか、見る。
Factors are 5 and 3
当たり。
一桁増やして、27の素因数分解をさせたが、1時間たっても、当たらなかった。そういうものか。
いいえ。原理的に、このアルゴリズムではできない数だった。
21なら、すぐにできた。
C:\>dotnet bin\Debug\netcoreapp2.0\IntegerFactorization.dll 21
==========================================
Factoring 21
Estimating period of 19
Estimated eigenvalue is 341/2^11.
341 -1 -6
Estimated divisor of period is 6, we have projected on eigenstate marked by 1.
generator=19 ^ order=6 mod 21 == 1
halfPower=13 3 7
Factors are 7 and 3
341/2^11 を連分数展開すると、 341/2048 == 1/(6 + 1/(170 + 1/2))
候補は、 1/6, 1/(6 + 1/170) == 170/1021 と続くが、最初の 1/6
Database Search
本に合わせて、N=4, M=1 で、iteration=1 で動かす。当たりは、 |11> とする。
均等重ね合わせの後
Ids: [2;1;0;]
Wavefunction:
0: 0.5 0
1: 0 0
2: 0.5 0
3: 0 0
4: 0.5 0
5: 0 0
6: 0 0
7: 0.5 0
オラクルの後
Ids: [2;1;0;]
Wavefunction:
0: 0.5 0
1: 0 0
2: 0.5 0
3: 0 0
4: 0.5 0
5: 0 0
6: 0 0
7: -0.5 6.12323e-17、<=当たりにフェーズシフト
Ids: [2;1;0;]
Wavefunction:
0: 0 -3.06162e-17
1: 0 0
2: 0 -3.06162e-17
3: 0 0
4: 0 -3.06162e-17
5: 0 0
6: 0 0
7: -1 3.06162e-17 <=確定。
result=One database=One One
Quantum Katas - https://github.com/Microsoft/QuantumKatas チュートリアルの、 BasicGates をやった。
Q# クイックレファレンス - https://github.com/Microsoft/QuantumKatas/blob/master/quickref/qsharp-quick-reference.pdf は便利。
TODO: simple ising サンプルを理解する。
トラブルシュート
Visual Studio をアップデートしたら、新しいプロジェクトで、Visual C# の下に、 Q# Application などが出なくなった。open Microsoft.Quantum.Primitive がコンパイルエラーになった。
対策
ツール、拡張機能と更新プログラム、で、Quantum Development Kit をアンインストールして、最新版を入れたら、なおった。
Playing with IBM Qiskit
https://qiskit.org/documentation/ja/ に従う。Windows で行った。
C:\>python -m pip install --upgrade pip
Successfully installed pip-18.1
C:\>pip install qiskit
Collecting qiskit
Successfully installed asn1crypto-0.24.0 certifi-2018.11.29 cffi-1.11.5 chardet-3.0.4 cryptography-2.4.2 decorator-4.3.0 idna-2.8 jsonschema-2.6.0 marshmallow-2.17.0 marshmallow-polyfield-3.2 mpmath-1.1.0 networkx-2.2 ntlm-auth-1.2.0 numpy-1.15.4 pillow-5.3.0 ply-3.11 psutil-5.4.8 pycparser-2.19 qiskit-0.7.0 qiskit-aer-0.1.0 qiskit-terra-0.7.0 requests-2.21.0 requests-ntlm-1.1.0 scipy-1.2.0 six-1.12.0 sympy-1.3 urllib3-1.24.1
C:\>pip install jupyter
Collecting jupyter
Successfully installed MarkupSafe-1.1.0 Send2Trash-1.5.0 backcall-0.1.0 bleach-3.0.2 colorama-0.4.1 defusedxml-0.5.0 entrypoints-0.2.3 ipykernel-5.1.0 ipython-7.2.0 ipython-genutils-0.2.0 ipywidgets-7.4.2 jedi-0.13.2 jinja2-2.10 jupyter-1.0.0 jupyter-client-5.2.4 jupyter-console-6.0.0 jupyter-core-4.4.0 mistune-0.8.4 nbconvert-5.4.0 nbformat-4.4.0 notebook-5.7.4 pandocfilters-1.4.2 parso-0.3.1 pickleshare-0.7.5 prometheus-client-0.5.0 prompt-toolkit-2.0.7 pygments-2.3.1 python-dateutil-2.7.5 pywinpty-0.5.5 pyzmq-17.1.2 qtconsole-4.4.3 terminado-0.8.1 testpath-0.4.2 tornado-5.1.1 traitlets-4.3.2 wcwidth-0.1.7 webencodings-0.5.1 widgetsnbextension-3.4.2
notebook からグラフを書くには、これも必要。
C:\>pip install Matplotlib
Successfully installed Matplotlib-3.0.2 cycler-0.10.0 kiwisolver-1.0.1 pyparsing-2.3.0
チュートリアルは、 jupyter notebook 形式。ブラウザで見るんだ。
C:\Users\kanda_000\git>git clone https://github.com/Qiskit/qiskit-tutorials.git
C:\Users\kanda_000\git\qiskit-tutorials>jupyter notebook index.ipynb
の example を動かす。BasicAer にしないと、
ImportError: cannot import name 'Aer' from 'qiskit'
と言われた。
C:\Users\kanda_000>python qiskit-terra.py
C:\Program Files\Python37\lib\site-packages\marshmallow\schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended.
{'11': 527, '00': 497}
(Pdb) print(qc)
┌───┐ ┌─┐
q0_0: |0>┤ H ├──■─────┤M├
└───┘┌─┴─┐┌─┐└╥┘
q0_1: |0>─────┤ X ├┤M├─╫─
└───┘└╥┘ ║
c0_0: 0 ═══════════╬══╩═
║
c0_1: 0 ═══════════╩════
Getting Started with Qiskit を読む。|0> 状態を一つ、という最も簡単な回路を jupyter notebook で書く。
from qiskit import QuantumRegister, QuantumCircuit, BasicAer, execute
q = QuantumRegister(1)
qc = QuantumCircuit(q)
qc.iden(q[0])
backend = BasicAer.get_backend('statevector_simulator')
job = execute(qc, backend)
result = job.result()
outputstate = result.get_statevector(qc, decimals=2)
print(outputstate)
[1.+0.j 0.+0.j]
なるほど。0基底の実部と虚部、1基底の実部と虚部。
いろいろグラフを書いてみる。 iplot 関数を使うと、対話的にぐりぐり動いて楽しい。
from qiskit.tools.visualization import iplot_state_qsphere, iplot_state_city, iplot_state_paulivec
iplot_state_qsphere(outputstate)
iplot_state_city(outputstate)
iplot_state_paulivec(outputstate)
ゲートの結果を statevector で見る。Q# でも似たことをやった。
from qiskit import QuantumRegister, QuantumCircuit, BasicAer, execute
def applyGate(q, i):
if i == 0:
print("0", end=":")
qc.iden(q)
elif i == 1:
print("X", end=":")
qc.x(q)
elif i == 2:
print("H", end=":")
qc.h(q)
elif i == 3:
print("Z", end=":")
qc.h(q)
qc.z(q)
elif i == 4:
print("Y", end=":")
qc.h(q)
qc.y(q)
for i in range(15):
q = QuantumRegister(3)
qc = QuantumCircuit(q)
if i < 5:
applyGate(q[0], i)
elif i < 10:
applyGate(q[1], i - 5)
else:
applyGate(q[2], i - 10)
backend = BasicAer.get_backend('statevector_simulator')
job = execute(qc, backend)
result = job.result()
outputstate = result.get_statevector(qc, decimals=1)
print(outputstate)
結果
0:[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
X:[0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
H:[0.7+0.j 0.7+0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j]
Z:[ 0.7+0.j -0.7+0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j]
Y:[0.-0.7j 0.+0.7j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j ]
// ここまでは、期待通りなのだが、
0:[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
X:[0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
H:[0.7+0.j 0. +0.j 0.7+0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j]
Z:[ 0.7+0.j 0. +0.j -0.7+0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j]
Y:[0.-0.7j 0.+0.j 0.+0.7j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j ]
0:[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
X:[0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j]
H:[0.7+0.j 0. +0.j 0. +0.j 0. +0.j 0.7+0.j 0. +0.j 0. +0.j 0. +0.j]
Z:[ 0.7+0.j 0. +0.j 0. +0.j 0. +0.j -0.7+0.j 0. +0.j 0. +0.j 0. +0.j]
Y:[0.-0.7j 0.+0.j 0.+0.j 0.+0.j 0.+0.7j 0.+0.j 0.+0.j 0.+0.j ]
// state vector の並びは、ある qubit の0基底の振幅、1基底、次の qubit の0基底、1基底、ではないらしい。
そもそも、get_statevector は、回路全体のメソッドなので、 qubit の出現順なんて見えない。
量子フーリエ変換のサンプルを動かす
C:\Users\kanda_000\git\qiskit-terra\examples\python>python qft.py
┌───┐┌─────────────┐ ░ ┌───┐»
q_0: |0>────────────────────────────────────────┤ H ├┤ U1(-3.1416) ├─░─┤ H ├»
┌───┐┌─────────────┐└───┘└─────────────┘ ░ └───┘»
q_1: |0>────────────────────┤ H ├┤ U1(-1.5708) ├─────────────────────░──────»
┌───┐┌─────────────┐└───┘└─────────────┘ ░ »
q_2: |0>┤ H ├┤ U1(-0.7854) ├─────────────────────────────────────────░──────»
└───┘└─────────────┘ ░ »
c_0: 0 ════════════════════════════════════════════════════════════════════»
»
c_1: 0 ════════════════════════════════════════════════════════════════════»
»
c_2: 0 ════════════════════════════════════════════════════════════════════»
»
« ░ ┌─┐
«q_0: ─■────────■───────────────────────────░───────┤M├
« │1.5708 │ ┌───┐ ░ ┌─┐└╥┘
«q_1: ─■────────┼───────┤ H ├─■─────────────░────┤M├─╫─
« │0.7854 └───┘ │1.5708 ┌───┐ ░ ┌─┐└╥┘ ║
«q_2: ──────────■─────────────■───────┤ H ├─░─┤M├─╫──╫─
« └───┘ ░ └╥┘ ║ ║
«c_0: ═════════════════════════════════════════╬══╬══╩═
« ║ ║
«c_1: ═════════════════════════════════════════╬══╩════
« ║
«c_2: ═════════════════════════════════════════╩═══════
«
Qasm simulator
{'001': 1024}
周期1が出れば、正解らしい。
input_state を、circ.h(q[0]) に代える。結果は、
{'110': 250, '010': 251, '100': 266, '000': 257}
circ.h(q[1]) は?
{'011': 141, '111': 116, '101': 139, '000': 254, '001': 112, '100': 262}
正しい結果なのだろうか。
量子テレポートのサンプル
C:\Users\kanda_000\git\qiskit-terra\examples\python>python teleport.py
┌─────────────────┐ ░ ┌───┐┌─┐ ░
q_0: |0>──────────┤ U3(0.3,0.2,0.1) ├─░───■─────┤ H ├┤M├─░──────────────────
┌───┐ └─────────────────┘ ░ ┌─┴─┐┌─┐└───┘└╥┘ ░
q_1: |0>┤ H ├──■──────────────────────░─┤ X ├┤M├──────╫──░──────────────────
└───┘┌─┴─┐ ░ └───┘└╥┘ ║ ░ ┌─────┐┌─────┐┌─┐
q_2: |0>─────┤ X ├────────────────────░───────╫───────╫──░─┤ Z ├┤ X ├┤M├
└───┘ ░ ║ ║ ░ ├──┴──┤└──┬──┘└╥┘
c0_0: 0 ══════════════════════════════════════╬═══════╩════╡ = 1 ╞═══╪════╬═
║ └─────┘┌──┴──┐ ║
c1_0: 0 ══════════════════════════════════════╩═══════════════════╡ = 1 ╞═╬═
└─────┘ ║
c2_0: 0 ══════════════════════════════════════════════════════════════════╩═
{'1 1 1': 3, '1 1 0': 5, '0 0 1': 269, '0 0 0': 232, '0 1 0': 246, '1 0 0': 2, '0 1 1': 262, '1 0 1': 5}
変だな。q0 が q2 に等しくなるから、テレポートなのだよね。'0 0 1': 269 という get_counts 結果は、c0==0, c2==1 が、1/4の確率で発生したと言っているわけでしょう。外れてるよね。
なお、u3 とは、https://qiskit.org/documentation/summary_of_quantum_operations.html#single-qubit-quantum-states に説明がある、3引数の一般的ユニタリー演算。
トラブルシュート
現象
前記、iplot_state_qsphere 対話的関数が、 import できない。
原因
インターネット接続してないと、ダメ。qiskit\tools\visualization\ __init__.py に、qvisualization.mybluemix.net への接続確認がある。なんでかわからん。
Hadamard test and phase kickback
大事なので計算を追う。
https://github.com/keisukefujii/CQInterface2019/blob/master/sympy_intro_CQinterface.ipynb
アダマールテストと位相推定
量子コンピュータの基礎と物理との接点
5.2 アダマールテスト
|0>-H-+-H-Measure
|
|ψ>---U-----
1つ目の H の後。 1/√2 (|0> + |1>) |ψ>
controlled U の後。1/√2 (|0> + |1>U) |ψ>
2つ目の H の後。1/√2 (|+> + |->U) |ψ> == 1/√2 (1/√2 (|0> + |1>) + 1/√2 (|0> - |1>) U) |ψ> == (1+U)/2|0> |ψ> + (1-U)/2|1>|ψ>
なので、補助ビットの測定に、U の固有値が現れる。
(98) 測定結果0を得る確率 p0 = || (I + U) /2 |ψ>|| == <ψ| (I + U)† /2 (I + U) /2 |ψ> == 1/4<ψ|(I + ReU - i ImU)(I + ReU + i ImU)|ψ> ==
1/4(1 + 2ReU + ReU^2 + ImU^2) ユニタリなので、うしろ2つは1になるので == 1/2(1 + Re<ψ|U|ψ>) (99)
以上