熱平衡に至らず動的な運動を続ける量子多体スカーと呼ばれる状態について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
リュードベリブロッケードによる複雑な量子状態が見て取れます。面白いですね。。。以上です。