Вычислить сложную мощность


10

Краткое изложение

Для любого ввода x и y выполните сложную операцию и выведите соответствующий результат.

Как ваша программа должна работать

  1. Учитывая входные данные x и y в виде z = x + yi , найдите z i-z

  2. Если абсолютное действительное значение z i-z больше, чем абсолютная мнимая часть, выведите вещественную часть; наоборот, наоборот. Если оба значения равны, выведите одно из значений.

пример

x: 2
y: 0

Следовательно:

z = 2
z^(i-z) ~= 0.192309 + 0.159740i

Поскольку действительная часть имеет большее абсолютное значение, чем мнимая часть, программа возвращает

0.192309

Больше примеров

z = 1+i >> 0.5
z = i >> 1
z = 0.5 >> 1.08787
z = -2+8i >> 2.22964E7
z = -10i >> 3.13112E7

10
Pro-tip: избавьтесь от бонуса!
Стьюи Гриффин


7
Повышение комплексных чисел до комплексной степени прерывисто и зависит от используемого сокращения ветвей. Можете ли вы указать это? Хотя я думаю, что все будут просто использовать встроенные математические операции, и, вероятно, все они используют одно и то же соглашение.
xnor

2
Означает ли «большее» выбрать значение с наибольшим абсолютным значением, а не (что большинство предположило) выбрать максимальное значение? Тестовый пример -2+iможет быть использован для этого ( z^(i-z)=3-4iтак 3>-4против abs(-4)>abs(3)).
Джонатан Аллан

5
Уточнение / изменение «абсолютного значения» лишило законной силы большинство ответов.
xnor

Ответы:


7

Желе , 8 11 байт

Спасибо Джонатану Аллану за обновление ответа с изменением правил.

ı_*@µĊ,ḞAÞṪ

Попробуйте онлайн!

ı_*@        z^(i-z)
    µ       new monadic link
     Ċ,Ḟ    pair real and imaginary parts
        AÞṪ sort by absolute value and take last value

Сделайте это, ı_*@µĊ,ḞAÞṪи у вас вполне может быть единственно допустимая запись (учитывая, что для изменения требуется максимальное значение в абсолютном выражении, например, которое -2+1jвозвращает, -4.0а не 3.0).
Джонатан Аллан

6

Python 2, 45 байт

def f(z):z=z**(1j-z);print max(z.real,z.imag)

Попробуйте онлайн - все тестовые случаи

Языки программирования часто используют jвместо i. Так обстоит дело в Python. Посмотрите этот ТАК вопрос для получения дополнительной информации о том, почему.


5

Mathematica, 21 22 байта

Изменить: Спасибо JungHwan Мин за сохранение 3 байт

