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
Graviton
quelle
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
layagyasz
quelle
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
6

Python 2, 45 Bytes

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

Probieren Sie es online aus - alle Testfälle

Programmiersprachen verwenden oft jstatt i. Das ist in Python der Fall. Weitere Informationen zum Warum finden Sie in dieser SO-Frage .

mbomb007
quelle
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.

Genisis
quelle
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).

Luis Mendo
quelle
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
Luis Mendo
quelle
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 .

Scott Milner
quelle
1

Pyth, 16 Bytes

=b^Q-Q.j;eS,ebsb
user1502040
quelle
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.

Sean
quelle
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!

betseg
quelle
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
54 Bytes
Ceilingcat
1

Ruby , 25 35 Bytes

BEARBEITEN : Behoben, um der neuen Absolutwertregel zu entsprechen.

->z{(z**(1i-z)).rect.max_by(&:abs)}

Probieren Sie es online aus!

Dadurch wird eine anonyme Funktion erstellt.

Nick Clifford
quelle
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.

pizzapants184
quelle
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.

BLT
quelle
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]]
RosLuP
quelle
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.

Jack P.
quelle