/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠK Math Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġspace . k science . k math . operations Ċ Ċ import Ġspace . k science . k math . misc . Un stable K Math API Ċ Ċ /** Ċ Ġ* ĠAn Ġalgebra ic Ġstructure Ġwhere Ġelements Ġcan Ġhave Ġnumeric Ġrepresentation . Ċ Ġ* Ċ Ġ* Ġ@ param ĠT Ġthe Ġtype Ġof Ġelement Ġof Ġthis Ġstructure . Ċ Ġ*/ Ċ public Ġinterface ĠNumeric Algebra < T > Ġ: ĠAl gebra < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap s Ġa Ġnumber Ġto Ġ[ T ] Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġthe Ġnumber Ġto Ġwrap . ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġnumber ( value : ĠNumber ): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDynamic ally Ġdis patches Ġa Ġbinary Ġoperation Ġwith Ġthe Ġcertain Ġname Ġwith Ġnumeric Ġfirst Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġmust Ġfollow Ġtwo Ġproperties : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠIn Ġcase Ġif Ġoperation Ġis Ġnot Ġdefined Ġin Ġthe Ġstructure , Ġthe Ġfunction Ġthrows Ġ[ kotlin . IllegalStateException ]. ĊĠĠĠĠ Ġ* Ġ 2 . ĠThis Ġfunction Ġis Ġsymmetric Ġwith Ġthe Ġother Ġ[ left Side Number Operation ] Ġoverload : ĊĠĠĠĠ Ġ* Ġi . e . Ġ` left Side Number Operation Function ( a )( b , Ġc ) Ġ== Ġleft Side Number Operation ( a , Ġb )`. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġthe Ġname Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġleft Side Number Operation Function ( operation : ĠString ): Ġ( left : ĠNumber , Ġright : ĠT ) Ġ-> ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġl , Ġr Ġ-> Ġbinary Operation Function ( operation )( number ( l ), Ġr ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDynamic ally Ġinvokes Ġa Ġbinary Ġoperation Ġwith Ġthe Ġcertain Ġname Ġwith Ġnumeric Ġfirst Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġmust Ġfollow Ġtwo Ġproperties : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠIn Ġcase Ġif Ġoperation Ġis Ġnot Ġdefined Ġin Ġthe Ġstructure , Ġthe Ġfunction Ġthrows Ġ[ kotlin . IllegalStateException ]. ĊĠĠĠĠ Ġ* Ġ 2 . ĠThis Ġfunction Ġis Ġsymmetric Ġwith Ġsecond Ġ[ left Side Number Operation ] Ġoverload : ĊĠĠĠĠ Ġ* Ġi . e . Ġ` left Side Number Operation Function ( a )( b , Ġc ) Ġ== Ġleft Side Number Operation ( a , Ġb , Ġc )`. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġthe Ġname Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ param Ġleft Ġthe Ġfirst Ġargument Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ param Ġright Ġthe Ġsecond Ġargument Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġresult Ġof Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġleft Side Number Operation ( operation : ĠString , Ġleft : ĠNumber , Ġright : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġleft Side Number Operation Function ( operation )( left , Ġright ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDynamic ally Ġdis patches Ġa Ġbinary Ġoperation Ġwith Ġthe Ġcertain Ġname Ġwith Ġnumeric Ġfirst Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġmust Ġfollow Ġtwo Ġproperties : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠIn Ġcase Ġif Ġoperation Ġis Ġnot Ġdefined Ġin Ġthe Ġstructure , Ġthe Ġfunction Ġthrows Ġ[ kotlin . IllegalStateException ]. ĊĠĠĠĠ Ġ* Ġ 2 . ĠThis Ġfunction Ġis Ġsymmetric Ġwith Ġthe Ġother Ġ[ right Side Number Operation Function ] Ġoverload : ĊĠĠĠĠ Ġ* Ġi . e . Ġ` right Side Number Operation Function ( a )( b , Ġc ) Ġ== Ġleft Side Number Operation ( a , Ġb , Ġc )`. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġthe Ġname Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġright Side Number Operation Function ( operation : ĠString ): Ġ( left : ĠT , Ġright : ĠNumber ) Ġ-> ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġl , Ġr Ġ-> Ġbinary Operation Function ( operation )( l , Ġnumber ( r )) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDynamic ally Ġinvokes Ġa Ġbinary Ġoperation Ġwith Ġthe Ġcertain Ġname Ġwith Ġnumeric Ġsecond Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġmust Ġfollow Ġtwo Ġproperties : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠIn Ġcase Ġif Ġoperation Ġis Ġnot Ġdefined Ġin Ġthe Ġstructure , Ġthe Ġfunction Ġthrows Ġ[ kotlin . IllegalStateException ]. ĊĠĠĠĠ Ġ* Ġ 2 . ĠThis Ġfunction Ġis Ġsymmetric Ġwith Ġthe Ġother Ġ[ right Side Number Operation Function ] Ġoverload : ĊĠĠĠĠ Ġ* Ġi . e . Ġ` right Side Number Operation Function ( a )( b , Ġc ) Ġ== Ġright Side Number Operation ( a , Ġb , Ġc )`. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġthe Ġname Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ param Ġleft Ġthe Ġfirst Ġargument Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ param Ġright Ġthe Ġsecond Ġargument Ġof Ġoperation . ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġresult Ġof Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġright Side Number Operation ( operation : ĠString , Ġleft : ĠT , Ġright : ĠNumber ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġright Side Number Operation Function ( operation )( left , Ġright ) Ċ } Ċ Ċ /** Ċ Ġ* ĠScale Ġby Ġscalar Ġoperations Ċ Ġ*/ Ċ public Ġinterface ĠScale Operations < T > Ġ: ĠAl gebra < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScaling Ġan Ġelement Ġby Ġa Ġscalar . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġa Ġthe Ġmultiplier . ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġthe Ġmultip lic and . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġproduce . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġscale ( a : ĠT , Ġvalue : ĠDouble ): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMultip lication Ġof Ġthis Ġelement Ġby Ġa Ġscalar . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġmultiplier . ĊĠĠĠĠ Ġ* Ġ@ param Ġk Ġthe Ġmultip lic and . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġproduct . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠT . times ( k : ĠNumber ): ĠT Ġ= Ġscale ( this , Ġk . toDouble ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiv ision Ġof Ġthis Ġelement Ġby Ġscalar . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġdiv id end . ĊĠĠĠĠ Ġ* Ġ@ param Ġk Ġthe Ġdivisor . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġquot ient . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠT . div ( k : ĠNumber ): ĠT Ġ= Ġscale ( this , Ġ 1 . 0 Ġ/ Ġk . toDouble ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMultip lication Ġof Ġthis Ġnumber Ġby Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġmultiplier . ĊĠĠĠĠ Ġ* Ġ@ param Ġb Ġthe Ġmultip lic and . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġproduct . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠNumber . times ( b : ĠT ): ĠT Ġ= Ġb Ġ* Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġcombination Ġof Ġ[ Numeric Algebra ] Ġand Ġ[ Ring ] Ġthat Ġadds Ġintr insic Ġsimple Ġoperations Ġon Ġnumbers Ġlike Ġ` T + 1 ` Ċ Ġ* ĠTODO Ġto Ġbe Ġremoved Ġand Ġreplaced Ġby Ġextensions Ġafter Ġmultiple Ġreceiv ers Ġare Ġthere Ċ Ġ*/ Ċ @ Un stable K Math API Ċ public Ġinterface ĠNumbers Add Operations < T > Ġ: ĠGroup < T >, ĠNumeric Algebra < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd ition Ġof Ġelement Ġand Ġscalar . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġadd end . ĊĠĠĠĠ Ġ* Ġ@ param Ġb Ġthe Ġaug end . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠT . plus ( b : ĠNumber ): ĠT Ġ= Ġthis Ġ+ Ġnumber ( b ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd ition Ġof Ġscalar Ġand Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġadd end . ĊĠĠĠĠ Ġ* Ġ@ param Ġb Ġthe Ġaug end . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠNumber . plus ( b : ĠT ): ĠT Ġ= Ġb Ġ+ Ġthis ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub traction Ġof Ġelement Ġfrom Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġmin u end . ĊĠĠĠĠ Ġ* Ġ@ param Ġb Ġthe Ġsub tr ah end . ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġdifference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠT . minus ( b : ĠNumber ): ĠT Ġ= Ġthis Ġ- Ġnumber ( b ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub traction Ġof Ġnumber Ġfrom Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġmin u end . ĊĠĠĠĠ Ġ* Ġ@ param Ġb Ġthe Ġsub tr ah end . ĊĠĠĠĠ Ġ* Ġ@ receiver Ġthe Ġdifference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun ĠNumber . minus ( b : ĠT ): ĠT Ġ= Ġ- b Ġ+ Ġthis Ċ }