/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . complex Numbers Ċ import Ġkotlinx . c interop .* Ċ import Ġplatform . posix .* Ċ import Ġkotlin . math . sqrt Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . random . Random Ċ import Ġplatform . Foundation .* Ċ import Ġplatform . darwin .* Ċ Ċ actual Ġtype alias ĠComplex Number Ġ= ĠComplex Ċ Ċ actual Ġclass ĠComplex Numbers Benchmark Ġactual Ġconstructor () Ġ{ ĊĠĠĠ Ġval Ġcomplex Numbers Sequence Ġ= Ġgenerate Numbers Sequence () ĊĊĠĠĠ Ġfun Ġrandom Number () Ġ= ĠRandom . next Double ( 0 . 0 , Ġbenchmark Size . toDouble ()) ĊĊĠĠĠ Ġactual Ġfun Ġgenerate Numbers Sequence (): ĠList < Complex > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Complex >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. benchmark Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Complex ( random Number (), Ġrandom Number ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġsum Complex () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . map Ġ{ Ġit . add ( it ) Ġ}. reduce Ġ{ Ġacc , Ġit Ġ-> Ġacc . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġsub Complex () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . map Ġ{ Ġit . sub ( it ) Ġ}. reduce Ġ{ Ġacc , Ġit Ġ-> Ġacc . sub ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġclass Inheritance () Ġ{ ĊĠĠĠĠĠĠĠĠ Ġclass ĠIn verted Number ( val Ġvalue : ĠDouble ) Ġ: ĠCustom Number Protocol , ĠNSObject () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd ( other : ĠCustom Number Protocol ) Ġ: ĠCustom Number Protocol Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠIn verted Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn verted Number (- value Ġ+ Ġsqrt ( other . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Expected Ġobject Ġof ĠIn verted Number Ġclass ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsub ( other : ĠCustom Number Protocol ) Ġ: ĠCustom Number Protocol Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠIn verted Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn verted Number (- value Ġ- Ġsqrt ( other . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Expected Ġobject Ġof ĠIn verted Number Ġclass ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠIn verted Number ( 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. benchmark Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( In verted Number ( random Number ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . sub ( In verted Number ( random Number ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġcategory Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . map Ġ{ Ġit . mul ( it ) Ġ}. reduce Ġ{ Ġacc , Ġit Ġ-> Ġacc . mul ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . map Ġ{ Ġit . div ( it ) Ġ}. reduce Ġ{ Ġacc , Ġit Ġ-> Ġacc . mul ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġstring To Obj C () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Format ("% . 1 lf | %. 1 lf ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġstring From Obj C () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomplex Numbers Sequence . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . description ()?. split (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrevert ( number : ĠInt , Ġlg : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( number Ġand Ġ( 1 Ġshl Ġi ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġor Ġ 1 Ġshl Ġ( lg Ġ- Ġi Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġprivate Ġfun Ġfft Routine ( invert : Boolean Ġ= Ġfalse ): ĠArray < Complex > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlg Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(( 1 Ġshl Ġlg ) Ġ< Ġcomplex Numbers Sequence . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlg ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= Ġcomplex Numbers Sequence . to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġsequence . forEach Indexed Ġ{ Ġindex , Ġnumber Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġrevert ( index , Ġlg ) Ġ&& Ġrevert ( index , Ġlg ) Ġ< Ġcomplex Numbers Sequence . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence [ index ] Ġ= Ġsequence [ revert ( index , Ġlg )]. also Ġ{ Ġsequence [ revert ( index , Ġlg )] Ġ= Ġsequence [ index ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġlength Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( length Ġ< Ġcomplex Numbers Sequence . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġ 2 Ġ* ĠPI Ġ/ Ġlength Ġ* Ġif Ġ( invert ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠComplex ( cos ( angle ), Ġsin ( angle )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcomplex Numbers Sequence . size Ġ/ Ġ 2 Ġstep Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= ĠComplex ( 1 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġlength / 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġsequence [ i Ġ+ Ġj ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġsequence [ i Ġ+ Ġj Ġ+ Ġlength / 2 ]. mul ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence [ i Ġ+ Ġj ] Ġ= Ġ( first . add ( second ) Ġas ĠComplex ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence [ i Ġ+ Ġj Ġ+ Ġlength / 2 ] Ġ= Ġ( first . sub ( second ) Ġas ĠComplex ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue . mul ( base ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength Ġ= Ġlength Ġshl Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġfft () Ġ{ ĊĠĠĠĠĠĠĠ Ġfft Routine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġinvert F ft () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= Ġfft Routine ( true ) ĊĊĠĠĠĠĠĠĠ Ġsequence . forEach Indexed Ġ{ Ġindex , Ġnumber Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence [ index ] Ġ= Ġnumber . div ( Complex ( sequence . size . toDouble (), Ġ 0 . 0 )) Ġ?: ĠComplex ( 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