package Ġgeometry Ċ Ċ import Ġnumeric . FFT Ċ import Ġoptimization . Simp lex Ċ Ċ class ĠComplex Ġ{ ĊĠĠĠ Ġval Ġx : ĠDouble ĊĠĠĠ Ġval Ġy : ĠDouble ĊĊĠĠĠ Ġconstructor ( x : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( x : ĠDouble , Ġy : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconj (): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( x , Ġ- y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsub ( b : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( x Ġ- Ġb . x , Ġy Ġ- Ġb . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( b : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( x Ġ+ Ġb . x , Ġy Ġ+ Ġb . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( b : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( x Ġ* Ġb . x Ġ- Ġy Ġ* Ġb . y , Ġx Ġ* Ġb . y Ġ+ Ġy Ġ* Ġb . x ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv ( b : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . mul ( b . conj ()). mul ( 1 Ġ/ Ġb . len 2 ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( b : ĠDouble ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( x Ġ* Ġb , Ġy Ġ* Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlen 2 (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġabs (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . sqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnorm (): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( abs () Ġ== Ġ 0 . 0 ) ĠComplex ( 0 , Ġ 0 ) Ġelse Ġmul ( 1 Ġ/ Ġabs ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcross ( b : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ* Ġb . y Ġ- Ġy Ġ* Ġb . x ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcross 2 ( b : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconj (). mul ( b ). y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdot ( b : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ* Ġb . x Ġ+ Ġy Ġ* Ġb . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdot 2 ( b : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconj (). mul ( b ). x ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġarg (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . atan 2 ( y , Ġx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrot 9 0 (): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex (- y , Ġx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate ( p : ĠComplex , Ġangle : ĠDouble ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġp . sub ( this ). mul ( exp ( Complex ( 0 , Ġangle ))). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate 2 ( p : ĠComplex , Ġangle : ĠDouble ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġp ĊĠĠĠĠĠĠĠ Ġp Ġ= Ġp . sub ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġcs : ĠDouble Ġ= ĠMath . cos ( angle ) ĊĠĠĠĠĠĠĠ Ġval Ġsn : ĠDouble Ġ= ĠMath . sin ( angle ) ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex ( p . x Ġ* Ġcs Ġ- Ġp . y Ġ* Ġsn , Ġp . x Ġ* Ġsn Ġ+ Ġp . y Ġ* Ġcs ). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreflect ( p : ĠComplex , Ġq : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġq . sub ( p ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsub ( p ). div ( s ). conj (). mul ( s ). add ( p ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproj ( p : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdot ( p ) Ġ/ Ġabs () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Complex Ġ[ x =$ x , Ġy =$ y ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpolar ( r : ĠDouble , Ġtheta : ĠDouble ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComplex ( r Ġ* ĠMath . cos ( theta ), Ġr Ġ* ĠMath . sin ( theta )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġexp ( a : ĠComplex ): ĠComplex Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpolar ( Math . exp ( a . x ), Ġa . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle ( a : ĠComplex , Ġp : ĠComplex , Ġb : ĠComplex ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġa . sub ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġb . sub ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMath . atan 2 ( a . cross ( b ), Ġa . dot ( b )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUsage Ġexample ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String ?> ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġz Ġ= ĠComplex ( 3 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz Ġ= Ġz . div ( z ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( z ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Ġ= ĠComplex ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠComplex ( 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġu . rotate ( v , ĠMath . PI Ġ* Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġv . rot 9 0 (). rot 9 0 () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( b ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