如何计算复数的模数?

How to calculate a modulo of complex numbers?

我正在尝试找到一种在 Python 中执行 (w+xi) % (y+zi) 的方法。

我试过cmath,但它似乎不支持这个。我已经确定它在数学上是可行的并尝试对其进行编程,但是它没有用。代码在下面,我发现问题是在除数之后的某个时候需要四舍五入,但在其他时候这会产生不正确的结果。

def ComplexModulo(a,b):
       x = a/b
       x = round(x.real) + (round(x.imag)*1j)
       z = x*b
       return a-z

我需要一个更好的方法来解决这个问题,因为现在如果我这样做 (8+2j)%(2+1j) 我应该得到 (1+1j),但我却得到 (-1+0j)。我还尝试将 round 更改为 int,以及它们的不同组合,虽然它在某些情况下有效,但在其他情况下却失败了。

modulo 操作的正确定义涉及使用 floor 而不是 round。您可以在 mathnumpy 包中找到它。

编辑

扩展一下为什么 round()int() 不起作用,这当然与四舍五入有关。

让我们考虑一个整数示例:

5 / 3 = 1.6666...
5 // 3 = 1
5 % 3 = 2

5 == 3 * 1 + 2

现在:

round(5 / 3) == 2 != 5 // 3

对于 5 / 3 的整数商不会给出正确的结果。

另一方面:

int(5 / 3) == 1 == 5 // 3

在这种情况下实际上会给出正确的商数。

但如果现在考虑:

-5 / 3 = -1.6666...
-5 // 3 = -2
-5 % 3 = 1

-5 == 3 * (-2) + 1

然后:

int(-5 / 3) == -1 != -5 // 3

和:

round(-5 / 3) == -2 == -5 // 3

在这种情况下,round() 会给出正确的结果,而 int() 不会。

floor(),被定义为小于输入的最大整数,在两种情况下都能正常工作。