package Ġch ol iver . n esp ot . common Ċ Ċ import Ġkotlin . math . absolute Value Ċ Ċ data Ġclass ĠRational Ġprivate Ġconstructor ( val Ġa : ĠInt , Ġval Ġb : ĠInt ) Ġ{ ĊĠ Ġoperator Ġfun Ġplus ( rhs : ĠRational ) Ġ= Ġof ( a Ġ* Ġrhs . b Ġ+ Ġb Ġ* Ġrhs . a , Ġb Ġ* Ġrhs . b ) ĊĠ Ġoperator Ġfun Ġplus ( rhs : ĠInt ) Ġ= Ġof ( a Ġ+ Ġb Ġ* Ġrhs , Ġb ) ĊĠ Ġoperator Ġfun Ġminus ( rhs : ĠRational ) Ġ= Ġof ( a Ġ* Ġrhs . b Ġ- Ġb Ġ* Ġrhs . a , Ġb Ġ* Ġrhs . b ) ĊĠ Ġoperator Ġfun Ġminus ( rhs : ĠInt ) Ġ= Ġof ( a Ġ- Ġb Ġ* Ġrhs , Ġb ) ĊĠ Ġoperator Ġfun Ġtimes ( rhs : ĠRational ) Ġ= Ġof ( a Ġ* Ġrhs . a , Ġb Ġ* Ġrhs . b ) ĊĠ Ġoperator Ġfun Ġtimes ( rhs : ĠInt ) Ġ= Ġof ( a Ġ* Ġrhs , Ġb ) ĊĠ Ġoperator Ġfun Ġdiv ( rhs : ĠRational ) Ġ= Ġof ( a Ġ* Ġrhs . b , Ġb Ġ* Ġrhs . a ) ĊĠ Ġoperator Ġfun Ġdiv ( rhs : ĠInt ) Ġ= Ġof ( a , Ġb Ġ* Ġrhs ) ĊĠ Ġoperator Ġfun Ġcompare To ( rhs : ĠRational ) Ġ= Ġ( a Ġ* Ġrhs . b ) Ġ- Ġ( b Ġ* Ġrhs . a ) ĊĠ Ġoperator Ġfun Ġcompare To ( rhs : ĠInt ) Ġ= Ġa Ġ- Ġ( b Ġ* Ġrhs ) ĊĠ Ġoperator Ġfun Ġunary Minus () Ġ= Ġof (- a , Ġb ) ĊĠ Ġ/** ĠRound s Ġtowards Ġzero . Ġ*/ ĊĠ Ġfun Ġto Int () Ġ= Ġ( a Ġ/ Ġb ) ĊĠ Ġfun Ġto Double () Ġ= Ġ( a . toDouble () Ġ/ Ġb . toDouble ()) ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" ($ a , Ġ$ b )" ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġof ( a : ĠInt , Ġb : ĠInt Ġ= Ġ 1 ): ĠRational Ġ{ ĊĠĠĠĠĠ Ġ// ĠEnsure Ġdenominator Ġis Ġalways Ġpositive ĊĠĠĠĠĠ Ġval Ġd Ġ= Ġgcd ( a . absolute Value , Ġb . absolute Value ) ĊĠĠĠĠĠ Ġreturn ĠRational ( ĊĠĠĠĠĠĠĠ Ġ( if Ġ( b Ġ< Ġ 0 ) Ġ- a Ġelse Ġa ) Ġ/ Ġd , ĊĠĠĠĠĠĠĠ Ġb . absolute Value Ġ/ Ġd ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgcd ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġvar Ġx Ġ= Ġa ĊĠĠĠĠĠ Ġvar Ġy Ġ= Ġb ĊĠĠĠĠĠ Ġwhile Ġ( y Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġx Ġ% Ġy ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġt ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġx ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