如何检查复数是否为整数

How to check if complex number is a whole number

给定一个数值 x,您可以这样做 float(x).is_integer() 来检查它是否为整数。有没有办法对复数执行此操作?

我正在尝试使用列表推导式仅取整数有限域上的多项式的整数根。

[r for r in solve(f,domain=FiniteField(p)) if float(r).is_integer()]

但是如果求解函数 returns 复根,这不起作用。

有谁知道如何:检查给定的(可能是复数)是否为整数或知道是否有 SymPy 函数来获取整数有限域上的多项式的根?

float.is_integer(z.real) 告诉你实部是否为整数

如果你想检查虚部是否为零,你可以这样做:

In [17]: a=2 + 2j

In [18]: bool(a.imag)
Out[18]: True

In [19]: b=2 + 0j

In [20]: bool(b.imag)
Out[20]: False

使用 ground_roots 函数和 modulus 关键字参数。这 returns 根模 p,具有多重性。这是一个例子:

>>> from sympy import Symbol, ground_roots
>>> x = Symbol('x')
>>> f = x**5 + 7*x + 1
>>> p = 13
>>> ground_roots(f, modulus=p)
{-5: 1, 4: 2}

也就是说 poly13 的根是 -54,根 4 具有多重性 2 .

顺便说一句,在我看来,这里的复数好像是 red herring:有限域上的整数多项式的根自然不能被视为复数。在原始 post 中对 solve 的调用忽略了 domain 参数,只是给出代数数( 可以 合理地解释为复数) 作为其结果,这可能就是您最终查看复数的原因。但是,当试图找到对素数取模的根时,这些都无济于事 p.

使用你原来问题中的列表理解,可以做到:

roots = [complex(r) for r in solve(f, domain=FiniteField(p))]
int_roots = [z.real for z in roots if z.real.is_integer() and not z.imag]