Как рассчитать модуль комплексных чисел?
Я пытаюсь найти способ сделать (w+xi) % (y+zi)
в Python.
я пытался 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 ответ
Правильное определение 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()
будучи определенным как наибольшее целое число меньше входного, будет работать в обоих сценариях правильно.