Python 如何计算复数的模?
我正试图找到一种用Python实现Python 如何计算复数的模?,python,complex-numbers,modular-arithmetic,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 我
(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
,以及不同的组合,虽然在某些情况下有效,但在其他情况下失败。模运算的正确定义是使用floor
而不是round
。您可以在math
或numpy
软件包中找到这一点
编辑
要详细说明为什么round()
和int()
不起作用,当然这与舍入有关
让我们考虑一个整数例子:
5 / 3 = 1.6666...
5 // 3 = 1
5 % 3 = 2
5 == 3 * 1 + 2
现在:
这将不会为5/3
的整数商提供正确的结果
另一方面:
int(5 / 3) == 1 == 5 // 3
在这种情况下会给出正确的商
但如果现在考虑:
-5 / 3 = -1.6666...
-5 // 3 = -2
-5 % 3 = 1
-5 == 3 * (-2) + 1
然后:
以及:
在这种情况下,round()
将给出正确的结果,int()
将不会给出正确的结果
floor()
,被定义为小于输入的最大整数,在这两种情况下都能正确工作。它对复数的作用不同,即使如此,实部也不应为负1。这解释了我试图根据你得到的正确输出做什么。这在什么地方真的有用吗?值得将它添加到Python中吗?是的,它很有用,值得添加,尽管它的用途有些模糊,但考虑到它的简单性,我认为它是值得的。
-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