common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Desktop RAG

Overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

NVIDIA cuQuantum / cuTensorNet + Google Cirq で状態ベクトルの求め方

Yuichiro Minato

2022/11/13 01:21

こんにちは、NVIDIA製の新しいシミュレータを頑張って使います。cuTensorNetは新しい技術ですのでほとんど資料がないため探すのが大変かと思います。本日はcuTensorNetから状態ベクトルを求める方法をGoogle Cirqを使ってみてみます。

参考:

Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES

SPDX-License-Identifier: BSD-3-Clause

https://github.com/NVIDIA/cuQuantum/blob/main/python/samples/cutensornet/circuit_converter/cirq_basic.ipynb

最初にツールを読み込みます。不足している分はインストールしてください。

import cirq
from cirq.testing import random_circuit
import cupy as cp
import numpy as np

from cuquantum import contract, CircuitToEinsum

今回は10量子ビットのランダム回路を実行してみます。Google Cirqにのっとって作ってみます。

num_qubits = 10
n_moments = 6
op_density = 0.9
gate_domain = {cirq.H: 1, 
        cirq.S: 1, 
        cirq.T: 1, 
        cirq.CNOT: 2, 
        cirq.CZ: 2}

circuit = random_circuit(num_qubits, n_moments, op_density=op_density, gate_domain=gate_domain, random_state=6)
print(circuit)

こちらをテンソルネットワークに変換しますが、関数が用意されていました。

myconverter = CircuitToEinsum(circuit, dtype='complex128', backend=cp)

expression, operands = myconverter.state_vector()
sv = contract(expression, *operands)
sv.reshape(1, 2**num_qubits)

最終的にはEinsum形式で複素数を記述したものを状態ベクトルに変換します。

測定をせずに全体の縮約を取ればOKです。最終的にはテンソルから状態ベクトルのベクトルへと変換して完了です。

array([[0.35355339+0.j , 0. +0.j , 0.25 +0.25j, ...,
0. +0.j , 0. +0.j , 0. +0.j ]])

できました。結構高速に状態ベクトルを取得できました。小さなモデルを作ったときなどは状態ベクトルで確認をしながら計算しますので便利かと思います。以上です。

© 2025, blueqat Inc. All rights reserved