我正在尝试创建一个包含多个渐近表达式的渐近容器对象,表示量子比特的x,y和z可观测值。
我首先创建了一个扩展sympy.Basic的类。我希望将x、y和z放入渐近参数中会产生一个对象,该对象将通过返回一个简化了x、y和z参数的对象来响应simplify(qubit)。当这不能正常工作时,我重新定义了simplify(self, **kwargs)方法。
有没有比qubit.simplify()更适合使用simplify(qubit)的推荐方法?
from sympy import Symbol, cos, sin, Basic
aa = Symbol('aa')
# simplifies to 1
expression_to_simplify = sin(aa)**2 + cos(aa)**2
class Qubit(Basic):
def __new__(cls, qubitnumber, x, y, z):
obj = super().__new__(cls, qubitnumber, x, y, z)
obj.qubitnumber = qubitnumber
return obj
def simplify(self, **kwargs):
from sympy.simplify import simplify
return Qubit(
self.args[0],
simplify(self.args[1]),
simplify(self.args[2]),
simplify(self.args[3])
)
qb = Qubit(1, expression_to_simplify, expression_to_simplify, expression_to_simplify)
print(qb.simplify())
from sympy.simplify import simplify
print(simplify(qb))给出输出:
Qubit(1, 1, 1, 1)
Qubit(1, sin(aa)**2 + cos(aa)**2, sin(aa)**2 + cos(aa)**2, sin(aa)**2 + cos(aa)**2)发布于 2021-03-27 20:24:43
simplify不是为了简化容器的内容而编写的,但是你可以这样做(或者只对Qubit这样做,如下所示):
>>> from sympy import simplify as _simplify
>>> def simplify(x, *y, **k):
... if isinstance(x, Expr): return _simplify(x, *y, **k)
... elif isinstance(x, Qubit): return Qubit(*[_simplify(i, *y, **k) for i in x.args])
... raise NotImplementedError这就为simplify(qb)提供了Qubit(1, 1, 1, 1)。诀窍在于在新的simplify中使用原始simplify作为_simplify。
https://stackoverflow.com/questions/66829456
复制相似问题