⚛️

Bloqade入門 - 中性原子量子コンピュータをPythonで触ってみよう

に公開

はじめに

「中性原子量子コンピュータ?なにそれ美味しいの?」

そう思った方、正常です。量子コンピュータといえば「IBM」「Google」の超伝導方式が有名ですが、実は今、中性原子方式がめちゃくちゃ熱いんです。

この記事では、ストロンチウム原子が大好きな著者が、

  • そもそも中性原子って何がすごいの?
  • 実際にPythonで動かすにはどうするの?
  • 何ができるの?

を、できるだけ噛み砕いて解説します。


第1章: そもそも中性原子量子コンピュータって?

量子コンピュータの「方式」いろいろ

量子コンピュータって、実は作り方がいくつかあります。

方式 代表的なプレイヤー 量子ビットの正体
超伝導 IBM, Google 超伝導回路
イオントラップ IonQ, Quantinuum イオン(電荷を持った原子)
中性原子 QuEra, Pasqal, Atom Computing, Yaqmo 中性原子(ルビジウム、ストロンチウムなど)
Xanadu, PsiQuantum 光子

「どれが一番いいの?」と聞かれると、正直まだ決着がついていません。それぞれに長所と短所があります。

中性原子方式の「ここがすごい」

じゃあなぜ中性原子が注目されているのか。ざっくり3つあります。

1. めっちゃスケールしやすい

超伝導方式は、量子ビットを増やすのが大変です。配線が増え、冷却も大変になる。

一方、中性原子は光ピンセット(レーザーで原子をつまむ技術)を使って原子を並べます。原子を増やしたければ、光ピンセットを増やせばいい。比較的シンプルです。

QuEraは2024年に256量子ビット、2026年には10,000量子ビットを目指すと発表しています。このスケーラビリティが中性原子の強みです。

2. コヒーレンス時間が長い

「コヒーレンス時間」とは、量子ビットが量子状態を保てる時間のこと。これが短いと、計算の途中でエラーが起きます。

中性原子は環境から孤立しやすい(電荷を持たないので電磁ノイズの影響を受けにくい)ため、コヒーレンス時間が長い傾向にあります。

3. 原子を「動かせる」

これが地味にすごい。中性原子は光ピンセットで計算の途中で原子の配置を変えられます

これにより、遠くの量子ビット同士を隣り合わせにして相互作用させることができます。超伝導方式では配線が固定されているので、こういう芸当は難しい。

「で、どうやって計算してるの?」

超シンプルに言うと:

1. レーザーで原子を「つまんで」並べる
2. 別のレーザーで原子の状態を操作する
3. 最後に原子の状態を「測定」して答えを読み取る

これだけです。

もうちょっと詳しく言うと、原子の「基底状態」と「リュードベリ状態」という2つの状態を使います。この2つが量子ビットの「0」と「1」に対応します。

基底状態 |g⟩ → 量子ビットの「0」
リュードベリ状態 |r⟩ → 量子ビットの「1」

リュードベリ状態というのは、電子が原子核からめちゃくちゃ遠くにいる状態。この状態の原子同士は強く相互作用します。これを使って量子ゲートを実現しています。

超伝導・イオントラップとの比較

もう少し具体的に比較してみましょう。

項目 超伝導 イオントラップ 中性原子
動作温度 極低温(10mK) 室温〜低温 極低温(μK)
スケーラビリティ △ 配線が課題 △ イオン数に限界 ◎ 光で制御
コヒーレンス時間 △ 短い ◎ 長い ○ 長い
ゲート速度 ◎ 速い △ 遅い ○ 中程度
接続性 △ 近接のみ ◎ 全対全 ◎ 再配置可能
成熟度 ◎ 進んでいる ○ 進んでいる △ 発展途上

「じゃあ中性原子が最強じゃん!」と言いたいところですが、まだ発展途上なのも事実。でも逆に言えば、今この分野に入ると最先端を体験できるということでもあります。


第2章: Bloqadeを動かす準備

Bloqadeとは

Bloqade(ブロッケード)は、QuEra Computing社が開発した中性原子量子コンピュータ用のPython SDKです。

名前の由来は「Rydberg Blockade(リュードベリ封鎖)」という現象から。近くにいるリュードベリ原子同士が相互作用して、両方同時にリュードベリ状態になれなくなる現象です。これが中性原子量子コンピュータの計算の鍵になります。

Bloqadeを使うと:

  • 原子の配置を定義できる
  • レーザーパルスを設計できる
  • ローカルでシミュレーションできる
  • 実機(QuEra Aquila)にジョブを投げられる

インストール

めちゃくちゃ簡単。ターミナルで:

pip install bloqade

これだけ。

確認してみましょう:

import bloqade
print(bloqade.__version__)

バージョンが表示されればOKです。

最初のプログラム:原子を3つ並べる

さっそく動かしてみましょう。まずは原子を一直線に3つ並べてみます。

from bloqade.analog.atom_arrangement import Chain

# 原子を3つ、間隔6μmで一直線に並べる
geometry = Chain(3, lattice_spacing=6.0)

# 配置を可視化
geometry.show()

