作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个很长的表达式,我认为它可以被简化,我认为 sympy
将是完成它的完美方式。不幸的是,该公式依赖于几个整数除法,我找不到任何方法来表示 sympy
。
>>> x=Symbol('x')
>>> (x+1)/2
x/2 + 1/2
显然不是我想要的,1/2
不是整数。
>>> (x+1)//2
TypeError: unsupported operand type(s) for //: 'Add' and 'int'
显然 sympy
不处理 //
。
>>> Integer((x+1)/2)
# A long list of error messages, ending with ...
TypeError: Integer can only work with integer expressions.
Integer
似乎只适用于常量,而不适用于公式。
有一个函数 trunc
但它似乎没有做任何与我想要的类似的事情。
在 sympy
中有什么方法可以表示整数除法吗?
最佳答案
我假设您想要一个通过以下测试的函数 div
:
from sympy import sympify, simplify, Symbol
def test_div(div):
# check that div behaves as intended for integers
for i in range(-5,5):
for j in range(-5,5):
if j==0: continue
assert i//j == div(sympify(i),sympify(j))
# check that div’s output can be simplified
x = Symbol("x", integer=True)
assert simplify( div(x+1,2) - div(x-1,2) ) == 1
您可以使用模运算符实现整数除法,如下所示:
div = lambda x,y: (x-x%y)/y
由于 SymPy 支持模运算并且能够简化它,因此该函数通过了上述测试。但是,如果无法完全简化,您最终会得到可能不需要的模表达式。
正如评论中已经提到的,SymPy 提供了一个 floor
函数,可用于获取整数除法(这也是 //
运算符的方式表达式已实现):
div = lambda x,y: sympy.floor(x/y)
但是,floor
不支持简化,因此无法通过第二个测试。
关于python - 有什么办法可以在 sympy 中进行整数除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796658/
我是一名优秀的程序员,十分优秀!