如何扩展SymPy符号类实现二进制变量的XOR加法逻辑?
自定义SymPy二进制变量实现XOR加法
问题
需要扩展SymPy的Symbol类实现二进制变量,让+运算符模拟XOR运算,满足以下规则:
x + y→ 保留为x + yx + y + x→yx + 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
说明
- 重载
__add__直接处理两个XorBinary实例的相加逻辑,相同变量返回0,不同变量返回Add对象,SymPy会自动完成多步相加中的重复项化简。 __radd__保证反向加法场景的逻辑一致性,避免出现0 + x不符合预期的情况。- 保留原有的
_eval_power方法,维持二进制变量的幂运算规则。
内容的提问来源于stack exchange,提问作者albusSimba
相关产品推荐
相关产品推荐

