同情的任何方式做整数除法?

Mar*_*som 8 python sympy integer-division

我有一个很长的表达,我认为可以简化,我认为sympy这将是完美的方式.不幸的是,公式依赖于几个整数除法,我找不到任何方法来表示那些sympy.

>>> x=Symbol('x')
>>> (x+1)/2
x/2 + 1/2
Run Code Online (Sandbox Code Playgroud)

显然不是我想要的,1/2不是整数.

>>> (x+1)//2
TypeError: unsupported operand type(s) for //: 'Add' and 'int'
Run Code Online (Sandbox Code Playgroud)

显然sympy不处理//.

>>> Integer((x+1)/2)
#   A long list of error messages, ending with ...
TypeError: Integer can only work with integer expressions.
Run Code Online (Sandbox Code Playgroud)

似乎Integer只是为了处理常数而不是公式.

有一个功能,trunc但它似乎没有做任何类似于我想要的东西.

有没有办法表示整数除法sympy

Wrz*_*mft 6

标准

我假设你想要一个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
Run Code Online (Sandbox Code Playgroud)

您可以使用模运算符实现整数除法,如下所示:

div = lambda x,y: (x-x%y)/y
Run Code Online (Sandbox Code Playgroud)

由于SymPy支持模数算术并且能够简化它,因此该函数通过了上述测试.但是,如果不能进行完全简化,您最终会得到可能不需要的模数表达式.

地板

正如在评论中已经提到的,SymPy提供了一个floor函数,可以用来获取整数除法(这也是//表达式的运算符的实现方式):

div = lambda x,y: sympy.floor(x/y)
Run Code Online (Sandbox Code Playgroud)

但是,floor不支持简化,因此第二次测试失败.