Hitung kekuatan yang kompleks


10

The Rundown

Diberikan input x dan y , lakukan operasi yang kompleks, dan cetak hasil yang sesuai.

Bagaimana program Anda seharusnya bekerja

  1. Diberikan input x dan y dalam bentuk z = x + yi , cari z i-z

  2. Jika nilai riil absolut dari z i-z lebih besar dari bagian imajiner absolut, cetaklah bagian asli; sebaliknya untuk sebaliknya. Jika kedua nilai sama, cetak salah satu nilai.

Contoh

x: 2
y: 0

Karena itu:

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

Karena bagian nyata memiliki nilai absolut yang lebih besar daripada bagian imajiner, program kembali

0.192309

Lebih banyak contoh

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: singkirkan bonus!
Stewie Griffin


7
Menaikkan bilangan kompleks ke daya kompleks tidak terputus dan tergantung pada cabang yang digunakan. Bisakah Anda menentukannya? Meskipun saya kira semua orang hanya akan menggunakan operasi matematika built-in dan mereka semua mungkin menggunakan konvensi yang sama.
xnor

2
Apakah "lebih besar" berarti memilih nilai dengan nilai absolut terbesar, daripada (apa yang diasumsikan sebagian besar) untuk memilih nilai maksimal? Kasus uji -2+idapat digunakan untuk itu ( z^(i-z)=3-4ijadi 3>-4vs abs(-4)>abs(3)).
Jonathan Allan

5
Klarifikasi / perubahan "nilai absolut" telah membatalkan sebagian besar jawaban.
xnor

Jawaban:


7

Jelly , 8 11 byte

Terima kasih Johnathan Allan untuk memperbarui jawaban dengan perubahan peraturan.

ı_*@µĊ,ḞAÞṪ

Cobalah online!

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

Buatlah ı_*@µĊ,ḞAÞṪdan Anda mungkin hanya memiliki satu-satunya entri yang valid (mengingat perubahan membutuhkan nilai maksimal dalam istilah absolut, sehingga, misalnya, -2+1jmengembalikan -4.0daripada 3.0).
Jonathan Allan

6

Python 2, 45 byte

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

Coba online - semua test case

Bahasa pemrograman sering digunakan jsebagai gantinya i. Itu adalah kasus dengan Python. Lihat pertanyaan SO ini untuk informasi lebih lanjut tentang alasannya.


5

Mathematica, 21 22 byte

Sunting: Terima kasih kepada JungHwan Min karena telah menghemat 3 btyes

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

Fungsi murni yang mengharapkan bilangan kompleks sebagai argumen. Jika angka pastinya dilewati, maka angka pastinya akan dikembalikan (mis. 1/2Memberi Sqrt[2] Cos[Log[2]]). Spec masalah telah diedit setelah saya memposting solusi saya untuk menentukan bahwa nilai absolut harus digunakan. Yang terbaik yang bisa saya pikirkan adalah MaximalBy[ReIm[#^(I-#)],Abs][[1]]&atau Last@MaximalBy[Abs]@ReIm[#^(I-#)]&, kedua 34byte.


1
Maxtidak perlu menjadi kepala. Ini mengembalikan nilai max tidak peduli seberapa dalam input List(misalnya Max[1, {2, {3}}]mengembalikan 3). Selain itu, pertanyaannya hanya menentukan bahwa Anda mencetak nilai, jadi saya tidak berpikir Anda akan perlu N: Max@ReIm[#^(I-#)]&akan bekerja.
JungHwan Min

3

Oktaf , 29 byte

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

Ini mendefinisikan fungsi anonim. Ia bekerja di MATLAB juga.

Cobalah online!

Penjelasan

Elemen-bijaksana membagi ( ./) angka z^(i-z)dengan array [1 i]dan mengambil bagian yang nyata memberikan array dengan bagian nyata dan imajiner z^(i-z).


3

MATL , 10 byte

Jy-^&ZjhX>

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input -2+8isebagai contoh.

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

Menyimpan satu byte berkat @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

Mengambil input sebagai bilangan kompleks pada Zvariabel.

TI-BASIC menggunakan penyandian sendiri, Anda dapat menemukannya di sini .



1

Perl 6 , 24 byte

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

$_adalah argumen yang mungkin rumit; $_ ** (i - $_)adalah ekspresi yang harus dihitung; .realsadalah Complexmetode yang mengembalikan daftar bagian nyata dan imajiner; dan akhirnya .maxmengembalikan yang lebih besar dari keduanya.


1

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

Disimpan 14 byte berkat @ceilingcat!

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

Termasuk tajuk complex.hlebih panjang dari itu ¯ \ _ (ツ) _ / ¯

Cobalah online!


Mengapa +4 byte? Aku menghitung 3, -, l, dan m.
Rɪᴋᴇʀ

Kompilasi yang normal @Riker adalah gcc file.c -o exe, sehingga bendera ini menambahkan 4 bytes: ruang, -, l, dan m. (Setidaknya itulah yang saya lihat saat menghitung.)
betseg

@ceilingcat oh tidak tahu itu mungkin. Terima kasih!
betseg



1

TI-Basic, 19 16 byte

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

real(dan imag(merupakan token dua byte.

Jalankan dengan 5+3i:prgmNAME( 5+3imenjadi argmuent, NAMEmenjadi nama program.)


0

R, 38 byte

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

Fungsi anonim. Mengambil (mungkin) bilangan kompleks z, membawanya ke daya yang ditentukan, dan kemudian mengembalikan maxbagian Real dan Imaginary.


0

Aksioma, 60 byte

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

kode uji dan hasil; saya ikuti sebagai yang lain versi preseden dari pertanyaan ...

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

Dapat dibaca:

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

Penjelasan: Memutuskan untuk tidak menggunakan perpustakaan yang kompleks.

z=x+sayay=resayatzsaya-z=(resayat)(-x+saya(1-y))=r-xrsaya(1-y)e-xsayatet(y-1)=r-xet(y-1)esaya((1-y)dalam(r)-xt) (sebagai rsaya=esayadalam(r))

Biarkan ini sama dengan mesayaSebuah dimana

m=r-xet(y-1)
Sebuah=(1-y)dalam(r)-xt

Kemudian (zsaya-z)=mcosSebuah dan (zsaya-z)=mdosaSebuah

Nilai absolut maksimum dapat ditentukan oleh cosSebuah dan dosaSebuah istilah, dengan ini sama di 12 (karenanya tes 2c2<1).

Seperti disebutkan, menaikkan ke eksponen kompleks tergantung pada pemilihan cabang tertentu (mis z=1 bisa jadi esayaπ atau e3sayaπ - Mengangkat ini ke saya memberikan bagian nyata dari e-π atau e-3π masing - masing), namun, saya baru saja menggunakan konvensi t[0,2π) sesuai pertanyaan.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.