跳转至

从同一个末态计算多个可观测量

准备 Bell 态,计算第 0 个量子比特的 Z、X,以及两个量子比特的 ZZ。这些量从不同角度描述同一个状态。先完成Bell 课和Hamiltonian 与可观测量。

对于 (|00⟩ + |11⟩)/√2,单量子比特 Z 测量各占一半,因此 ⟨Z₀⟩ = 0;单量子比特还有 ⟨X₀⟩ = 0。两个有占据的位串都具有偶宇称,所以 ⟨Z₀Z₁⟩ = 1。单点期望值为零,并不表示两个量子比特之间没有关联。

请求一组可观测量

"""从同一个 Digital 末态计算多个带类型的 Observable。

``ObservableSet`` 会批量请求 Z、X 和 ZZ,不会为每个算符重新执行线路。结果分别
记录 expectation、variance、estimator kind、sample count 和末态来源。
"""

from __future__ import annotations

import json

from cascaqit import Circuit, LocalBackend, ObservableSet, PauliX, PauliZ, PauliZZ


def main() -> None:
    """制备 Bell state,并一起评估 X、Z 和 ZZ。"""
    circuit = Circuit(2, program_id="lesson.digital.observables").h(0).cx(0, 1)
    observables = ObservableSet((PauliZ("q0"), PauliX("q0"), PauliZZ("q0", "q1")))
    result = (
        LocalBackend(seed=204).run(circuit, shots=32, observables=observables).result()
    )
    batch = result.observable_batch
    if batch is None:
        raise RuntimeError("Requested observable batch was not returned.")

    payload = {
        "track": "digital_developer",
        "level": "advanced",
        "lesson": "observable_batch",
        "facts": {
            "source_kind": batch.source_kind.value,
            "observable_names": [item.name for item in batch.items],
            "expectations": [round(item.expectation, 10) for item in batch.items],
            "estimator_kinds": [item.estimator_kind.value for item in batch.items],
            "source_hash_matches": batch.source_hash == result.metadata["state_hash"],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

python3 examples/user/tracks/digital_developer/04_advanced_observable_batch_zh.py

ObservableSet 保留声明顺序。集合中的名称不能重复,q0 等目标必须存在于程序中。后端只演化一次,再从末态计算三项结果。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "estimator_kinds": [
      "exact_state",
      "exact_state",
      "exact_state"
    ],
    "expectations": [
      0.0,
      0.0,
      1.0
    ],
    "observable_names": [
      "Z(q0)",
      "X(q0)",
      "Z(q0)*Z(q1)"
    ],
    "source_hash_matches": true,
    "source_kind": "state_vector"
  },
  "lesson": "observable_batch",
  "level": "advanced",
  "track": "digital_developer"
}

期望值应为 [0, 0, 1]。三项的估计方法都是 exact_state:虽然本次运行也请求了 32 次采样,这些期望值直接由模拟态向量计算,并不是从 32 个 Z 基样本推出来的均值。增加 shots 不会改变这些理想期望值。

source_hash_matches 检查这组结果是否引用记录的末态,有助于发现结果对象混用,但不能独立证明目标状态准备正确。

区分方差和均值的不确定度

在副本中查看每项的 item.variance、item.standard_error 和 item.sample_count。Pauli 算符的平方为恒等算符,因此量子测量方差为 1 − ⟨P⟩²。这里依次为 1、1 和约 0。精确计算的标准误差为零,采样数未设置。量子方差非零与估计标准误差为零并不矛盾:前者描述可能的测量结果,后者描述均值的获得方式。

可观测量指南解释了其他估计方法。轨迹均值带有采样不确定度;单凭 Z 基计数,无法在没有合适测量过程的情况下恢复 X 或 Y 的期望值。

这三个数还不能说明什么

00 和 11 的经典混合态会给出相同的三项期望值,因此这一组结果不足以区分混合态与相干 Bell 态。研究它们的差别,可以加入 XX;相干性基础课提供了使用 PauliProduct 的可运行对照。

练习:去掉 CX,保留第 0 个量子比特的 H,先预测 Z₀、X₀ 和 ZZ,再运行。随后恢复 CX,比较量子方差与估计标准误差。

核对思路

没有 CX 时,状态为 |+0⟩,期望值变为 [0, 1, 0],量子方差为 [1, 0, 1],精确态计算的标准误差仍全部为零。Bell 态的 XX 期望为 1,不相干的 00/11 混合态则为 0。模拟器能从态向量计算 X,不意味着有限的 Z 基计数测量了 X。

最后一课是核对实际运行记录。

English

SDK 1.0.8a · `6eff6362`