You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展SymPy符号类实现二进制变量的XOR加法逻辑?

自定义SymPy二进制变量实现XOR加法

问题

需要扩展SymPy的Symbol类实现二进制变量,让+运算符模拟XOR运算,满足以下规则:

  • x + y → 保留为x + y
  • x + y + x → y
  • x + x → 0

尝试添加_eval_add方法但未被触发,现有代码如下:

from sympy import Symbol, Integer

class XorBinary(Symbol):
    
    def _eval_power(self, other):
        if other % 2 == 0:
            return Integer(1)
        elif self == other:
            return Integer(0)
        else:
            return self
        
    def _eval_add(self, other):
        print("add", self, other)
        if self == other:
            return Integer(0)
        return self

# Example usage
x = XorBinary("x")
y = XorBinary("y")

print("x^2  =", x**2)   # -> 1
print("x^3  =", x**3)   # -> x
print("x^0  =", x**0)   # -> 1
print("x*x  =", x*x)    # -> x
print("x+x  =", x + x)  # -> x
print("x+y  =", x+y)    # normal sum (unless XOR enforced)
print("x+y+x  =", x+y+x)# -> y 

原因分析

SymPy中Symbol属于Atom类(不可拆分的基础符号),当两个Atom实例相加时,默认会直接创建Add对象,不会触发_eval_add方法。_eval_add通常用于处理当前对象与非Atom类型(如整数、复杂表达式)的加法场景,因此自定义逻辑未被执行。

解决方案

要实现同类型二进制变量的XOR加法逻辑,需重载__add__方法处理同类型相加场景,同时结合SymPy的表达式化简能力处理多步相加的情况。还要补充__radd__处理反向加法(如0 + x),保证逻辑一致性。

修改后的代码:

from sympy import Symbol, Integer, Add

class XorBinary(Symbol):
    
    def _eval_power(self, other):
        if other % 2 == 0:
            return Integer(1)
        elif self == other:
            return Integer(0)
        else:
            return self
        
    def __add__(self, other):
        # 相同变量相加返回0
        if isinstance(other, XorBinary) and self == other:
            return Integer(0)
        # 不同变量相加返回Add对象,由SymPy自动处理后续化简
        elif isinstance(other, XorBinary):
            return Add(self, other)
        # 其他情况交给父类处理
        return super().__add__(other)
    
    # 处理反向加法场景
    def __radd__(self, other):
        if other == 0:
            return self
        return self.__add__(other)

# 测试
x = XorBinary("x")
y = XorBinary("y")

print("x^2  =", x**2)   # 输出: x^2  = 1
print("x^3  =", x**3)   # 输出: x^3  = x
print("x^0  =", x**0)   # 输出: x^0  = 1
print("x*x  =", x*x)    # 输出: x*x  = x
print("x+x  =", x + x)  # 输出: x+x  = 0
print("x+y  =", x+y)    # 输出: x+y  = x + y
print("x+y+x  =", x+y+x)# 输出: x+y+x  = y

说明

  1. 重载__add__直接处理两个XorBinary实例的相加逻辑,相同变量返回0,不同变量返回Add对象,SymPy会自动完成多步相加中的重复项化简。
  2. __radd__保证反向加法场景的逻辑一致性,避免出现0 + x不符合预期的情况。
  3. 保留原有的_eval_power方法,维持二进制变量的幂运算规则。

内容的提问来源于stack exchange,提问作者albusSimba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:12:44