在 Sympy 中实现自定义数据类型

Implementing a custom datatype in Sympy

提问人:Pastafarianist 提问时间:12/3/2016 最后编辑:Pastafarianist 更新时间:12/4/2016 访问量:331

问:

我想用二进制运算 () 进行计算,该运算采用两个非交换参数,将它们转换为类似一对的东西,然后在将这些对相乘时做一些有趣的事情。Tensor

# a, b, c, d are non-commutative
Tensor(a, b) * Tensor(c, d) == Tensor(a*c, d*b)  # yes, in this order

此外,我希望所有整数常数都取模 2。

-Tensor(a, b) == Tensor(a, b)
2*Tensor(a, b) == 0
Tensor(2*a, b) == 0

我这样做的镜头:

import sympy as sp
from sympy.core.expr import Expr

class Tensor(Expr):
    __slots__ = ['is_commutative']

    def __new__(cls, l, r):
        l = sp.sympify(l)
        r = sp.sympify(r)
        obj = Expr.__new__(cls, l, r)
        obj.is_commutative = False
        return obj

    def __neg__(self):
        return self

    def __mul__(self, other):
        if isinstance(other, Tensor):
            return Tensor(self.args[0] * other.args[0], other.args[1] * self.args[1])
        elif other.is_number:
            if other % 2 == 0:
                return 0
            else:
                return self
        else:
            return sp.Mul(self, other)


x, y = sp.symbols('x, y', commutative=False)

Ym = Tensor(y, 1) - Tensor(1, y)
Yp = Tensor(y, 1) + Tensor(1, y)
Xm = Tensor(x, 1) - Tensor(1, x)

d1 = Ym * Yp + Xm * 0
print(d1)
print(sp.expand(d1))

d2 = Xm * Ym
print(d2)
print(sp.expand(d2))

输出:

(Tensor(1, y) + Tensor(y, 1))**2
Tensor(1, y**2) + 2*Tensor(y, y) + Tensor(y**2, 1)
(Tensor(1, x) + Tensor(x, 1))*(Tensor(1, y) + Tensor(y, 1))
Tensor(1, x)*Tensor(1, y) + Tensor(1, x)*Tensor(y, 1) + Tensor(x, 1)*Tensor(1, y) + Tensor(x, 1)*Tensor(y, 1)
  • 测试 #1 是正确的。
  • 测试 #2 有一个项应该为零(因为我正在执行所有计算模 2,并且 2 % 2 == 0)。我该如何强制执行?2*Tensor(y, y)
  • 测试 #3 是正确的。
  • 测试 #4 根本不会乘以不同的 s。 例如,应该是 ,应该是。我该如何强制执行?TensorTensor(1, x)*Tensor(1, y)Tensor(1, y*x)

上下文(如果你对我为什么要这样做感兴趣):

这是为了计算代数在场上的双模分辨率。代数在域上的双模分辨率是同一代数在其包络代数上的最小投影分辨率。这里的意思是“乘法在相反的方向上起作用”。包络代数对代数有左和右作用:char=2RKRR⊗R^opop

(a⊗b)*r == a*r*b
r*(a⊗b) == b*r*a

有一个定理可以简化计算,在已知域上代数的最小投影分辨率的情况下。尽管如此,它们还是很乏味的,我想停止手动执行它们。

Python 数学 对称

评论

0赞 Pastafarianist 12/25/2016
在这里概述了一个解决方案。

答: 暂无答案