/* Ċ Ġ* Ġkotlin - pe - solutions Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġsh un su ke . t sum ori Ċ Ġ* Ċ Ġ* ĠReleased Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ġsee Ġhttps :// opensource . org / licenses / MIT Ċ Ġ*/ ĊĊ Ċ package Ġcom . example . kotlin pes olution s . solver . p 0 0 1 _ 1 0 0 Ċ Ċ import Ġcom . example . kotlin pes olution s . solver . Project Euler Solver Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . math . BigInteger Ċ Ċ @ Component Ċ class ĠP 0 9 4 Solver Ġ: ĠProject Euler Solver Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcount Solutions (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// TODO Ġrefactor ĊĠĠĠ Ġprivate Ġfun Ġcount Solutions (): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġans Ġ= ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= ĠBigInteger . valueOf ( 5 0 0 _ 0 0 0 _ 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠBigInteger . valueOf ( 3 L ) ĊĊĠĠĠĠĠĠĠ Ġval Ġa 0 Ġ= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġa 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Ġ= ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= ĠBigInteger . ONE ĊĊĠĠĠĠĠĠĠ Ġvar Ġp N Ġ= Ġa ĊĠĠĠĠĠĠĠ Ġvar Ġp Nm 1 Ġ= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠ Ġvar Ġq N Ġ= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠ Ġvar Ġq Nm 1 Ġ= ĠBigInteger . ZERO ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġans Ġ+= Ġget Length If Is Match ( p N , Ġq N ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Ġ= Ġd Ġ* Ġa Ġ- Ġm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ= Ġ( n Ġ- Ġm Ġ* Ġm ) Ġ/ Ġd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġ( a 0 Ġ+ Ġm ) Ġ/ Ġd ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Nm 2 Ġ= Ġp Nm 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Nm 1 Ġ= Ġp N ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Nm 2 Ġ= Ġq Nm 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq Nm 1 Ġ= Ġq N ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp N Ġ= Ġa Ġ* Ġp Nm 1 Ġ+ Ġp Nm 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq N Ġ= Ġa Ġ* Ġq Nm 1 Ġ+ Ġq Nm 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p N Ġ> Ġmax X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġans ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Length If Is Match ( p N : ĠBigInteger , Ġq N : ĠBigInteger ): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthree Ġ= ĠBigInteger . valueOf ( 3 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( p N Ġ* Ġp N Ġ- Ġthree Ġ* Ġq N Ġ* Ġq N Ġ!= ĠBigInteger . ONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( p N . times ( BigInteger . TWO ). plus ( BigInteger . ONE ). remainder ( three ) Ġ== ĠBigInteger . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġp N . times ( BigInteger . TWO ). plus ( BigInteger . ONE ). divide ( three ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġa . times ( three ). plus ( BigInteger . ONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( l Ġ>= Ġthree ) Ġl Ġelse ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( p N . times ( BigInteger . TWO ). minus ( BigInteger . ONE ). remainder ( three ) Ġ== ĠBigInteger . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġp N . times ( BigInteger . TWO ). minus ( BigInteger . ONE ). divide ( three ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġa . times ( three ). minus ( BigInteger . ONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( l Ġ>= Ġthree ) Ġl Ġelse ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠBigInteger . ZERO ĊĠĠĠ Ġ} Ċ } Ċ