実行すると、3つの点が横一列に並んだ図が表示されるはずです。

これが「原子を並べた」ということです。

実際の実験では、この配置通りにレーザーの光ピンセットが原子をトラップします。

いろんな配置を試してみよう

from bloqade.analog.atom_arrangement import Chain, Square, Honeycomb

# 1次元:鎖状
chain = Chain(5, lattice_spacing=6.0)

# 2次元:正方格子
square = Square(3, lattice_spacing=6.0)  # 3x3 = 9原子

# 2次元:ハニカム(蜂の巣)格子
honeycomb = Honeycomb(2, lattice_spacing=6.0)

# それぞれ表示
chain.show()
square.show()
honeycomb.show()

実行すると、このような配置が表示されます:

原子配置の例

なぜこんなにいろんな配置が用意されているかというと、問題によって最適な配置が違うからです。

例えば、ある種の最適化問題は正方格子で解きやすく、別の問題はハニカム格子が向いている、といった具合です。


第3章: 原子を操作する - パルス制御の基礎

ここからが本番です。並べた原子をレーザーで操作していきます。

2つの重要なパラメータ

中性原子を操作するレーザーには、主に2つの重要なパラメータがあります。

Ω(オメガ):ラビ周波数

原子の状態を「回転」させる強さ。大きいほど速く状態が変わります。

イメージとしては、量子ビットの状態をブロッホ球上で回転させるハンドルの回し具合、みたいな感じ。

Δ(デルタ):デチューニング

レーザーの周波数を、原子の共鳴周波数からどれだけ「ずらす」か。

これをうまく調整すると、原子を特定の状態に持っていきやすくなります。

最初のパルス:原子を励起してみる

では、実際にパルスを組んでみましょう。

from bloqade import start
from bloqade.analog.atom_arrangement import Chain

# 原子を3つ並べる
program = (
    Chain(3, lattice_spacing=6.0)
    .rydberg.rabi.amplitude.uniform
    .piecewise_linear(
        durations=[0.1, 1.0, 0.1],  # 時間 [μs]
        values=[0, 15, 15, 0]        # Ω [rad/μs]
    )
)

# プログラムの中身を確認
program.show()

このプログラムは:

  1. 0.1μsかけてΩを0→15に上げる(立ち上げ)
  2. 1.0μsの間Ω=15を維持(操作)
  3. 0.1μsかけてΩを15→0に下げる(立ち下げ)

という時間発展を定義しています。

シミュレーションを実行する

# エミュレータでシミュレーション
result = program.bloqade.python().run(shots=1000)

# 結果を見る
counts = result.report().counts()
print(counts)

shots=1000は「1000回測定を繰り返す」という意味。量子力学は確率的なので、1回の測定では結果が毎回違います。たくさん測定して統計を取ります。

実際に実行すると、このような結果が得られます:

シミュレーション結果 (1000 shots):
  rgr: 453
  rrr: 229
  grr: 153
  rrg: 128
  grg: 37
  • g = 基底状態(|0⟩)
  • r = リュードベリ状態(|1⟩)

3つの原子がそれぞれどの状態になったかを表しています。rgrが最も多いのは、リュードベリ封鎖の効果で両端の原子がリュードベリ状態になりやすいためです。


第4章: リュードベリ封鎖を体験する

ここが中性原子量子コンピュータのキモです。

リュードベリ封鎖(Rydberg Blockade)とは

リュードベリ状態の原子同士は、強く相互作用します。この相互作用が強すぎると、近くにいる原子が同時にリュードベリ状態になれなくなります

これが「リュードベリ封鎖」です。

図で描くとこんな感じ:

許可される状態:
|g⟩ |g⟩  → OK
|g⟩ |r⟩  → OK
|r⟩ |g⟩  → OK

禁止される状態(近い原子同士):
|r⟩ |r⟩  → NG!エネルギー的に不利

封鎖を観察してみよう

原子間の距離を変えて、封鎖の効果を見てみましょう。

from bloqade import start
from bloqade.analog.atom_arrangement import Chain
import matplotlib.pyplot as plt

# 原子間距離が近い場合(封鎖が効く)
close_program = (
    Chain(2, lattice_spacing=5.0)  # 5μm間隔
    .rydberg.rabi.amplitude.uniform
    .piecewise_linear([0.1, 1.0, 0.1], [0, 15, 15, 0])
)

# 原子間距離が遠い場合(封鎖が効かない)
far_program = (
    Chain(2, lattice_spacing=15.0)  # 15μm間隔
    .rydberg.rabi.amplitude.uniform
    .piecewise_linear([0.1, 1.0, 0.1], [0, 15, 15, 0])
)

# シミュレーション実行
close_result = close_program.bloqade.python().run(shots=1000)
far_result = far_program.bloqade.python().run(shots=1000)

print("=== 近い場合(5μm)===")
print(close_result.report().counts())

print("\n=== 遠い場合(15μm)===")
print(far_result.report().counts())

実行結果を見てみましょう:

=== 近い場合(5μm)- 封鎖あり ===
  rr: 368
  rg: 331
  gr: 301

