Qiskit 随机电路生成指南:random_circuit、random_circuit_from_graph 与 random_clifford_circuit 全面解析
科学计算【免费下载链接】qiskitQiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.项目地址https://gitcode.com/gh_mirrors/qi/qiskit点击查看免费下载本文围绕 Qiskit 的qiskit.circuit.random模块展开系统讲解如何利用该模块生成任意规模、任意形态的随机量子电路。随机电路是量子硬件基准测试benchmarking与转译器transpiler性能评估的标准工具读完本文你将掌握random_circuit、random_circuit_from_graph、random_clifford_circuit三个生成器的完整参数语义、底层采样机制与可复现用法可直接用于构建自己的基准测试管线。模块定位为什么需要随机电路qiskit.circuit.random模块提供了一系列函数用于生成门从给定门集合中随机选取的任意电路。根据 模块文档 的概述这类电路有两个核心用途对现有量子硬件进行基准测试随机电路的统计特性已知便于评估硬件的保真度、串扰与噪声特性评估量子电路转译器与软件基础设施的性能随机电路可以作为转译、调度、布局等 Pass 的压力测试输入衡量时间开销与优化效果。模块的公开 API 只有三个函数定义于 qiskit/circuit/random/utils.py覆盖三种生成场景任意电路、尊重量子比特耦合约束的电路、纯 Clifford 电路函数场景random_circuit任意大小与形态的随机电路门操作数 14random_circuit_from_graph严格尊重交互图coupling map约束的随机电路random_clifford_circuit由 Clifford 门组成的伪随机电路三者均从qiskit.circuit.library.standard_gates的标准门集合中随机选取门生成的均为QuantumCircuit对象。random_circuit生成任意形态的随机电路random_circuit(num_qubits, depth, max_operands4, measureFalse, conditionalFalse, resetFalse, seedNone, num_operand_distributionNone)是最通用的生成器它按层layer组织门depth即电路的关键路径长度critical path length。参数语义参数类型默认值含义num_qubitsint必填量子比特数量depthint必填操作的层数即关键路径长度max_operandsint4每个门最大量子比特操作数14measureboolFalse若为 True在电路末尾对所有量子比特进行测量conditionalboolFalse若为 True插入中间测量与条件门if_testresetboolFalse若为 True在电路中插入中间 reset 操作seedintNone随机种子为 None 时自动选取随机种子num_operand_distributiondictNone各 n 比特门在电路中的比例分布键为操作数 14值为权重基本用法示例模块文档中给出的最小示例见 utils.pyfrom qiskit.circuit.random import random_circuit circ random_circuit(2, 2, measureTrue) circ.draw(outputmpl)生成一个 2 量子比特、深度为 2、末尾带测量的随机电路。测试用例 test/python/circuit/test_random_circuit.py 验证了random_circuit(5, 4)得到的电路宽度为 5、深度恰为 4说明depth语义是严格的分层每层至少推进一个关键路径单位。depth0时返回空电路宽度不变、深度为 0见 测试第 38-42 行。控制门操作数比例num_operand_distribution默认情况下若不传num_operand_distribution实现会先用rng.dirichlet(np.ones(max_operands))随机生成一个和为 1 的分布再据此在每层中混合 1max_operands比特门utils.py。若要精确控制比例可显式传入分布字典例如测试中的用法测试第 96-99 行circ random_circuit( num_qubits50, depth300, num_operand_distribution{1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}, seed123456789, )该参数的约束与行为键必须介于 14 之间否则抛出CircuitErrorutils.py键不能超过电路比特数除非该键对应的权重为 0否则抛出CircuitErrorutils.py所有值的和必须为 1用np.isclose容差判断否则抛出CircuitErrorutils.py权重为 0 的键对应比特数的门完全不会出现可用于只生成 2、3 比特门这类定制测试 第 108-126 行 与 第 150-168 行 对此有专门验证由于采样具有随机性实际比例与目标比例存在偏差电路比特数越少、深度越浅偏差越大比特数与深度越大偏差越小源码注释见 utils.py。底层分层算法要点从源码utils.py可以看出实现的几个关键细节批量随机化每层一次性用rng.choice抽取全部门的规格类、比特数、参数个数再用np.cumsum预计算量子比特索引与参数索引最后用np.searchsorted找出能恰好用满不超过该层量子比特数量的门序列避免了逐门调用随机数例程的性能开销余量slack填充若一层内的门未用满全部比特实现会在尊重num_operand_distribution的前提下从大到小尝试补充门来填满余量utils.py参数采样所有带参数门的参数值统一在[0, 2π)区间内均匀采样conditional 语义conditionalTrue时从第 2 层开始每个门约有 10% 概率被包裹进qc.if_test条件块且条件块之前会对全部比特做一次测量utils.py条件值使用 Python 大整数bigint而非 NumPy 定宽类型这是为保证条件语义正确性的刻意设计resetresetTrue时Reset操作会被加入 1 比特门候选集合utils.py。random_circuit_from_graph生成尊重耦合约束的随机电路random_circuit_from_graph(interaction_graph, min_2q_gate_per_edge1, max_operands2, measureFalse, conditionalFalse, resetFalse, seedNone, insert_1q_operTrue, prob_conditional0.1, prob_reset0.1)面向需要严格贴合硬件拓扑如 coupling map的场景生成的电路中所有 2 比特门只出现在交互图允许的量子比特对上。interaction_graph 的三种合法输入交互图 G(V, E)其中 V 是电路中的量子比特E 是允许发生双比特门交互的比特对集合。合法输入有两种形式rustworkx 图对象rx.PyGraph或rx.PyDiGraph。节点的数量即电路比特数每条边可以携带数值权重作为该比特对被选中的概率权重源码通过interaction_graph.edges()读取边权重见 utils.py元组列表[(control_qubit, target_qubit, probability), ...]等价于以列表形式直接描述图。比特数为列表中出现的最大索引 1utils.py。传入其他对象如 tuple 包装的列表会抛出CircuitError测试 第 562-566 行 专门覆盖了该分支。边权重的概率语义若所有边权重均为None或图边不带权重每条边以等概率1/NN 为边数被选中即均匀抽取若所有边权重均为正数值实现会先做归一化若非 1 则除以总和归一化后的权重即为各比特对被选中的概率测试 第 493-560 行 验证了在足够大的电路中各边实际出现频率与给定权重的偏差在 1% 以内权重为 0 的边会被直接排除该比特对不会出现在输出电路中utils.py对应测试 第 338-359 行若部分权重为None而部分为数值或存在负值当max_operands2时抛出ValueErrorutils.py对应测试 第 361-373 行 与 第 387-396 行。核心参数与边界条件参数默认值含义min_2q_gate_per_edge1每条边量子比特对在电路中被使用的最少次数达到该次数后该边才从待完成集合中移除max_operands2每个门的最大操作数只允许 1 或 2insert_1q_operTrue是否在每轮迭代后向空闲比特插入 1 比特门prob_conditional0.1门被加上条件conditional的概率取值小于 1.0prob_reset0.1比特被插入 reset 的概率取值小于 1.0measure/conditional/resetFalse语义与random_circuit一致生成循环逻辑utils.py外层 while 循环持续运行直到每条边都达到min_2q_gate_per_edge的使用次数每轮迭代中按边权重抽样一批 2 比特门应用到对应比特对并记录使用次数一轮结束后仍未参与 2 比特门的空闲比特会被补上随机的 1 比特门若insert_1q_operTrue。测试 第 249-267 行 验证了每个比特对的使用次数都不少于min_2q_gate_per_edge。边界与异常max_operands不是 1 或 2 时抛出CircuitError测试 第 375-385 行max_operands1但insert_1q_operFalse时抛出CircuitError无任何门可生成交互图没有边、且insert_1q_operFalse时抛出CircuitErrorutils.pymax_operands1或图中无边时函数退化为调用random_circuit生成纯 1 比特门电路utils.py。完整示例模块文档中的示例utils.py演示了构造 PyDiGraph 并生成电路的全过程from qiskit.circuit.random.utils import random_circuit_from_graph import rustworkx as rx pydi_graph rx.PyDiGraph() pydi_graph.add_nodes_from(range(7)) cp_map [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22), (4, 5, 0.13), (5, 6, 0.17)] pydi_graph.add_edges_from(cp_map) # cp_map 也可以直接作为 interaction_graph 传入 qc random_circuit_from_graph(pydi_graph, min_2q_gate_per_edge2, seed12345) qc.draw(outputmpl)测试中还覆盖了多种 rustworkx 生成图与列表输入test_random_circuit.py环图、网格图、非完全图、heavy-hex 图、路径图、无边的空图以及 20 条边的元组列表验证了函数在稀疏/密集拓扑下的通用性。random_clifford_circuit生成伪随机 Clifford 电路random_clifford_circuit(num_qubits, num_gates, gatesall, seedNone)用于生成由 Clifford 门构成的随机电路常见于 Clifford 基准测试如 randomized benchmarking 前的随机 Clifford 采样。门集合默认gatesall时实现从 qiskit/quantum_info/operators/symplectic/clifford_circuits.py 定义的 Clifford 基门_BASIS_1Q/_BASIS_2Q中选取1 比特门包括i、x、y、z、h、s、sdg、sx、sxdg排除了语义重复的v、w、id、iden、sinv别名2 比特门包括cx、cy、cz、swap、iswap、ecr、dcx。若num_qubits1则只从 1 比特门中采样utils.py。也可以传入自定义门名列表gates[x, h, cx]限定采样范围。每个门名到具体门对象与操作数的映射表定义在 utils.py。用法与可复现性from qiskit.circuit.random import random_clifford_circuit circ random_clifford_circuit(num_qubits2, num_gates6) circ.draw(outputmpl)seed参数有两种可接受类型utils.pyint作为整数种子构造np.random.default_rng(seed)np.random.Generator直接复用调用方传入的随机数生成器便于在长流程中串联随机性。测试 test/python/quantum_info/operators/symplectic/test_clifford.py 验证了同一种子在不同PYTHONHASHSEED环境下的生成结果完全一致说明函数输出的可复现性不依赖 Python 哈希随机化该测试文件还大量使用random_clifford_circuit作为 Clifford 合成、转译等功能的随机输入来源。随机性与可复现性约定三个函数在随机性处理上保持一致所有随机数统一通过np.random.default_rng(seed)生成传入相同整数种子即可获得完全相同的电路seedNone时实现自动取np.random.randint(0, np.iinfo(np.int32).max)作为种子utils.py、utils.py此时每次运行结果不同条件值if_test的取值特意转换为 Python 大整数避免 NumPy 定宽整数类型造成条件语义偏差见 utils.py 注释。在编写基准测试脚本时务必传入固定seed以保证实验可复现、可对比同时注意random_circuit的默认比例分布本身就是随机生成的Dirichlet 采样即使固定种子不同调用之间门的比例结构也会随种子而变需要精确控制时请显式指定num_operand_distribution。与转译、QPY 等模块的联动随机电路生成器在 Qiskit 生态中常作为其他功能的输入转译器压测将生成的随机电路交给qiskit.compiler.transpiler的预设 PassManager 处理可评估布局、路由与优化 Pass 的耗时与门数压缩效果QPY 序列化随机电路可被 qpy 格式 序列化与反序列化用于验证格式兼容性见 test/python/circuit/test_circuit_load_from_qpy.pyTwirling 与错误表征随机电路可作为基准注入到 twirling 等流程中见 test/python/circuit/test_twirling.py。小结qiskit.circuit.random用三个函数覆盖了随机电路生成的主要需求random_circuit提供比特数、深度、操作数分布、条件/测量/reset 的全面控制适合通用基准测试random_circuit_from_graph以 rustworkx 图或边列表描述耦合约束并支持边权重概率适合硬件拓扑感知的测试场景random_clifford_circuit专门生成 Clifford 电路服务 Clifford 相关的基准与验证需求。所有函数都支持固定种子复现结合qiskit.converters.circuit_to_dag等工具即可搭建完整的随机电路基准测试管线。赞分享科学计算【免费下载链接】qiskitQiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.项目地址https://gitcode.com/gh_mirrors/qi/qiskit点击查看免费下载相关推荐ClickHouse随机数生成函数全面解析ClickHouse随机数生成函数全面解析 概述 在数据分析、测试数据生成和模拟场景中随机数生成是一项基础但至关重要的功能。ClickHouse提供了一系列强数据库OLAP列式数据库大数据实时分析数据分析Carbon语言随机数生成伪随机与加密安全随机Carbon语言随机数生成伪随机与加密安全随机 概述 在现代编程语言中随机数生成是一个基础但至关重要的功能。Carbon语言作为C的继任者在设计随机数编程语言编译器标准库Instatic与GraphQL客户端Apollo、Relay集成完整指南Instatic与GraphQL客户端Apollo、Relay集成完整指南 Instatic是一款现代自托管可视化CMS它通过内置的插件系统提供了灵活的数据CMS后端前端上一篇Fast-GitHub终极指南如何解决GitHub下载缓慢问题下一篇GitHub下载加速终极指南3分钟告别龟速体验飞一般的感觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考