Max@ReIm[#^(I-#)]&

Чистая функция, которая ожидает комплексное число в качестве аргумента. Если передано точное число, то будет возвращено точное число (например, 1/2дает Sqrt[2] Cos[Log[2]]). Спецификация проблемы была отредактирована после того, как я опубликовал свое решение, чтобы указать, что следует использовать абсолютное значение. Лучшее, что я могу придумать для этого, MaximalBy[ReIm[#^(I-#)],Abs][[1]]&или Last@MaximalBy[Abs]@ReIm[#^(I-#)]&оба 34байта.


1
Maxне нужно быть головой. Он возвращает максимальное значение независимо от глубины ввода List(например, Max[1, {2, {3}}]возвращает 3). Кроме того, вопрос только указывает, что вы печатаете значения, так что я не думаю, что вам это понадобится N: Max@ReIm[#^(I-#)]&будет работать.
JungHwan Мин

3

Октава , 29 байт

@(z)max(real(z^(i-z)./[1 i]))

Это определяет анонимную функцию. Это работает и в MATLAB.

Попробуйте онлайн!

объяснение

Поэлементное деление ( ./) числа z^(i-z)на массив [1 i]и взятие действительной части дает массив с действительной и мнимой частями z^(i-z).


3

MATL , 10 байт

Jy-^&ZjhX>

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Рассмотрим ввод -2+8iв качестве примера.

J     % Push i (imaginary unit)
      % STACK: i
y     % Implicit input. Duplicate from below
      % STACK: -2+8i, i, -2+8i
-     % Subtract
      % STACK: -2+8i, 2-7i
^     % Power
      % STACK: 3168271.58+22296434.47i
&Zj   % Real and imaginary parts
      % STACK: 3168271.58, 22296434.47
h     % Concatenate
      % STACK: [3168271.58 22296434.47]
X>    % Maximum. Implicitly display
      % STACK: 22296434.47

2

TI-BASIC, 40 , 32 , 31 29 байт

Сохраненный байт благодаря @Conor O'Brien

Z^(i-Z→A                   #Perform operation, store as A, 8 bytes
:real(A)>imag(A            #Test if real part is greater than imaginary, 9 bytes
:Ansreal(A)+imag(Anot(Ans  #Determine output and print, 12 bytes

Принимает ввод как комплексное число на Z переменную .

TI-BASIC использует свою собственную кодировку, вы можете найти ее здесь .



1

Perl 6 , 24 байта

{($_**(i-$_)).reals.max}

$_возможно сложный аргумент; $_ ** (i - $_)является выражением, которое будет вычислено; .realsэто Complexметод, который возвращает список действительных и мнимых частей; и, наконец, .maxвозвращает большее из двух.


1

C (GCC) 93 79 + 4 ( -lm) = 97 83 байта

Сохранено 14 байтов благодаря @ceilingcat!

float f(_Complex z){z=cpow(z,csqrt(-1)-z);return cimag(z)>creal(z)?cimag(z):z;}

Включение заголовка complex.hдлиннее, чем ¯ \ _ (ツ) _ / ¯

Попробуйте онлайн!


Почему +4 байта? Я считаю 3, -, l, и m.
17

@Riker нормального компилирование gcc file.c -o exe, поэтому этот флаг добавляет 4 байт: пространство, -, l, и m. (По крайней мере, я так считаю при компиляции.)
betseg

@ceilingcat ой не знал, что это возможно. Спасибо!
betseg



1

TI-Basic, 19 16 байтов

Ans^(i-Ans
max(real(Ans),imag(Ans

real(и imag(являются двухбайтовыми токенами.

Запустить с 5+3i:prgmNAME( 5+3iбыть аргументом, NAMEименем программы)


0

R, 38 байт

pryr::f({z=z^(1i-z);max(Re(z),Im(z))})

Анонимная функция. Принимает (возможно) комплексное число z, переводит его в указанную степень, а затем возвращает maxвсе Reи все Imдополнительные части.


0

Аксиома, 60 байт

f(z:Complex Float):Float==(y:=z^(%i-z);max(real(y),imag(y)))

код теста и результаты; Я следую, как другой, прецедентный вариант вопроса ...

(28) -> [[k,f(k)] for k in [1+%i,%i,1,-2+8*%i,-10*%i]]
   (28)
   [[1.0 + %i,0.5], [%i,1.0], [1.0,1.0],
    [- 2.0 + 8.0 %i,22296434.4737098688 53],
    [- 10.0 %i,31311245.9804955291 66]]

0

C # - 189 байт

double f(double x, double y){double r,t,m,c;r=Math.Sqrt(x*x+y*y);t=Math.Atan2(y,x);m=Math.Pow(r,-x)*Math.Exp(y*t-t);c=Math.Cos((1-y)*Math.Log(r)-t*x);return m*(2*c*c<1?Math.Sqrt(1-c*c):c);}

Удобочитаемый:

double f(double x, double y){
double r, t, m, c;
r = Math.Sqrt(x * x + y * y);
t = Math.Atan2(y, x);
m = Math.Pow(r, -x) * Math.Exp(y * t - t);
c = Math.Cos((1 - y) * Math.Log(r) - t * x);
return m * (2 * c * c < 1 ? Math.Sqrt(1 - c * c) : c); }

Объяснение: Решил не использовать никаких сложных библиотек.

Zзнак равноИкс+яYзнак равнореяTZя-Zзнак равно(реяT)(-Икс+я(1-Y))знак равнор-Иксря(1-Y)е-ИксяTеT(Y-1)знак равнор-ИксеT(Y-1)ея((1-Y)пер(р)-ИксT) (в виде рязнак равноеяпер(р))

Пусть это будет равно меяa где

мзнак равнор-ИксеT(Y-1)
aзнак равно(1-Y)пер(р)-ИксT

затем (Zя-Z)знак равномсозa а также (Zя-Z)знак равномгрехa

Максимальное абсолютное значение может быть определено созa а также грехa условия, при этом они равны в 12 (отсюда и тест 2с2<1).

Как уже упоминалось, повышение до сложного показателя зависит от выбора конкретного среза ветви (например, Zзнак равно1 может быть еяπ или е3яπ - поднимать это до я дает реальную часть е-π или е-3π соответственно), однако, я только что использовал соглашение T[0,2π) согласно вопросу.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.