我正在尝试找到一种在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
,并进行了不同的组合,尽管它在某些情况下有效,但在其他情况下却失败了。
答案 0 :(得分:1)
modulo
操作的正确定义涉及使用floor
而不是round
。您可以在math
或numpy
软件包中找到它。
要扩大为什么 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()
被定义为小于输入的最大整数,将在两种情况下都能正常工作。