pyqres.algorithms¶
幅度放大¶
量子层析¶
线性求解器¶
Grover 搜索¶
- class pyqres.algorithms.grover.GroverOracle(reg_list, param_list=None, qram=None, addr_reg=None, data_reg=None, search_reg=None)[源代码]¶
基类:
PrimitiveOracle for Grover's search that marks target values.
- Operation sequence:
Self-adjoint: the uncomputation makes O† = O.
- qram¶
pysparq.QRAMCircuit_qutrit containing search data
- addr_reg¶
Address register name
- data_reg¶
Data register name
- search_reg¶
Search value register name
- condition_regs¶
Optional controller registers
- class pyqres.algorithms.grover.DiffusionOperator(reg_list, param_list=None)[源代码]¶
基类:
PrimitiveHPH (Hadamard-Phase-Hadamard) diffusion operator.
Implements D = H ⊗⊗n (2|0⟩⟨0| - I) H ⊗⊗n = 2|s⟩⟨s| - I where |s⟩ is the uniform superposition over all n-qubit states.
Self-adjoint: D† = D.
- addr_reg¶
Address register to diffuse over
- class pyqres.algorithms.grover.GroverOperator(reg_list, param_list=None, submodules=None, qram=None)[源代码]¶
-
One complete Grover iteration: Oracle followed by Diffusion.
G = D · O
where O is the Grover oracle and D is the diffusion operator. Self-adjoint: G† = G.
- addr_reg¶
Address register
- data_reg¶
Data register (temporary)
- search_reg¶
Search value register
- qram¶
pysparq QRAM circuit
- class pyqres.algorithms.grover.GroverSearch(reg_list, param_list=None, submodules=None, qram=None)[源代码]¶
-
Grover's quantum search algorithm.
Finds a target value in an unsorted memory of N items in O(√N) queries, providing a quadratic speedup over classical search.
- 参数:
reg_list -- [addr_reg, data_reg, search_reg]
param_list -- [memory, target, n_iterations, data_size] - memory: List[int] — search data - target: int — value to find - n_iterations: int — number of Grover iterations (auto if None) - data_size: int — bits for data register (auto if None)
submodules -- Not used; grover_ops built internally
- Resource estimation (per iteration):
T-count ≈ 2 * (4(n+m) + 1) + 4m where n = ceil(log2 N), m = data_size
示例
>>> search = GroverSearch( ... reg_list=["addr", "data", "search"], ... param_list=[[5, 12, 3, 8], 8, None, None] ... ) >>> tc = search.t_count() >>> print(f"T-count estimate: {tc}")
- sum_t_count(t_count_list)[源代码]¶
Sum T-counts of all Grover operations.
- Formula per iteration (ignoring QRAM):
- Oracle: 4 * data_size (m-bit comparison)
4 * n_bits + 1 (phase flip on match)
Diffusion: 2 * (4 * n_bits + 1) (two ZeroConditionalPhaseFlip)
Total per iteration: 4 * data_size + 3 * (4 * n_bits + 1)
- pyqres.algorithms.grover.grover_search(memory, target, n_iterations=None, data_size=None)[源代码]¶
Execute Grover's search on a pysparq SparseState.
- 参数:
- 返回类型:
- 返回:
(index, probability) — most likely index containing target
Note: Requires pysparq installed. Falls back gracefully if not available.
Shor 分解¶
- class pyqres.algorithms.shor.ModMul(reg_list, param_list=None, reg=None, a=None, x=None, N=None)[源代码]¶
基类:
PrimitiveControlled modular multiplication: |y⟩ → |y * a^(2^x) mod N⟩.
Wraps pysparq.C++ ModMul backend. In-place semantics: reg = reg * opnum mod N. Uses ripple-carry addition with O(n) multi-controlled Toffoli gates per bit.
- reg¶
Register name (UnsignedInteger)
- a¶
Base for exponentiation
- x¶
Power of 2 exponent (computes a^(2^x) mod N)
- N¶
Modulus
- class pyqres.algorithms.shor.ExpMod(reg_list, param_list=None, input_reg=None, output_reg=None, a=None, N=None, period=None)[源代码]¶
基类:
PrimitiveModular exponentiation: |x⟩|z⟩ → |x⟩|z XOR (a^x mod N)⟩.
Wraps pysparq.CustomArithmetic. Used in the full-quantum Shor algorithm.
- input_reg¶
Input register (holds exponent x)
- output_reg¶
Output register (holds a^x mod N)
- a¶
Base
- N¶
Modulus
- period¶
Period of a^x mod N (precomputed)
- __init__(reg_list, param_list=None, input_reg=None, output_reg=None, a=None, N=None, period=None)[源代码]¶
- t_count(dagger_ctx=False, controllers_ctx=None)[源代码]¶
T-count for modular exponentiation.
Implements |x⟩|z⟩ → |x⟩|z⊕a^x⟩ using a lookup table via CustomArithmetic. The period (number of distinct outputs) determines the table size. Each output bit requires a multi-controlled XOR chain:
≈ period * 4 * output_bits * mcx_t_count(ncontrols + 2)
Simplified: O(period * n²).
- class pyqres.algorithms.shor.SemiClassicalShor(reg_list, param_list=None, submodules=None)[源代码]¶
-
Semi-classical Shor algorithm using iterative phase estimation.
Each iteration: Hadamard → controlled ModMul → phase correction → measure.
- 参数:
reg_list -- [anc_reg] - auxiliary register for modular arithmetic
param_list -- [a, N] - base and modulus
- Resource estimation:
T-count ≈ size × (1 + 4n × mcx_t_count(3)) where n = ceil(log2 N), size = 2n
- class pyqres.algorithms.shor.Shor(reg_list, param_list=None, submodules=None)[源代码]¶
-
Full quantum Shor algorithm with quantum phase estimation.
Circuit: Hadamard(work) → ExpMod(work, anc) → InverseQFT(work)
- 参数:
reg_list -- [work_reg, anc_reg]
param_list -- [a, N, period]
- pyqres.algorithms.shor.factor(N, a=None)[源代码]¶
Factor N using semi-classical Shor's algorithm (pysparq simulation).
- pyqres.algorithms.shor.factor_full_quantum(N, a=None)[源代码]¶
Factor N using full quantum Shor with QFT (pysparq simulation).
块编码¶
- pyqres.algorithms.block_encoding.get_tridiagonal_matrix(alpha, beta, dim)[源代码]¶
Return the dim×dim tridiagonal matrix alpha*I + beta*T.
The off-diagonal matrix T has ones on the first sub- and super-diagonal.
- 返回类型:
- pyqres.algorithms.block_encoding.get_u_plus(size)[源代码]¶
Return the size×size shift-down (sub-diagonal) matrix.
- 返回类型:
- pyqres.algorithms.block_encoding.get_u_minus(size)[源代码]¶
Return the size×size shift-up (super-diagonal) matrix.
- 返回类型:
- class pyqres.algorithms.block_encoding.BlockEncodingTridiagonal(reg_list=None, param_list=None, submodules=None, main_reg='main', anc_UA='anc_UA', alpha=0.0, beta=0.0)[源代码]¶
-
Block encoding of a tridiagonal matrix alpha*I + beta*T.
Uses a 4-element ancilla state for state preparation, then applies conditional increment/decrement on the main register. Self-adjoint when beta >= 0.
- main_reg¶
Main index register
- anc_UA¶
Ancilla register for unitary encoding (4-element)
- alpha¶
Diagonal coefficient
- beta¶
Off-diagonal coefficient
- class pyqres.algorithms.block_encoding.UR(reg_list=None, param_list=None, submodules=None, qram=None, column_index='col', data_size=32, rational_size=16)[源代码]¶
-
Right-multiplication operator for QRAM-based block encoding.
Encodes column norms of the target matrix. Iterates over address bits, performing QRAM loads, division, conditional rotation, and uncomputation.
- class pyqres.algorithms.block_encoding.UL(reg_list=None, param_list=None, submodules=None, qram=None, row_index='row', column_index='col', data_size=32, rational_size=16)[源代码]¶
-
Left-multiplication operator for QRAM-based block encoding.
Encodes the row structure of the target matrix. Iterates over upper address bits, constructing parent/child addresses, loading from QRAM, computing rotation angles, and applying conditional rotations.
- class pyqres.algorithms.block_encoding.BlockEncodingViaQRAM(reg_list=None, param_list=None, submodules=None, qram=None, row_index='row', column_index='col', data_size=32, rational_size=16)[源代码]¶
-
Block encoding of an arbitrary matrix via QRAM.
Composed as: U_A = SWAP(row, col) · U_R†(col) · U_L(row, col)
- qram¶
pysparq.QRAMCircuit_qutrit
- row_index¶
Row index register
- column_index¶
Column index register
- data_size¶
Data register bit size
- rational_size¶
Rational rotation register bit size
- class pyqres.algorithms.block_encoding.PlusOneOverflow(reg_list, param_list=None)[源代码]¶
基类:
PrimitiveIncrement main register by 1, with overflow flag.
Used in BlockEncodingTridiagonal for controlled increment. Implements ps.PlusOneAndOverflow(main_reg, overflow_reg).
The forward operation conditions on anc_UA=1, the dagger on anc_UA=2.
QRAM 态制备¶
- pyqres.algorithms.state_prep.get_complement(data, data_sz)[源代码]¶
Sign-extend unsigned data to a signed integer.
Ported from pysparq/algorithms/qram_utils.py.
- 返回类型:
- pyqres.algorithms.state_prep.make_complement(data, data_sz)[源代码]¶
Convert signed integer to unsigned two's-complement.
- 返回类型:
- pyqres.algorithms.state_prep.make_vector_tree(dist, data_size)[源代码]¶
Build a binary tree from leaf distribution data for QRAM circuits.
Ported from pysparq/algorithms/qram_utils.py.
- pyqres.algorithms.state_prep.make_func(value, n_digit)[源代码]¶
Compute a 2x2 rotation matrix from a rational register value.
theta = value / 2**n_digit * 2 * pi Matrix: [cos(theta), -sin(theta), sin(theta), cos(theta)]
- pyqres.algorithms.state_prep.make_func_inv(value, n_digit)[源代码]¶
Inverse 2x2 rotation matrix (off-diagonal signs flipped).
- class pyqres.algorithms.state_prep.StatePrepViaQRAM(reg_list=None, param_list=None, submodules=None, qram=None, work_qubit='main', data_size=32, rational_size=16)[源代码]¶
-
QRAM-based quantum state preparation via binary tree decomposition.
Given a QRAM circuit storing a binary-tree representation of a target amplitude distribution, prepares the corresponding quantum state by traversing the tree level-by-level, loading parent/child norms from QRAM, and applying conditional rotations at each level.
- qram¶
QRAMCircuit_qutrit holding the tree-encoded distribution
- work_qubit¶
Register on which the state is prepared
- data_size¶
Bit-width of signed integer data stored in QRAM
- rational_size¶
Bit-width of the rational rotation-angle register
- class pyqres.algorithms.state_prep.StatePreparation(qubit_number, data_size=8, data_range=4)[源代码]¶
基类:
objectHigh-level pipeline for QRAM-based state preparation.
Manages: random distribution generation, binary tree construction, QRAM creation, and execution.
- qubit_number¶
Number of qubits (log2 of distribution length)
- data_size¶
Bit-width for signed integer amplitude encoding
- data_range¶
Bit-range controlling random amplitude magnitude
- rational_size¶
Bit-width for rational rotation-angle register
- dist¶
Raw distribution values (unsigned two's complement)
- tree¶
Binary tree built from dist for QRAM storage
- qram¶
QRAM circuit instance