快速开始:安装与第一个量子电路¶
本章带你从零完成一次端到端体验:安装 UnifiedQuantum → 构建 Bell 态电路 → 查看它的 OriginIR 表示 → 本地模拟得到测量统计 → 通过统一的执行入口在 dummy 后端上跑一遍。走完这一页,你的环境就完全可用了。
理论背景(Bell 态为什么测量结果只有 00 和 11)见量子计算算法教程·量子计算基础。本页示例基于 unified-quantum 0.1.0(PyPI 最新版),所有输出均为实际运行结果。
本课知识点
安装与环境验证——能安装
unified-quantum并用一条命令验证uniqc可以导入、版本正确。用 Circuit 构建量子线路——能用
Circuit的链式 API 写出 H 门 + CNOT + 测量,制备 Bell 态。OriginIR 线路表示——能读懂一段 OriginIR(QINIT/CREG/门/MEASURE 各行的含义),并知道它是UnifiedQuantum 各后端交换线路的通用格式。
本地模拟与测量统计——能用
Simulator.simulate_shots本地模拟线路,解释计数结果与理论概率的对应与涨落。统一执行入口与 dummy 后端——能用
submit_task+wait_for_result在dummy:local:simulator后端执行线路,并读懂UnifiedResult的各字段。
1. 安装与环境验证¶
推荐在虚拟环境中安装:
python3 -m venv .venv && source .venv/bin/activate
pip install unified-quantum
验证安装(也是全书约定:示例代码都可以直接复制运行):
import uniqc
print(uniqc.__version__)
0.1.0
UnifiedQuantum 的 Python 模块名是 uniqc(包名与模块名不同,这是常见布局)。此外它还提供 uniqc 命令行工具,安装后即可用 uniqc --help 查看——命令行用法见第 5 章,本页先用 Python API。
2. 第一个电路:制备 Bell 态¶
我们构建教科书里最经典的纠缠态线路:对 q[0] 加 H 门制造叠加,再用 CNOT 把纠缠"复制"到 q[1],最后测量两个比特。
from uniqc import Circuit
circuit = Circuit()
circuit.h(0) # 对量子比特 0 施加 Hadamard 门
circuit.cnot(0, 1) # 以比特 0 为控制、比特 1 为目标的 CNOT
circuit.measure(0, 1) # 测量比特 0 与 1,分别写入经典寄存器
三行对应三个动作:单比特门 → 双比特门 → 测量。Circuit() 不需要预先声明比特数,首次用到某个比特时自动扩展寄存器;measure(0, 1) 的参数是要测量的量子比特编号,结果依次写入经典比特。
3. OriginIR:线路的通用表示¶
.originir 属性把线路导出为 OriginIR 文本——这是 UnifiedQuantum 连接多平台后端的通用交换格式:
print(circuit.originir)
QINIT 2
CREG 2
H q[0]
CNOT q[0], q[1]
MEASURE q[0], c[0]
MEASURE q[1], c[1]
逐行读:QINIT 2 声明 2 个量子比特、CREG 2 声明 2 个经典比特;H q[0] 与 CNOT q[0], q[1] 是两行门操作;MEASURE q[i], c[i] 把测量结果写入经典寄存器。除了用 API 构建,你也可以直接用任何能产出 OriginIR(或 OpenQASM 2.0)的工具生成线路文本再交给 UnifiedQuantum 执行——这就是"任意方式构建线路、统一入口执行"的设计。
4. 本地模拟:测量统计¶
Simulator 在本地对线路做态矢量模拟,simulate_shots 按 shots 次测量采样并统计计数:
from uniqc.simulator import Simulator
sim = Simulator()
counts = sim.simulate_shots(circuit.originir, shots=1024)
print(counts)
{0: 497, 3: 527}
结果只有两个键:0(二进制 00)和 3(二进制 11),各约占一半——这正是 Bell 态 \(|\Phi^+\rangle = \frac{1}{\sqrt 2}(|00\rangle + |11\rangle)\) 的理论预测:测得 00 与 11 的概率各为 \(1/2\),01、10 概率为 0。计数不会精确等于 512/512,1024 次采样下几百的涨落是正常的统计涨落(标准差约 \(\sqrt{1024 \times 0.25} = 16\) 次)。注意本地 simulate_shots 返回的键是十进制整数。
5. 统一执行入口:submit_task 与 dummy 后端¶
真实工作流中我们不直接调用模拟器,而是把线路提交给某个后端。submit_task 是统一入口:同一份代码,把 backend 换成任何支持的平台(本地 dummy、OriginQ 真机、天衍等)即可,这正是"Unified"的含义。
from uniqc import submit_task, wait_for_result
task_id = submit_task(circuit, backend="dummy:local:simulator", shots=1024)
result = wait_for_result(task_id)
print(result)
UnifiedResult(counts={'00': 512, '11': 512}, probabilities={'00': 0.5, '11': 0.5}, shots=1024, platform='dummy', task_id='uqt_8bb8e454c2eb4eab8df387e4af9a087a', backend_name='dummy:local:simulator', execution_time=None, error_message=None)
UnifiedResult 把各平台的结果归一成统一结构,常用字段:
counts:各测量结果的计数(这里键是二进制串'00'/'11');probabilities:归一化概率;shots、platform、backend_name、task_id:执行元信息。
dummy:local:simulator 是无约束、无噪声的本地虚拟后端,适合教学与调试。dummy 家族还有带拓扑约束与含噪声的成员,第 3 章展开。
下一步¶
想系统学习量子计算理论(为什么 Bell 态是这样的测量分布),去量子计算算法教程
想掌握更多线路构建手段(参数化门、QASM 互导),继续第 2 章:线路构建
练习题¶
练习 1【安装与环境验证】(→ 第 1 节)
在全新的虚拟环境中安装
unified-quantum,运行import uniqc; print(uniqc.__version__)并确认输出版本号。运行
uniqc --help,列出它提供的子命令(后续章节会逐一用到)。
练习 2【用 Circuit 构建量子线路】(→ 第 2 节)
把本章电路中的
cnot(0, 1)改成cnot(1, 0)(控制与目标互换),先笔算新线路的测量分布,再用模拟验证你的预测。构建一个三比特线路:
h(0)、cnot(0,1)、cnot(0,2),写出它的 OriginIR 并预测测量结果只可能出现哪几个串。
提示:三比特线路制备的是 GHZ 态 \(\frac{1}{\sqrt2}(|000\rangle+|111\rangle)\)。
练习 3【OriginIR 线路表示】(→ 第 3 节)
解释 OriginIR 中
QINIT、CREG、MEASURE q[0], c[0]各自的作用。手写一段两比特的 OriginIR:先对两个比特各加一个 H 门再测量,然后用
Simulator().simulate_shots(...)执行它,验证四个结果各占约 1/4。
练习 4【本地模拟与测量统计】(→ 第 4 节)
把
shots从 1024 改成 100 再改成 10000,观察00与11计数偏离 50/50 的程度如何变化,并用二项分布标准差 \(\sqrt{Np(1-p)}\) 解释。对 Bell 态线路把
h(0)换成x(0)(Pauli-X 门),先预测测量结果再运行验证。
练习 5【统一执行入口与 dummy 后端】(→ 第 5 节)
用
submit_task在dummy:local:simulator上执行 GHZ 线路,打印UnifiedResult并指出counts与probabilities的关系。对比
Simulator().simulate_shots与wait_for_result(...)返回的计数键格式(整数 vs 二进制串),解释为什么统一入口要规定键格式。
提示:统一格式让同一份后处理代码可以不加修改地跑在所有平台上。