package Ġcom . te cac et . k omp lex Ċ Ċ import Ġkotlin . math .* Ċ Ċ fun Ġis Even ( i : ĠInt ) Ġ= Ġi Ġ% Ġ 2 Ġ== Ġ 0 ĊĊ Ċ /** Ċ Ġ* ĠComplex Ġunit Ġ= Ġ 0 Ġ+ Ġi Ċ Ġ*/ Ċ val Ġi Ġ= ĠComplex ( 0 . 0 , Ġ 1 . 0 ) Ċ Ċ /** Ċ Ġ* ĠComplex Ġnorm Ċ Ġ*/ Ċ fun Ġabs ( c : ĠComplex ): ĠDouble Ġ= Ġc . abs () Ċ Ċ /** Ċ Ġ* ĠComplex Ġexponential Ċ Ġ*/ Ċ fun Ġexp ( c : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠ Ġval Ġe Ġ= Ġexp ( c . real ) ĊĠĠĠ Ġreturn ĠComplex ( e Ġ* Ġcos ( c . img ), Ġe Ġ* Ġsin ( c . img )) Ċ } Ċ Ċ /** Ċ Ġ* ĠHyper b olic Ġs ine Ċ Ġ*/ Ċ fun Ġsin h ( c : ĠComplex ) Ġ= Ġ( exp ( c ) Ġ- Ġexp (- c )) Ġ/ Ġ 2 Ċ Ċ /** Ċ Ġ* ĠHyper b olic Ġcos ine Ċ Ġ*/ Ċ fun Ġcos h ( c : ĠComplex ) Ġ= Ġ( exp ( c ) Ġ+ Ġexp (- c )) Ġ/ Ġ 2 Ċ Ċ /** Ċ Ġ* ĠHyper b olic Ġtangent Ċ Ġ*/ Ċ fun Ġt anh ( c : ĠComplex ) Ġ= Ġsin h ( c ) Ġ/ Ġcos h ( c ) Ċ Ċ /** Ċ Ġ* ĠHyper b olic Ġc ot ang ent Ċ Ġ*/ Ċ fun Ġco th ( c : ĠComplex ) Ġ= Ġcos h ( c ) Ġ/ Ġsin h ( c ) Ċ Ċ /** Ċ Ġ* ĠComplex Ġcos ine Ċ Ġ*/ Ċ fun Ġcos ( c : ĠComplex ) Ġ= Ġ( exp ( i Ġ* Ġc ) Ġ+ Ġexp (- i Ġ* Ġc )) Ġ/ Ġ 2 . 0 Ċ Ċ /** Ċ Ġ* ĠComplex Ġs ine Ċ Ġ*/ Ċ fun Ġsin ( c : ĠComplex ) Ġ= Ġi Ġ* Ġ( exp (- i Ġ* Ġc ) Ġ- Ġexp ( i Ġ* Ġc )) Ġ/ Ġ 2 . 0 Ċ Ċ /** Ċ Ġ* ĠComplex Ġtangent Ċ Ġ*/ Ċ fun Ġtan ( c : ĠComplex ) Ġ= Ġsin ( c ) Ġ/ Ġcos ( c ) Ċ Ċ /** Ċ Ġ* ĠComplex Ġc ot ang ent Ċ Ġ*/ Ċ fun Ġc ot ( c : ĠComplex ) Ġ= Ġcos ( c ) Ġ/ Ġsin ( c ) Ċ Ċ /** Ċ Ġ* ĠComplex Ġsec ant Ċ Ġ*/ Ċ fun Ġsec ( c : ĠComplex ) Ġ= ĠComplex . ONE Ġ/ Ġcos ( c ) Ċ Ċ /** Ċ Ġ* ĠThe Ġnatural Ġlog arith m Ġon Ġthe Ġprincipal Ġbranch Ċ Ġ*/ Ċ fun Ġln ( c : ĠComplex ) Ġ= ĠComplex ( ln ( c . abs ()), Ġc . phase ()) Ċ Ċ /** Ċ Ġ* ĠRoot s Ġof Ġun ity Ċ Ġ*/ Ċ fun Ġroots ( n : ĠInt ) Ġ= ĊĠĠĠ Ġ( 1 Ġ.. n ). map Ġ{ Ġexp ( i * 2 * PI * it / n ) Ġ} Ċ Ċ operator Ġfun ĠNumber . plus ( c : ĠComplex ) Ġ= ĠComplex ( this . toDouble () Ġ+ Ġc . real , Ġc . img ) Ċ Ċ operator Ġfun ĠNumber . minus ( c : ĠComplex ) Ġ= ĠComplex ( this . toDouble () Ġ- Ġc . real , Ġ- c . img ) Ċ Ċ operator Ġfun ĠNumber . times ( c : ĠComplex ) Ġ= ĠComplex ( this . toDouble () Ġ* Ġc . real , Ġthis . toDouble () Ġ* Ġc . img ) Ċ Ċ operator Ġfun ĠNumber . div ( c : ĠComplex ) Ġ= ĠComplex . ONE Ġ/ Ġc Ċ Ċ /** Ċ Ġ* ĠDefines Ġcomplex Ġnumbers Ġand Ġtheir Ġalgebra ic Ġoperations Ċ Ġ* Ġ@ param Ġreal Ġthe Ġreal Ġcomponent Ċ Ġ* Ġ@ param Ġimg Ġthe Ġimag inary Ġcomponent Ċ Ġ*/ Ċ class ĠComplex ( val Ġreal : ĠDouble , Ġval Ġimg : ĠDouble ) Ġ{ ĊĊĠĠĠ Ġconstructor ( real : ĠNumber , Ġimg : ĠNumber ) Ġ: Ġthis ( real . toDouble (), Ġimg . toDouble ()) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( other Ġis ĠComplex Ġ&& Ġreal Ġ== Ġother . real Ġ&& Ġimg Ġ== Ġother . img ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreal . hashCode () Ġ* Ġ 3 1 Ġ+ Ġimg . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġunary Minus () Ġ= ĠComplex (- real , Ġ- img ) ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( c : ĠComplex ) Ġ= ĠComplex ( real Ġ+ Ġc . real , Ġimg Ġ+ Ġc . img ) ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( n : ĠNumber ) Ġ= ĠComplex ( real Ġ+ Ġn . toDouble (), Ġimg ) ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( c : ĠComplex ) Ġ= ĠComplex ( real Ġ- Ġc . real , Ġimg Ġ- Ġc . img ) ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( n : ĠNumber ) Ġ= ĠComplex ( real Ġ- Ġn . toDouble (), Ġimg ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( c : ĠComplex ) Ġ= ĠComplex ( real Ġ* Ġc . real Ġ- Ġimg Ġ* Ġc . img , Ġreal Ġ* Ġc . img Ġ+ Ġimg Ġ* Ġc . real ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( n : ĠNumber ) Ġ= ĠComplex ( n . toDouble () Ġ* Ġreal , Ġn . toDouble () Ġ* Ġimg ) ĊĊĠĠĠ Ġoperator Ġfun Ġdiv ( n : ĠNumber ) Ġ= ĠComplex ( real Ġ/ Ġn . toDouble (), Ġimg Ġ/ Ġn . toDouble ()) ĊĊĠĠĠ Ġoperator Ġfun Ġdiv ( c : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġden Ġ= Ġc . norm Squared () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Pract ically Zero ( den )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ/ Ġ 0 Ġ// TO Ġmake Ġthis Ġconsistent Ġwith Ġdivision Ġby Ġzero Ġnumber ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġthis Ġ* Ġc . conj ug ate () ĊĠĠĠĠĠĠĠ Ġreturn Ġnum Ġ/ Ġden ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġcomponent 1 () Ġ= Ġreal ĊĠĠĠ Ġoperator Ġfun Ġcomponent 2 () Ġ= Ġimg ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComplex Ġconj ug ate Ġ= Ġx - y * i ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconj ug ate () Ġ= ĠComplex ( real , Ġ- img ) ĊĊĠĠĠ Ġfun Ġnorm Squared () Ġ= Ġreal Ġ* Ġreal Ġ+ Ġimg Ġ* Ġimg ĊĊĠĠĠ Ġfun Ġabs (): ĠDouble Ġ= Ġsqrt ( this . norm Squared ()) ĊĊĠĠĠ Ġfun Ġphase (): ĠDouble Ġ= Ġatan ( img Ġ/ Ġreal ) ĊĊĠĠĠ Ġfun Ġpow ( a : ĠDouble ) Ġ= Ġexp ( ln ( this ) Ġ* Ġa ) ĊĊĠĠĠ Ġfun Ġpow ( a : ĠNumber ) Ġ= Ġexp ( ln ( this ) Ġ* Ġa ) ĊĊĠĠĠ Ġfun Ġpow ( a : ĠComplex ) Ġ= Ġexp ( ln ( this ) Ġ* Ġa ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pract ically Zero ( img ) Ġ-> Ġ"$ real " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pract ically Zero ( real ) Ġ-> Ġ"${ img } i " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ġ< Ġ 0 Ġ-> Ġ"$ real -${ - img } i " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"${ real } + ${ img } i " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Pract ically Zero ( d : ĠDouble ) Ġ= Ġabs ( d ) Ġ< ĠDEFAULT _ TO LER ANCE ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠComplex Ġ 0 Ġ= Ġ 0 Ġ+ Ġ 0 i ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠZERO Ġ= ĠComplex ( 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠComplex Ġ 1 Ġ= Ġ 1 Ġ+ Ġ 0 i ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠONE Ġ= ĠComplex ( 1 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ TO LER ANCE Ġ= Ġ 1 . 0 E - 1 5 ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Number ( n : ĠNumber ) Ġ= ĠComplex ( n . toDouble (), Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Pol ar ( radius : ĠDouble , Ġtheta : ĠDouble ) Ġ: Complex Ġ Ġ= radius * exp ( i * theta ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġif Ġthe Ġnorm Ġof Ġthe Ġcomplex Ġnumber Ġis Ġsmaller Ġthan Ġthe Ġgiven Ġtolerance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Zero ( tolerance : ĠDouble ) Ġ= Ġthis . abs () Ġ< Ġtolerance ĊĊĠĠĠ Ġin fix Ġfun Ġto ( exponent : ĠInt ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exponent Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( exponent Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhalf Ġ= Ġto ( exponent Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Even ( exponent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhalf Ġ* Ġhalf ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhalf Ġ* Ġhalf Ġ* Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun Ġto ( exponent : ĠComplex ) Ġ= Ġthis . pow ( exponent ) ĊĊĠĠĠ Ġin fix Ġfun Ġto ( exponent : ĠNumber ) Ġ= Ġthis . pow ( exponent ) Ċ } Ċ