複素数のべきを計算する


10

ランダウン

入力xおよびyを指定して、複雑な操作を実行し、対応する結果を出力します。

プログラムのしくみ

  1. z = x + yiという形式の入力xyが与えられると、z i-zを見つけます

  2. z i-zの絶対実数値が絶対虚部より大きい場合、実部を出力します。逆も同様です。両方の値が等しい場合は、値の1つを出力します。

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
プロのヒント:ボーナスを取り除く!
Stewie Griffin


7
複素数を複素数で累乗することは不連続であり、使用するブランチカットに依存します。それを指定できますか?誰もが組み込みの数学演算を使用するだけだと思いますが、それらはおそらくすべて同じ規則を使用しています。
xnor 2017

2
「より大きい」とは、最大値を選択するのではなく(ほとんどの人が想定しているものではなく)、絶対値が最大の値を選択することを意味しますか?のテストケースを-2+i使用できます(z^(i-z)=3-4iそう3>-4vs abs(-4)>abs(3))。
ジョナサンアラン

5
「絶対値」の明確化/変更により、ほとんどの回答が無効になりました。
xnor 2017

回答:


7

ゼリー8 11バイト

ルールの変更で回答を更新してくれたJohnathan Allanに感謝します。

ı_*@µĊ,ḞAÞṪ

オンラインでお試しください!

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

それを作成するı_*@µĊ,ḞAÞṪと、有効なエントリが1つしかない場合があります(たとえば、絶対値で最大値を要求するように変更すると、たとえばで-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の場合です。理由の詳細については、このSOの質問を参照してください。


5

Mathematica、21 22バイト

編集:3 btyesを節約してくれたJungHwan Minに感謝

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)。また、質問では値を出力するように指定されているだけなので、NMax@ReIm[#^(I-#)]&が機能する必要はないと思います。
JungHwan Min 2017


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、403231の 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に、2つのうち大きい方を返します。


1

C(GCC)、93 79 + 4(-lm)= 97 83バイト

@ceilingcatのおかげで14バイト節約されました!

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

ヘッダーを含めると、complex.hそれより長くなります¯\ _(ツ)_ /¯

オンラインでお試しください!


なぜ+4バイトなのか?私は3カウント、 -l、とm
Rɪᴋᴇʀ

正常コンパイル@Rikerであるgcc file.c -o exeので、このフラグは4バイト追加:スペース、-l、およびm。(少なくとも、コンパイル時にこのように数えられると私は考えています。)
betseg 2017

@ceilingcatはそれが可能だとは知らなかった。ありがとう!
betseg



1

TI-Basic、19 16バイト

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

real(そして、imag(2バイトのトークンです。

5+3i:prgmNAME5+3iargmuent、NAMEプログラム名)で実行します。


0

R、38バイト

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

匿名関数。(場合によっては)複素数zを取り、それを指定された累乗にしてmaxReal Im部分とaginary部分のを返します。


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

説明:Complexライブラリーを使用しないことを決定しました。

z=バツ+y=retzz=retバツ+1y=rバツr1yeバツtety1=rバツety1e1ylnrバツt (なので r=elnr

メートルea場所

メートル=rバツety1
a=1ylnrバツt

zz=メートルcosazz=メートルa

cosaa122c2<1

z=1eπeπeπeπt[02π


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.