首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应简化(...)的Sympy容器对象

响应简化(...)的Sympy容器对象
EN

Stack Overflow用户
提问于 2021-03-27 16:41:20
回答 1查看 29关注 0票数 1

我正在尝试创建一个包含多个渐近表达式的渐近容器对象,表示量子比特的x,y和z可观测值。

我首先创建了一个扩展sympy.Basic的类。我希望将x、y和z放入渐近参数中会产生一个对象,该对象将通过返回一个简化了x、y和z参数的对象来响应simplify(qubit)。当这不能正常工作时,我重新定义了simplify(self, **kwargs)方法。

有没有比qubit.simplify()更适合使用simplify(qubit)的推荐方法?

代码语言:javascript
复制
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))

给出输出:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-03-27 20:24:43

simplify不是为了简化容器的内容而编写的,但是你可以这样做(或者只对Qubit这样做,如下所示):

代码语言:javascript
复制
>>> 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66829456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档