common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

中性原子量子シミュレータBloqade.jlをみてみる。その6。量子多体スカー(傷跡)状態。

Yuichiro Minato

2022/10/31 13:23

熱平衡に至らず動的な運動を続ける量子多体スカーと呼ばれる状態についてbloqade.jlからリュードベリ原子を使った現象を確認します。

参考

https://queracomputing.github.io/Bloqade.jl/dev/tutorials/3.quantum-scar/main/

今回は5.72マイクロメートル間隔で9量子ビット見ます。

nsites = 9
atoms = generate_sites(ChainLattice(), nsites, scale = 5.72)

初期状態は以前にみた、反強磁性の秩序状態であるNeel状態を実現するため、時間発展を実装しています。こちらは、オメガを一定にかけ、Δは線形で増加させます。

Δ1 = piecewise_linear(clocks = [0.0, 0.3, 1.6, 2.2], values = 2π * [-10.0, -10.0, 10.0, 10.0]);
Ω1 = piecewise_linear(clocks = [0.0, 0.05, 1.6, 2.2], values = 2π * [0.0, 4.0, 4.0, 0.0]);

そして、そのNeel状態からオメガを一定値、デルタを0にしてスカー状態を実現します。

Ω2 = constant(duration = 2.0, value = 2 * 2π);
Δ2 = constant(duration = 2.0, value = 0);

Ω_tot = append(Ω1, Ω2);
Δ_tot = append(Δ1, Δ2);

fig, (ax1, ax2) = plt.subplots(ncols = 2, figsize = (12, 4))
Bloqade.plot!(ax1, Ω_tot)
Bloqade.plot!(ax2, Δ_tot)
ax1.set_ylabel("Ω/2π (MHz)")
ax2.set_ylabel("Δ/2π (MHz)")
fig

パラメータの変化具合はこの通りです。

前半部分はNeel状態を作るために、デルタをマイナスにおいて基底状態からスタートし、リュードベリブロッケードを使ってNeel状態を実現します。

その後、オメガを再度2.0に固定し、逆にデルタは0にしてリュードベリ状態の任意の操作を解除して、スカー状態を実現させます。

h = rydberg_h(atoms; Δ = Δ_tot, Ω = Ω_tot)

早速量子シミュレーションですが、基底状態からスタートします。

reg = zero_state(nsites);

ODEソルバーというのを使うらしいです。

total_time = 4.2;
prob = SchrodingerProblem(reg, total_time, h);
integrator = init(prob, Vern8());

ここでは、量子ビットの値の期待値と、量子もつれを図るためのエンタングルメントエントロピーを見ます。

entropy = Float64[]
densities = []
for _ in TimeChoiceIterator(integrator, 0.0:1e-3:total_time)
push!(densities, rydberg_density(reg))
rho = density_matrix(reg, (1, 2, 3, 4, 5)) # calculate the reduced density matrix
push!(entropy, von_neumann_entropy(rho)) # compute entropy from the reduced density matrix
end

結果を見てみると、

clocks = 0:1e-3:total_time
D = hcat(densities...)

fig, ax = plt.subplots(figsize = (10, 4))
shw = ax.imshow(real(D), interpolation = "nearest", aspect = "auto", extent = [0, total_time, 0.5, nsites + 0.5])
ax.set_xlabel("time (μs)")
ax.set_ylabel("site")
ax.set_xticks(0:0.4:total_time)
ax.set_yticks(1:nsites)
bar = fig.colorbar(shw)
fig

2.2マイクロ秒まではNeel状態をつくり、2.2マイクロ秒以降はスカー状態が実現されています。次に量子もつれの度合いを示すエンタングルメントエントロピーを見ます。

fig, ax = plt.subplots(figsize = (10, 4))
ax.plot(clocks, entropy)
ax.set_xlabel("time (μs)")
ax.set_ylabel("entanglement entropy")
fig

ネール状態では、もつれは一定を示し、その後スカー状態ではエンタングルメントエントロピーが増大しているのが見えます。

チュートリアルでは、最後に初期状態を変化させ、クリロフ時間発展で量子状態を見ていました。

hd = rydberg_h(atoms; Ω = 4π)
total_time = 1.2;
clocks = 0.0:1e-2:total_time;

init_d = product_state(bit"100000101")
prob_d = KrylovEvolution(init_d, clocks, hd)
density_mat_d = zeros(nsites, length(clocks))

for info in prob_d
for i in 1:nsites
density_mat_d[i, info.step] = rydberg_density(info.reg, i)
end
end

fig, ax = plt.subplots(figsize = (10, 4))
shw = ax.imshow(
real(density_mat_d),
interpolation = "nearest",
aspect = "auto",
extent = [0, total_time, 0.5, nsites + 0.5],
)
ax.set_xlabel("time (μs)")
ax.set_ylabel("site")
ax.set_xticks(0:0.2:total_time)
ax.set_yticks(1:nsites)
bar = fig.colorbar(shw)
fig

リュードベリブロッケードによる複雑な量子状態が見て取れます。面白いですね。。。以上です。

© 2025, blueqat Inc. All rights reserved