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

NVIDIA CUDA-Qの Dynamicsのevolve API による量子ダイナミクス、時間発展シミュレーションのGPU実行

Yuichiro Minato

2025/04/05 03:59

今回はCUDA-Qで量子時間発展のAPIを紹介します。

https://nvidia.github.io/cuda-quantum/latest/using/backends/dynamics.html#

量子力学では、ある量子状態が時間とともにどのように変化するかを「時間発展(Time Evolution)」と呼びます。これは、量子系の本質的な性質を理解するための基本的な手法です。

具体的には、ある時点の状態 |\psi(0\rangle が、ハミルトニアンHの下でどのように|\psi(t)\rangleに進化するかを知りたいという問題です。
これは以下のような式で表されます:

|\psi(t)\rangle = e^{-iHt}|\psi(0)\rangle

この式は量子力学の時間発展を計算する基本になります。
ここでは、CUDA-Qの例題の一つを紹介して使い方を確認します。

例題:超伝導トランズモン量子ビットのモデル化

超伝導トランズモン量子ビットは下記のハミルトニアンでモデル化されます。

H = \frac{\omega_z}{2} \sigma_z + \omega_x cos(\omega_d t)\sigma_x

まずはこちらをCUDA-Qで扱える形に落とし込みます。
ScalarOperatorを利用すると時間tを扱えるように。
パラメータ類はチュートリアルになかったのでChatGPTに作ってもらいました。

import numpy as np
from cudaq.operator import *

# 各パラメータ(周波数)を定義(単位:任意、たとえば GHz)
omega_z = 1.0  # Z方向のエネルギースケール
omega_x = 0.6  # 駆動の強さ
omega_d = 1.0  # 駆動周波数

# ハミルトニアンの定義
hamiltonian = 0.5 * omega_z * spin.z(0)
hamiltonian += omega_x * ScalarOperator(lambda t: np.cos(omega_d * t)) * spin.x(0)

早速計算します。
スケジュール類はなかったのでChatGPTに作ってもらいました。

import cudaq
import cupy as cp
import time 

# シミュレーションの時間範囲と分割数を定義
t_final = 10.0       # シミュレーション終了時間(たとえば10秒、単位は任意)
n_steps = 100        # ステップ数(何回測定/計算するか)

# ダイナミックシュミレーターにバックエンドを指定
cudaq.set_target("dynamics")

# Dimensions of sub-systems: a single two-level system.
dimensions = {0: 2}

# Initial state of the system (ground state).
rho0 = cudaq.State.from_data(
    cp.array([[1.0, 0.0], [0.0, 0.0]], dtype=cp.complex128))

# Schedule of time steps.
steps = np.linspace(0, t_final, n_steps)
schedule = Schedule(steps, ["t"])

# evolve() の前後で時間を記録
start_time = time.time()

# 時間発展の実行
evolution_result = evolve(hamiltonian,
                          dimensions,
                          schedule,
                          rho0,
                          observables=[spin.x(0),
                                       spin.y(0),
                                       spin.z(0)],
                          collapse_operators=[],
                          store_intermediate_results=True)

end_time = time.time()

# 結果を表示
print(f"シミュレーション実行時間: {end_time - start_time:.4f} 秒")

シミュレーション実行時間: 2.9713 秒

最後に結果の描画です。

import matplotlib.pyplot as plt

get_result = lambda idx, res: [
    exp_vals[idx].expectation() for exp_vals in res.expectation_values()
]

plt.plot(steps, get_result(0, evolution_result))
plt.plot(steps, get_result(1, evolution_result))
plt.plot(steps, get_result(2, evolution_result))
plt.ylabel("Expectation value")
plt.xlabel("Time")
plt.legend(("Sigma-X", "Sigma-Y", "Sigma-Z"))

image

このように時間発展を時間ごとに分析することができました。研究とかで利用する機会もありそうです。

© 2025, blueqat Inc. All rights reserved