【问题标题】:How to calculate a modulo of complex numbers?如何计算复数的模?
【发布时间】:2019-02-06 12:17:50
【问题描述】:

我正在尝试找到一种在 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。这解释了我要做什么quora.com/How-do-I-find-Modulo-of-complex-numbers
  • 根据WolframAlpha 你得到正确的输出。
  • 这在某处真的有用吗?值得将此添加到 Python 中吗?
  • 是的,它很有用,值得添加,虽然它的用途有些晦涩,但鉴于它的简单性,我认为它值得。

标签: python complex-numbers modular-arithmetic


【解决方案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(),被定义为小于输入的最大整数,在这两种情况下都可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多