Grover 算法¶
Grover 算法及其辅助函数。
待办事项:
W 门构造(或者可能是基于Mermin的书的 -W 门)
将算法推广到未知函数,该函数在多个量子比特状态下返回1,而不仅仅是一个。
实现 _represent_ZGate 在 OracleGate
- class sympy.physics.quantum.grover.OracleGate(*args, **kwargs)[源代码][源代码]¶
一个黑色盒子门。
门通过翻转量子比特的符号来标记未知函数的期望量子比特。当未知函数找到其期望的量子比特时返回真,否则返回假。
- 参数:
- 量子比特整数
量子比特数量。
- oracle可调用
一个基于计算返回布尔值的可调用函数。
- 属性:
args
返回 ‘self’ 的参数元组。
assumptions0
返回对象 \(type\) 假设。
canonical_variables
返回一个字典,将
self.bound_symbols
中定义的任何变量映射到与表达式中任何自由符号不冲突的符号。expr_free_symbols
类似于
free_symbols
,但仅在自由符号包含在表达式节点中时返回它们。free_symbols
从自身的原子中返回那些自由符号。
func
表达式中的顶级函数。
- gate_name_plot
- 希尔伯特空间
- is_antihermitian
is_comparable
如果 self 可以计算为一个具有精度的实数(或已经是一个实数),则返回 True,否则返回 False。
- is_finite
- is_hermitian
- is_infinite
is_number
如果
self
没有自由符号且没有未定义的函数(确切地说,是 AppliedUndef),则返回 True。- is_polar
- is_symbolic
label
标签是对象的唯一标识符集。
min_qubits
此门作用所需的最小量子比特数。
nqubits
此门作用的量子比特总数。
search_function
帮助找到所需量子比特的未知功能。
targets
目标量子比特的元组。
方法
apart
([x])请参阅 sympy.polys 中的 apart 函数。
args_cnc
([cset, warn, split_1])返回 [交换因子, 非交换因子] 的自身。
as_coeff_Add
([rational])高效地提取求和的系数。
as_coeff_Mul
([rational])高效地提取乘积的系数。
as_coeff_add
(*deps)返回元组 (c, args),其中 self 被写成一个 Add,
a
。as_coeff_exponent
(x)c*x**e -> c,e
其中 x 可以是任何符号表达式。as_coeff_mul
(*deps, **kwargs)返回元组 (c, args),其中 self 被写成一个 Mul,
m
。as_coefficient
(expr)提取给定表达式中的符号系数。
as_coefficients_dict
(*syms)返回一个字典,将术语映射到它们的 Rational 系数。
as_content_primitive
([radical, clear])此方法应递归地从所有参数中移除一个 Rational,并返回该内容和新的 self(原始类型)。
as_dummy
()返回表达式,其中任何具有结构绑定符号的对象都被替换为在其出现的对象中唯一的规范符号,并且仅对交换性具有默认假设为True。
as_expr
(*gens)将多项式转换为 SymPy 表达式。
as_independent
(*deps, **hint)将 Mul 或 Add 的大部分天真分离为不依赖于 deps 的参数。
as_leading_term
(*symbols[, logx, cdir])返回自身级数展开的主导(非零)项。
as_numer_denom
()返回一个表达式的分子和分母。
as_ordered_factors
([order])返回有序因子列表(如果是 Mul),否则返回 [self]。
as_ordered_terms
([order, data])将表达式转换为有序的项列表。
as_poly
(*gens, **args)将
self
转换为多项式,或返回None
。as_powers_dict
()将自身作为一个因子的字典返回,每个因子都被视为一个幂。
as_real_imag
([deep])对 'self' 执行复杂的扩展,并返回一个包含收集到的实部和虚部的元组。
as_terms
()将一个表达式转换为项的列表。
aseries
([x, n, bound, hir])自变量的渐近级数展开
atoms
(*types)返回构成当前对象的原子。
cancel
(*gens, **args)参见 sympy.polys 中的取消函数
class_key
()类的好顺序。
coeff
(x[, n, right, _first])返回包含
x**n
的项中的系数。collect
(syms[, func, evaluate, exact, ...])请参阅 sympy.simplify 中的 collect 函数。
combsimp
()请参阅 sympy.simplify 中的 combsimp 函数。
compare
(other)如果对象在规范意义上小于、等于或大于其他对象,则返回 -1、0、1。
compute_leading_term
(x[, logx])已弃用的函数,用于计算级数的首项。
conjugate
()返回 'self' 的复数共轭。
could_extract_minus_sign
()如果 self 以 -1 作为前导因子,或在求和中有比正号更多的负号,则返回 True,否则返回 False。
count
(query)计算匹配的子表达式的数量。
count_ops
([visual])default_args
()doit
(**hints)评估默认情况下不评估的对象,如极限、积分、求和和乘积。
dummy_eq
(other[, symbol])比较两个表达式并处理哑符号。
equals
(other[, failing_expression])如果 self == other 则返回 True,如果不相等则返回 False,或者返回 None。
evalf
([n, subs, maxn, chop, strict, quad, ...])将给定的公式计算到 n 位精度。
expand
([deep, modulus, power_base, ...])使用提示扩展表达式。
extract_additively
(c)如果可以从自身减去 c 并且使所有匹配的系数趋向于零,则返回 self - c,否则返回 None。
extract_branch_factor
([allow_half])尝试以
exp_polar(2*pi*I*n)*z
的方式优雅地表达自身。extract_multiplicatively
(c)如果无法以一种良好的方式将 self 表示为 c * something,即保留 self 参数的属性,则返回 None。
factor
(*gens, **args)参见 sympy.polys.polytools 中的 factor() 函数
find
(query[, group])查找所有匹配查询的子表达式。
fourier_series
([limits])计算自身的傅里叶正弦/余弦级数。
fps
([x, x0, dir, hyper, order, rational, full])计算自身的形式幂级数。
fromiter
(args, **assumptions)从可迭代对象创建一个新对象。
gammasimp
()参见 sympy.simplify 中的 gammasimp 函数
getO
()如果有加法 O(..) 符号,则返回该符号,否则返回 None。
get_target_matrix
([format])门的靶部分矩阵表示。
getn
()返回表达式的顺序。
has
(*patterns)测试是否有任何子表达式匹配任何模式。
has_free
(*patterns)如果 self 包含对象
x
作为自由表达式,则返回 True,否则返回 False。has_xfree
(s)如果 self 有 s 中的任何一个模式作为自由参数,则返回 True,否则返回 False。
integrate
(*args, **kwargs)请参阅 sympy.integrals 中的 integrate 函数。
invert
(g, *gens, **args)返回
self
对g
的乘法逆元,其中self``(和 ``g
)可以是符号表达式。is_algebraic_expr
(*syms)此测试给定的表达式是否在给定的符号 syms 中是代数的。
is_constant
(*wrt, **flags)如果 self 是常量则返回 True,如果不是则返回 False,如果无法明确确定常量性则返回 None。
is_meromorphic
(x, a)此测试表达式是否作为给定符号
x
的函数在点a
处是亚纯的。is_polynomial
(*syms)如果 self 是 syms 中的多项式,则返回 True,否则返回 False。
is_rational_function
(*syms)测试函数是否是给定符号 syms 中的两个多项式的比率。
is_same
(b[, approx])如果 a 和 b 结构相同则返回 True,否则返回 False。
leadterm
(x[, logx, cdir])返回前导项 a*x**b 作为元组 (a, b)。
limit
(x, xlim[, dir])计算极限 x->xlim。
lseries
([x, x0, dir, logx, cdir])用于生成序列项的迭代器的包装器。
match
(pattern[, old])模式匹配。
matches
(expr[, repl_dict, old])用于 match() 的辅助方法,用于在 self 中的通配符符号与 expr 中的表达式之间寻找匹配。
n
([n, subs, maxn, chop, strict, quad, verbose])将给定的公式计算到 n 位精度。
normal
()返回表达式为分数形式。
nseries
([x, x0, n, dir, logx, cdir])如果假设允许,则包装到 _eval_nseries,否则包装到 series。
nsimplify
([constants, tolerance, full])参见 sympy.simplify 中的 nsimplify 函数
powsimp
(*args, **kwargs)请参阅 sympy.simplify 中的 powsimp 函数
primitive
()返回可以从自身每个项中非递归提取的正有理数(即,将自身视为一个加法)。
radsimp
(**kwargs)参见 sympy.simplify 中的 radsimp 函数
ratsimp
()参见 sympy.simplify 中的 ratsimp 函数。
rcall
(*args)通过表达式树递归应用于参数。
refine
([assumption])请参阅 sympy.assumptions 中的 refine 函数。
removeO
()如果存在,移除加性的 O(..) 符号
replace
(query, value[, map, simultaneous, exact])将
self
中匹配的子表达式替换为value
。rewrite
(*args[, deep])使用定义的规则重写 self。
round
([n])返回 x 四舍五入到给定的十进制位数。
separate
([deep, force])参见 sympy.simplify 中的单独函数
series
([x, x0, n, dir, logx, cdir])在
x = x0
附近对 "self" 进行级数展开,当 n=None 时逐项给出级数项(即惰性级数),否则当 n != None 时一次性给出所有项。simplify
(**kwargs)请参阅 sympy.simplify 中的 simplify 函数。
sort_key
([order])subs
(*args, **kwargs)在简化参数后,在表达式中用新内容替换旧内容。
taylor_term
(n, x, *previous_terms)泰勒项的一般方法。
together
(*args, **kwargs)请参阅 sympy.polys 中的 together 函数。
trigsimp
(**args)参见 sympy.simplify 中的 trigsimp 函数
xreplace
(rule)替换表达式中对象的出现。
伴随
as_base_exp
复制
差异
目录
inv
反向
is_hypergeometric
矩阵元素
plot_gate
转置
示例
在不同的量子比特上应用一个翻转
|2>
符号的 Oracle 门:>>> from sympy.physics.quantum.qubit import IntQubit >>> from sympy.physics.quantum.qapply import qapply >>> from sympy.physics.quantum.grover import OracleGate >>> f = lambda qubits: qubits == IntQubit(2) >>> v = OracleGate(2, f) >>> qapply(v*IntQubit(2)) -|2> >>> qapply(v*IntQubit(3)) |3>
- property search_function¶
帮助找到所需量子比特的未知功能。
- property targets¶
目标量子比特的元组。
- class sympy.physics.quantum.grover.WGate(*args, **kwargs)[源代码][源代码]¶
Grover算法中的通用n量子比特W门。
该门对某些量子位执行操作
2|phi><phi| - 1
。|phi> = (n 个 Hadamard 的张量积)*(|0> 与 n 个量子位)
- 参数:
- nqubits整数
要操作的量子比特数量
- 属性:
args
返回 ‘self’ 的参数元组。
assumptions0
返回对象 \(type\) 假设。
canonical_variables
返回一个字典,将
self.bound_symbols
中定义的任何变量映射到与表达式中任何自由符号不冲突的符号。expr_free_symbols
类似于
free_symbols
,但仅在自由符号包含在表达式节点中时返回它们。free_symbols
从自身的原子中返回那些自由符号。
func
表达式中的顶级函数。
- gate_name_plot
- 希尔伯特空间
- is_antihermitian
is_comparable
如果 self 可以计算为一个具有精度的实数(或已经是一个实数),则返回 True,否则返回 False。
- is_finite
- is_hermitian
- is_infinite
is_number
如果
self
没有自由符号且没有未定义的函数(确切地说,是 AppliedUndef),则返回 True。- is_polar
- is_symbolic
label
标签是对象的唯一标识符集。
min_qubits
此门作用所需的最小量子比特数。
nqubits
此门作用的量子比特总数。
targets
目标量子比特的元组。
方法
apart
([x])请参阅 sympy.polys 中的 apart 函数。
args_cnc
([cset, warn, split_1])返回 [交换因子, 非交换因子] 的自身。
as_coeff_Add
([rational])高效地提取求和的系数。
as_coeff_Mul
([rational])高效地提取乘积的系数。
as_coeff_add
(*deps)返回元组 (c, args),其中 self 被写成一个 Add,
a
。as_coeff_exponent
(x)c*x**e -> c,e
其中 x 可以是任何符号表达式。as_coeff_mul
(*deps, **kwargs)返回元组 (c, args),其中 self 被写成一个 Mul,
m
。as_coefficient
(expr)提取给定表达式中的符号系数。
as_coefficients_dict
(*syms)返回一个字典,将术语映射到它们的 Rational 系数。
as_content_primitive
([radical, clear])此方法应递归地从所有参数中移除一个 Rational,并返回该内容和新的 self(原始类型)。
as_dummy
()返回表达式,其中任何具有结构绑定符号的对象都被替换为在其出现的对象中唯一的规范符号,并且仅对交换性具有默认假设为True。
as_expr
(*gens)将多项式转换为 SymPy 表达式。
as_independent
(*deps, **hint)将 Mul 或 Add 的大部分天真分离为不依赖于 deps 的参数。
as_leading_term
(*symbols[, logx, cdir])返回自身级数展开的主导(非零)项。
as_numer_denom
()返回一个表达式的分子和分母。
as_ordered_factors
([order])返回有序因子列表(如果是 Mul),否则返回 [self]。
as_ordered_terms
([order, data])将表达式转换为有序的项列表。
as_poly
(*gens, **args)将
self
转换为多项式,或返回None
。as_powers_dict
()将自身作为一个因子的字典返回,每个因子都被视为一个幂。
as_real_imag
([deep])对 'self' 执行复杂的扩展,并返回一个包含收集到的实部和虚部的元组。
as_terms
()将一个表达式转换为项的列表。
aseries
([x, n, bound, hir])自变量的渐近级数展开
atoms
(*types)返回构成当前对象的原子。
cancel
(*gens, **args)参见 sympy.polys 中的取消函数
class_key
()类的好顺序。
coeff
(x[, n, right, _first])返回包含
x**n
的项中的系数。collect
(syms[, func, evaluate, exact, ...])请参阅 sympy.simplify 中的 collect 函数。
combsimp
()请参阅 sympy.simplify 中的 combsimp 函数。
compare
(other)如果对象在规范意义上小于、等于或大于其他对象,则返回 -1、0、1。
compute_leading_term
(x[, logx])已弃用的函数,用于计算级数的首项。
conjugate
()返回 'self' 的复数共轭。
could_extract_minus_sign
()如果 self 以 -1 作为前导因子,或在求和中有比正号更多的负号,则返回 True,否则返回 False。
count
(query)计算匹配的子表达式的数量。
count_ops
([visual])default_args
()doit
(**hints)评估默认情况下不评估的对象,如极限、积分、求和和乘积。
dummy_eq
(other[, symbol])比较两个表达式并处理哑符号。
equals
(other[, failing_expression])如果 self == other 则返回 True,如果不相等则返回 False,或者返回 None。
evalf
([n, subs, maxn, chop, strict, quad, ...])将给定的公式计算到 n 位精度。
expand
([deep, modulus, power_base, ...])使用提示扩展表达式。
extract_additively
(c)如果可以从自身减去 c 并且使所有匹配的系数趋向于零,则返回 self - c,否则返回 None。
extract_branch_factor
([allow_half])尝试以
exp_polar(2*pi*I*n)*z
的方式优雅地表达自身。extract_multiplicatively
(c)如果无法以一种良好的方式将 self 表示为 c * something,即保留 self 参数的属性,则返回 None。
factor
(*gens, **args)参见 sympy.polys.polytools 中的 factor() 函数
find
(query[, group])查找所有匹配查询的子表达式。
fourier_series
([limits])计算自身的傅里叶正弦/余弦级数。
fps
([x, x0, dir, hyper, order, rational, full])计算自身的形式幂级数。
fromiter
(args, **assumptions)从可迭代对象创建一个新对象。
gammasimp
()参见 sympy.simplify 中的 gammasimp 函数
getO
()如果有加法 O(..) 符号,则返回该符号,否则返回 None。
get_target_matrix
([format])门的靶部分矩阵表示。
getn
()返回表达式的顺序。
has
(*patterns)测试是否有任何子表达式匹配任何模式。
has_free
(*patterns)如果 self 包含对象
x
作为自由表达式,则返回 True,否则返回 False。has_xfree
(s)如果 self 有 s 中的任何一个模式作为自由参数,则返回 True,否则返回 False。
integrate
(*args, **kwargs)请参阅 sympy.integrals 中的 integrate 函数。
invert
(g, *gens, **args)返回
self
对g
的乘法逆元,其中self``(和 ``g
)可以是符号表达式。is_algebraic_expr
(*syms)此测试给定的表达式是否在给定的符号 syms 中是代数的。
is_constant
(*wrt, **flags)如果 self 是常量则返回 True,如果不是则返回 False,如果无法明确确定常量性则返回 None。
is_meromorphic
(x, a)此测试表达式是否作为给定符号
x
的函数在点a
处是亚纯的。is_polynomial
(*syms)如果 self 是 syms 中的多项式,则返回 True,否则返回 False。
is_rational_function
(*syms)测试函数是否是给定符号 syms 中的两个多项式的比率。
is_same
(b[, approx])如果 a 和 b 结构相同则返回 True,否则返回 False。
leadterm
(x[, logx, cdir])返回前导项 a*x**b 作为元组 (a, b)。
limit
(x, xlim[, dir])计算极限 x->xlim。
lseries
([x, x0, dir, logx, cdir])用于生成序列项的迭代器的包装器。
match
(pattern[, old])模式匹配。
matches
(expr[, repl_dict, old])用于 match() 的辅助方法,用于在 self 中的通配符符号与 expr 中的表达式之间寻找匹配。
n
([n, subs, maxn, chop, strict, quad, verbose])将给定的公式计算到 n 位精度。
normal
()返回表达式为分数形式。
nseries
([x, x0, n, dir, logx, cdir])如果假设允许,则包装到 _eval_nseries,否则包装到 series。
nsimplify
([constants, tolerance, full])参见 sympy.simplify 中的 nsimplify 函数
powsimp
(*args, **kwargs)请参阅 sympy.simplify 中的 powsimp 函数
primitive
()返回可以从自身每个项中非递归提取的正有理数(即,将自身视为一个加法)。
radsimp
(**kwargs)参见 sympy.simplify 中的 radsimp 函数
ratsimp
()参见 sympy.simplify 中的 ratsimp 函数。
rcall
(*args)通过表达式树递归应用于参数。
refine
([assumption])请参阅 sympy.assumptions 中的 refine 函数。
removeO
()如果存在,移除加性的 O(..) 符号
replace
(query, value[, map, simultaneous, exact])将
self
中匹配的子表达式替换为value
。rewrite
(*args[, deep])使用定义的规则重写 self。
round
([n])返回 x 四舍五入到给定的十进制位数。
separate
([deep, force])参见 sympy.simplify 中的单独函数
series
([x, x0, n, dir, logx, cdir])在
x = x0
附近对 "self" 进行级数展开,当 n=None 时逐项给出级数项(即惰性级数),否则当 n != None 时一次性给出所有项。simplify
(**kwargs)请参阅 sympy.simplify 中的 simplify 函数。
sort_key
([order])subs
(*args, **kwargs)在简化参数后,在表达式中用新内容替换旧内容。
taylor_term
(n, x, *previous_terms)泰勒项的一般方法。
together
(*args, **kwargs)请参阅 sympy.polys 中的 together 函数。
trigsimp
(**args)参见 sympy.simplify 中的 trigsimp 函数
xreplace
(rule)替换表达式中对象的出现。
伴随
as_base_exp
复制
差异
目录
inv
反向
is_hypergeometric
矩阵元素
plot_gate
转置
- sympy.physics.quantum.grover.apply_grover(oracle, nqubits, iterations=None)[源代码][源代码]¶
应用 Grover 算法。
- 参数:
- oracle可调用
当应用于所需量子比特时返回真,否则返回假的未知可调用函数。
- 返回:
- 状态表达式
Grover算法迭代后的结果状态。
示例
将Grover算法应用于2个量子比特的均匀叠加态:
>>> from sympy.physics.quantum.qapply import qapply >>> from sympy.physics.quantum.qubit import IntQubit >>> from sympy.physics.quantum.grover import apply_grover >>> f = lambda qubits: qubits == IntQubit(2) >>> qapply(apply_grover(f, 2)) |2>
- sympy.physics.quantum.grover.grover_iteration(qstate, oracle)[源代码][源代码]¶
应用一次 Oracle 和 W 门,WV。
- 参数:
- qstate量子比特
量子比特的叠加态。
- oracleOracleGate
翻转所需基底量子比特符号的黑箱操作符。
- 返回:
- 量子比特应用Oracle和W门后的量子比特。
示例
执行一次 Grover 算法的一个迭代以观察相位变化:
>>> from sympy.physics.quantum.qapply import qapply >>> from sympy.physics.quantum.qubit import IntQubit >>> from sympy.physics.quantum.grover import OracleGate >>> from sympy.physics.quantum.grover import superposition_basis >>> from sympy.physics.quantum.grover import grover_iteration >>> numqubits = 2 >>> basis_states = superposition_basis(numqubits) >>> f = lambda qubits: qubits == IntQubit(2) >>> v = OracleGate(numqubits, f) >>> qapply(grover_iteration(basis_states, v)) |2>