Как рассчитать модуль комплексных чисел?

Я пытаюсь найти способ сделать (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()будучи определенным как наибольшее целое число меньше входного, будет работать в обоих сценариях правильно.

Другие вопросы по тегам