=== 遠い場合(15μm)- 封鎖なし ===
  gg: 725
  gr: 125
  rg: 122
  rr: 28

リュードベリ封鎖の比較

近い場合は封鎖が効いて、gg状態がほとんど出ず、原子同士が強く相互作用しています。遠い場合は封鎖が弱まり、独立した振る舞いを見せます。

これがリュードベリ封鎖の効果です!


第5章: 組合せ最適化問題を解く - MIS問題

さて、ここまでの知識を使って、実際に「役に立つ」計算をしてみましょう。

最大独立集合問題(MIS)とは

グラフがあるとき、「隣り合わない頂点をできるだけ多く選ぶ」問題です。

例:
○ー○ー○ー○

最大独立集合 = {1番目, 3番目} または {2番目, 4番目}
(隣り合う頂点は同時に選べない)

これ、NP困難問題として知られていて、古典コンピュータでは頂点数が増えると急激に難しくなります。

なぜ中性原子で解けるのか

ここで思い出してください。リュードベリ封鎖

  • リュードベリ状態 |r⟩ = 「選んだ」
  • 基底状態 |g⟩ = 「選ばなかった」
  • 近くの原子が同時に |r⟩ になれない = 「隣り合う頂点を同時に選べない」

つまり、グラフの頂点を原子で表現して、辺でつながった頂点同士を封鎖半径内に配置すれば、物理法則が自動的にMIS問題の制約を満たしてくれるのです。

実際に解いてみる

from bloqade.analog.atom_arrangement import Square
from bloqade import start

# 3x3の正方格子を作る
geometry = Square(3, lattice_spacing=6.5)

# パルスプログラムを組む
program = (
    geometry
    .rydberg.rabi.amplitude.uniform
    .piecewise_linear([0.3, 2.0, 0.3], [0, 15, 15, 0])
    .detuning.uniform
    .piecewise_linear([0.3, 2.0, 0.3], [-10, -10, 10, 10])
)

# シミュレーション
result = program.bloqade.python().run(shots=1000)

# 結果
counts = result.report().counts()

# 上位5つを表示
sorted_counts = sorted(counts.items(), key=lambda x: x[1], reverse=True)
print("=== 出現頻度の高い状態 ===")
for state, count in sorted_counts[:5]:
    num_excited = state.count('r')
    print(f"{state}: {count}回 (リュードベリ原子数: {num_excited})")

実行結果:

=== 出現頻度の高い状態 ===
  grgrrrgrg: 508回 (リュードベリ原子数: 5)
  grgrrrgrr: 51回 (リュードベリ原子数: 6)
  grgrrrrrg: 51回 (リュードベリ原子数: 6)
  grrrrggrr: 42回 (リュードベリ原子数: 6)
  grrrrrgrg: 41回 (リュードベリ原子数: 6)

MIS問題の結果

最も頻出したgrgrrrgrg(5つのリュードベリ原子)は、3x3格子上で隣り合う原子が同時にリュードベリ状態になっていないという制約を満たしています。これがMIS問題の解(の候補)になります。


第6章: 実機に接続する(発展編)

ここまではローカルのシミュレータで動かしてきましたが、Bloqadeは本物の量子コンピュータにもジョブを投げられます。

QuEra Aquila

QuEraが提供している中性原子量子コンピュータ「Aquila」は、AWS Braketを通じてアクセスできます。

# AWS Braket経由でAquilaに接続
from bloqade import start
from bloqade.analog.atom_arrangement import Chain

program = (
    Chain(5, lattice_spacing=6.0)
    .rydberg.rabi.amplitude.uniform
    .piecewise_linear([0.1, 1.0, 0.1], [0, 15, 15, 0])
)

# 実機に投げる(要AWSアカウント)
# result = program.braket.aquila().run(shots=100)

シミュレータ vs 実機

項目 シミュレータ 実機(Aquila)
速度 原子数が増えると遅い 一定
ノイズ なし(理想的) あり(現実的)
コスト 無料 有料
原子数上限 PCスペック依存 256量子ビット

まずはシミュレータで十分に検証してから、実機を試すのがおすすめです。


おわりに

この記事で学んだこと

  1. 中性原子量子コンピュータの仕組みと特徴
  2. Bloqadeのインストールと基本操作
  3. 原子配置の定義方法
  4. パルス制御でリュードベリ状態への励起
  5. リュードベリ封鎖の物理と観察
  6. MIS問題への応用

中性原子量子コンピュータの未来

2026年現在、中性原子方式は急速に進化しています。

  • QuEraは誤り訂正のデモンストレーションに成功
  • Pasqalは1000量子ビットを目指したロードマップを発表
  • 日本でも理研や各大学、Yaqmoなどのスタートアップで研究開発が進んでいる

原子種もルビジウムだけでなく、ストロンチウムやイッテルビウムなど2電子系原子を使った研究も活発化しています。2電子系は光時計遷移を活用した長コヒーレンス時間や、核スピンを使った量子メモリなど、新しい可能性を秘めています。

超伝導方式と並んで、量子コンピュータの本命候補として注目されています。

もっと学びたい人へ


GitHubで編集を提案

Discussion