@ file : Jvm Name (" Discrete Math ") Ċ @ file : Jvm Mult if ile Class Ċ Ċ package Ġcom . mar cin mos k ala . math Ċ Ċ /** Ċ Ġ* ĠCart esian Ġproduct Ġof Ġa Ġlist Ġwith Ġitself , Ġspecify Ġthe Ġnumber Ġof Ġrepet itions Ġwith Ġthe Ġoptional Ġrepeat Ġkeyword Ġargument . Ċ Ġ* ĠFor Ġexample , ĠA . cart esian Product ( repeat = 4 ) Ġmeans Ġthe Ġsame Ġas ĠA . cart esian Product ( A , ĠA , ĠA ). Ċ Ġ* ĠThrows Ġan Ġ[ IllegalArgumentException ]: Ġif Ġ[ repeat ] Ġis Ġless Ġor Ġequals Ġto Ġ 0 Ċ Ġ* ĠThrows Ġan Ġ[ IllegalArgumentException ]: Ġif Ġsize Ġof Ġresult Ġshould Ġexceeds Ġ[ Int . MAX _ VALUE ] Ċ Ġ*/ Ċ fun Ġ< T > ĠList < T >. cart esian Product ( repeat : ĠInt Ġ= Ġ 2 ): ĠSequence < List < T >> Ġ{ ĊĠĠĠ Ġrequire ( repeat Ġ> Ġ 0 ) Ġ{ Ġ" Parameter Ġrepeat Ġshould Ġbe Ġgreater Ġthan Ġ 0 " Ġ} ĊĠĠĠ Ġreturn Ġproduct (* Array ( repeat ) Ġ{ Ġthis Ġ}) Ċ } Ċ Ċ /** Ċ Ġ* ĠCart esian Ġproduct Ġof Ġlists . Ċ Ġ* ĠThrows Ġan Ġ[ IllegalArgumentException ]: Ġif Ġsize Ġof Ġresult Ġshould Ġexceeds Ġ[ Int . MAX _ VALUE ] Ċ Ġ*/ Ċ fun Ġ< T > ĠList < T >. cart esian Product ( var arg Ġlists : ĠList < T >): ĠSequence < List < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġproduct ( this , Ġ* lists ) Ċ Ċ private Ġfun Ġ< T > Ġproduct ( var arg Ġiter ables : ĠList < T >): ĠSequence < List < T >> Ġ= Ġsequence Ġ{ ĊĊĠĠĠ Ġrequire ( iter ables . map Ġ{ Ġit . size . to Long () Ġ}. reduce ( Long :: times ) Ġ<= ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Cartesian Ġproduct Ġfunction Ġcan Ġproduce Ġresult Ġwhose Ġsize Ġdoes Ġnot Ġexceed ĠInt . MAX _ VALUE " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠnumberOf Iter ables Ġ= Ġiter ables . size ĊĠĠĠ Ġval Ġlst Lengths Ġ= ĠArrayList < Int >() ĊĠĠĠ Ġval Ġlst Remaining Ġ= ĠArrayList ( listOf ( 1 )) ĊĊĠĠĠ Ġiter ables . reversed (). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġlst Lengths . add ( 0 , Ġit . size ) ĊĠĠĠĠĠĠĠ Ġlst Remaining . add ( 0 , Ġit . size Ġ* Ġlst Remaining [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġn Products Ġ= Ġlst Remaining . remove At ( 0 ) ĊĊĠĠĠ Ġ( 0 Ġuntil Ġn Products ). forEach Ġ{ Ġproduct Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < T >() ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil ĠnumberOf Iter ables ). forEach Ġ{ Ġiterable Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Index Ġ= Ġproduct Ġ/ Ġlst Remaining [ iterable Index ] Ġ% Ġlst Lengths [ iterable Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( iter ables [ iterable Index ][ element Index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġyield ( result . toList ()) ĊĠĠĠ Ġ} Ċ }