Berechnen Sie eine komplexe Potenz


10

Der Rundown

Führen Sie bei jeder Eingabe von x und y eine komplexe Operation aus und drucken Sie ein entsprechendes Ergebnis.

Wie sollte Ihr Programm funktionieren?

  1. Bei einer Eingabe von x und y in der Form z = x + yi finden Sie z i-z

  2. Wenn der absolute Realwert von z i-z größer als der absolute Imaginärteil ist, drucken Sie den Realteil. umgekehrt für umgekehrt. Wenn beide Werte gleich sind, drucken Sie einen der Werte.

Beispiel

x: 2
y: 0

Deshalb:

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

Da der Realteil einen größeren absoluten Wert als der Imaginärteil hat, kehrt das Programm zurück

0.192309

Mehr Beispiele

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

10
Pro-Tipp: Den Bonus loswerden!
Stewie Griffin


7
Das Erhöhen komplexer Zahlen zu einer komplexen Potenz ist diskontinuierlich und hängt vom verwendeten Zweigschnitt ab. Können Sie das angeben? Obwohl ich denke, dass jeder nur eingebaute mathematische Operationen verwenden wird und diese wahrscheinlich alle dieselbe Konvention verwenden.
xnor

2
Bedeutet "größer", den Wert mit dem größten absoluten Wert auszuwählen, anstatt (was die meisten angenommen haben) den Maximalwert auszuwählen? Ein Testfall von -2+ikönnte dafür verwendet werden ( z^(i-z)=3-4ialso 3>-4vs abs(-4)>abs(3)).
Jonathan Allan

5
Die Klarstellung / Änderung des "absoluten Werts" hat die meisten Antworten ungültig gemacht.
xnor

Antworten:


7

Gelee , 8 11 Bytes

Vielen Dank an Johnathan Allan für die Aktualisierung der Antwort mit der Änderung der Regeln.

ı_*@µĊ,ḞAÞṪ

Probieren Sie es online aus!

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

Machen Sie es ı_*@µĊ,ḞAÞṪund Sie können auch haben nur ein gültigen Eintrag (angesichts der Änderung des Maximalwert in absoluten Zahlen zu verlangen, so dass zum Beispiel -2+1jkehrt -4.0statt 3.0).
Jonathan Allan


5

Mathematica, 21 22 Bytes

Edit: Danke an JungHwan Min für das Speichern von 3 Btyes

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

Reine Funktion, die eine komplexe Zahl als Argument erwartet. Wenn eine genaue Nummer übergeben wird, wird eine genaue Nummer zurückgegeben (z . B. 1/2gibt Sqrt[2] Cos[Log[2]]). Die Problemspezifikation wurde bearbeitet, nachdem ich meine Lösung veröffentlicht hatte, um anzugeben, dass der absolute Wert verwendet werden soll. Das Beste, was ich mir dafür einfallen lassen kann, sind MaximalBy[ReIm[#^(I-#)],Abs][[1]]&oder Last@MaximalBy[Abs]@ReIm[#^(I-#)]&beide 34Bytes.


1
Maxmuss nicht der Kopf sein. Es gibt den Maximalwert zurück, egal wie tief die Eingabe Listist (z . B. Max[1, {2, {3}}]Rückgabe 3). Außerdem gibt die Frage nur an, dass Sie die Werte drucken, sodass ich nicht glaube, dass Sie sie benötigen würden N: Max@ReIm[#^(I-#)]&würde funktionieren.
JungHwan Min

3

Oktave , 29 Bytes

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

Dies definiert eine anonyme Funktion. Es funktioniert auch in MATLAB.

Probieren Sie es online aus!

Erläuterung

Das elementweise Teilen ( ./) der Zahl z^(i-z)durch das Array [1 i]und das Nehmen des Realteils ergibt ein Array mit dem Real- und Imaginärteil von z^(i-z).


3

MATL , 10 Bytes

Jy-^&ZjhX>

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Erläuterung

Betrachten Sie die Eingabe -2+8ials Beispiel.

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 Byte

Dank @Conor O'Brien ein Byte gespeichert

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

Nimmt die Eingabe als komplexe Zahl für die ZVariable auf.

TI-BASIC verwendet eine eigene Codierung, die Sie hier finden .



1

Perl 6 , 24 Bytes

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

$_ist das möglicherweise komplexe Argument; $_ ** (i - $_)ist der zu berechnende Ausdruck; .realsist eine ComplexMethode, die eine Liste der Real- und Imaginärteile zurückgibt; und gibt schließlich .maxden größeren der beiden zurück.


1

C (GCC), 93 79 + 4 ( -lm) = 97 83 Bytes

14 Bytes dank @ceilingcat gespart!

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

Das Einschließen des Headers complex.hist länger als das ¯ \ _ (ツ) _ / ¯

Probieren Sie es online aus!


Warum +4 Bytes? Ich zähle 3 -, lund m.
Rɪᴋᴇʀ

@Riker normale Compilierung ist gcc file.c -o exe, so dass dieser Flag 4 Bytes ergänzt: Raum, -, l, und m. (Zumindest sehe ich das beim Kompilieren so.)
betseg

@ceilingcat oh wusste nicht, dass das möglich ist. Vielen Dank!
Wetseg



1

TI-Basic, 19 16 Bytes

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

real(und imag(sind Zwei-Byte-Token.

Führen Sie mit 5+3i:prgmNAME( 5+3ials Argument, NAMEals Programmname) aus.


0

R, 38 Bytes

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

Anonyme Funktion. Nimmt eine (möglicherweise) komplexe Zahl z, bringt sie auf die angegebene Potenz und gibt dann maxdie Real- und Imaginären Teile zurück.


0

Axiom, 60 Bytes

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

Testcode und Ergebnisse; Ich folge wie der anderen der Präzedenzfallversion der Frage ...

(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 Bytes

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);}

Lesbar:

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); }

Erläuterung: Es wurde beschlossen, keine komplexen Bibliotheken zu verwenden.

z=x+ichy=reichtzich- -z=(reicht)(- -x+ich(1- -y))=r- -xrich(1- -y)e- -xichtet(y- -1)=r- -xet(y- -1)eich((1- -y)ln(r)- -xt) (wie rich=eichln(r))

Lass dies gleich sein meichein wo

m=r- -xet(y- -1)
ein=(1- -y)ln(r)- -xt

Dann (zich- -z)=mcosein und (zich- -z)=mSündeein

Der maximale Absolutwert kann durch die bestimmt werden cosein und Sündeein Begriffe, wobei diese gleich sind bei 12 (daher der Test 2c2<1).

Wie bereits erwähnt, hängt das Erhöhen auf einen komplexen Exponenten von der Auswahl eines bestimmten Astschnitts ab (z z=1 könnte sein eichπ oder e3ichπ - dies zu erhöhen ich gibt einen Realteil von e- -π oder e- -3π jeweils) habe ich jedoch gerade die Konvention von verwendet t[0,2π) gemäß der Frage.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.