如何计算复数的模?

时间:2019-02-06 12:17:51

标签: python complex-numbers modular-arithmetic

我正在尝试找到一种在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,并进行了不同的组合,尽管它在某些情况下有效,但在其他情况下却失败了。

1 个答案:

答案 0 :(得分:1)

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()被定义为小于输入的最大整数,将在两种情况下都能正常工作。