System 类¶
System 类是稀疏态模拟器的基本单元,代表一个计算基态。每个 System 存储一个复数振幅 amplitude 和所有寄存器的值 registers。
核心概念¶
在 PySparQ 中,量子态用稀疏表示:只存储振幅非零的基态。每个基态用一个 System 对象表示:
其中每个 \(|i\rangle\) 对应一个 System 实例。
一个 System 包含两部分核心数据:
**amplitude**(
complex):该基态的复数振幅**registers**(
list[StateStorage]):各寄存器的值,按寄存器 ID 索引。每个寄存器值以uint64_t存储
重要
System 不是独立使用的对象。它始终由 SparseState 托管。SparseState 保证其中所有 System 的寄存器值组合唯一——如果两个 System 具有相同的寄存器值,意味着发生了量子干涉,它们的振幅应当相加合并为一个 System。
静态变量:全局寄存器追踪¶
System 类使用静态(类级)变量追踪所有寄存器的元信息。这意味着:
所有
System实例共享同一套寄存器元数据寄存器 ID 在全局范围内分配
程序结束时静态状态不会自动清除
警告
重要:每次运行新程序前,必须调用 System.clear() 清理静态状态,否则会残留上次运行的信息!
静态成员¶
变量名 |
类型 |
说明 |
|---|---|---|
|
|
寄存器元数据列表,每个元素为 |
|
|
历史最大寄存器数量(统计用) |
|
|
历史最大基态数量(统计用) |
|
|
可重用的寄存器 ID 列表 |
|
|
临时寄存器栈 |
实例成员¶
成员 |
类型 |
说明 |
|---|---|---|
|
|
该基态的复数振幅 |
|
|
各寄存器的值(按寄存器 ID 索引),底层以 |
寄存器的存储原理¶
系统中的寄存器托管了 n 个 uint64_t 的存储方式。这使得我们可以将量子态编码为类似 \(|a\rangle|b\rangle|c\rangle\) 的多寄存器形式,而无需管理量子比特是如何编码的。
例如,QRAM 访问 \(|i\rangle|0\rangle \to |i\rangle|d[i]\rangle\) 可以被轻松编码——只需要一个地址寄存器和一个数据寄存器。整个项目的管理层面从量子比特上升到了量子寄存器,几乎所有操作都以量子寄存器为单位。
查询方法¶
获取寄存器信息¶
# 获取寄存器 ID
reg_id = ps.System.get_id("counter")
# 获取寄存器大小(比特数)
size = ps.System.size_of("counter") # 或 ps.System.size_of(reg_id)
# 获取寄存器类型
type_ = ps.System.type_of("counter") # 返回 StateStorageType 枚举
# 获取寄存器激活状态
active = ps.System.status_of("counter") # True 表示已激活
# 获取完整元信息
info = ps.System.get_register_info("counter")
# 返回 (name, type, size, status) 元组
# 根据 ID 获取名称
name = ps.System.name_of(reg_id)
统计信息¶
# 获取量子比特总数
n_qubits = ps.System.get_qubit_count()
# 获取已激活寄存器数量
n_regs = ps.System.get_activated_register_size()
访问基态中的寄存器值¶
ps.System.clear()
ps.System.add_register("x", ps.UnsignedInteger, 4)
state = ps.SparseState()
# 遍历所有基态
for system in state.basis_states:
# 访问振幅
amp = system.amplitude
# 访问寄存器值(通过 ID)
x_id = ps.System.get_id("x")
value = system.get(x_id).value
# 字符串表示
print(system)
# 访问最后一个激活的寄存器
last_val = system.last_register()
比较与排序¶
System 类支持比较运算符,用于排序和去重:
# 相等比较(所有寄存器值和振幅都相同)
if s1 == s2:
print("相同基态")
# 小于比较(用于排序)
if s1 < s2:
print("s1 排在 s2 前面")
# 字符串表示
print(str(system)) # 如: "|x=3, y=5⟩ : (0.5+0j)"
最佳实践¶
始终在程序开始时调用 ``System.clear()``
import pysparq as ps ps.System.clear() # 第一步! # 然后创建寄存器... ps.System.add_register("a", ps.UnsignedInteger, 4) # SparseState() 默认创建 |0...0⟩ 初态 state = ps.SparseState()
不要手动构造 System 列表来创建 SparseState
SparseState的默认构造函数已经创建了一个所有寄存器值为 0 的初态。通常不需要手动构造System对象。使用有意义的寄存器名称
名称用于调试和
StatePrint输出,应具有描述性。