Adiabatic Evolution
断熱発展
今回はQuEraのbloqade.jlをみて、断熱時間発展を見てみます。
断熱時間発展は、時間でハミルトニアンを変化させて量子のシミュレーションができます。
https://queracomputing.github.io/Bloqade.jl/dev/tutorials/2.adiabatic/main/
・離調でリュードベリ原子を基底状態に持っていける。 Δに大きなマイナスの値。
・Ωを調整して、Δを大きなマイナスからプラスに持っていく。
・そうすると基底状態付近を維持したままハミルトニアンの基底状態を取る 量子アニーリングやQAOAなどの理論。
簡単に言うと、まずはデルタをマイナスにして全部の量子ビットを0状態に持っていき、そっからオメガで横磁場を強くして徐々にデルタも大きくしていくという感じのようです。
using Bloqade
using PythonCall
using KrylovKit
using SparseArrays
plt = pyimport("matplotlib.pyplot");
nsites = 9
atoms = generate_sites(ChainLattice(), nsites, scale = 5.72)
9量子ビットと量子ビット間 の距離を決めている。 Julia なので配列は1からスタート
オメガを固定し、デルタを時間ごとに少しずつ変化させます。
Ω = 2π * 4
Δ_step = 30
Δ = LinRange(-2π * 10, 2π * 10, Δ_step);
density_g = zeros(Δ_step, nsites)
for ii in 1:Δ_step
h_ii = rydberg_h(atoms; Δ = Δ[ii], Ω) # create the Rydberg Hamiltonian
h_m = mat(h_ii) # convert the Hamiltonian into a matrix
vals, vecs, info = KrylovKit.eigsolve(h_m, 1, :SR) # find the ground state eigenvalue and eigenvector
g_state = ArrayReg(vecs[1]) # creates the initial state with all atoms in ``| 0 \rangle`` state
for jj in 1:nsites
density_g[ii, jj] = rydberg_density(g_state, jj) # measure the density of Rydberg excitations on each site
end
end
まずはデルタが負の時の値のプロットを見てみます。
fig, ax = plt.subplots(figsize = (10, 4))
ax.bar(1:nsites, density_g[1, :])
ax.set_xticks(1:nsites)
ax.set_xlabel("Sites")
ax.set_ylabel("Rydberg density")
ax.set_title("Density Profile: 1D Chain, Δ = -2π * 10 MHz")
fig
上から二行目で初期状態を選んでいるのがわかります。また、デルタは負の値を取ります。
横軸は量子ビットを表しています。縦軸は1が出る確率を表しています。ほぼすべての量子ビットで同じような分布になっています。
次に最終的な時間発展後の状態を見てみます。二行目で最終状態を取っているのがわかります。
fig, ax = plt.subplots(figsize = (10, 4))
ax.bar(1:nsites, density_g[30, :])
ax.set_xticks(1:nsites)
ax.set_xlabel("Sites")
ax.set_ylabel("Rydberg density")
ax.set_title("Density Profile: 1D Chain, Δ = 2π * 10 MHz")
fig
デルタの値が最終的に正の値の時の分布をみると、
交互になりました。横軸が量子ビットで、それぞれ1,3,5,7,9の量子ビットの1になる確率が大幅に上がってほぼ1になっています。リュードベリブロッケードが働いて交互のパターンになりました。
order_para = map(1:Δ_step) do ii
return sum(density_g[ii, 1:2:nsites]) - sum(density_g[ii, 2:2:nsites])
end
fig, ax = plt.subplots(figsize = (10, 4))
ax.plot(Δ / 2π, order_para)
ax.set_xlabel("Δ/2π (MHz) ")
ax.set_ylabel("Order parameter")
fig
今回はオメガは固定でしたので、Δの変化による1になる量子ビットの個数の遷移は下記のようになりました。
とりえあずオメガ固定でしたが次はオメガとデルタの時間変化についても見てみたいと思います。