/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠL ars ĠT enn st ed t Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . github . lt enn st ed t . fin n math . linear . matrix Ċ Ċ import Ġcom . mar cin mos k ala . math . per mutations Ċ import Ġio . github . lt enn st ed t . fin n math . linear . field . Quot ient Field Ċ import Ġio . github . lt enn st ed t . fin n math . linear . vector . Abstract Vector Ċ import Ġio . github . lt enn st ed t . fin n math . linear . vector . Vector Entry Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Math Context Ċ import Ġjava . util . Objects Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġmatrices Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġtype Ġof Ġelements Ċ Ġ* Ġ@ param ĠQ Ġtype Ġof Ġthe Ġquot ient Ċ Ġ* Ġ@ param ĠV Ġtype Ġof Ġthe Ġvector Ċ Ġ* Ġ@ param ĠM Ġtype Ġof Ġthe Ġmatrix Ċ Ġ* Ġ@ param ĠN Ġtype Ġof Ġthe Ġmaximum Ġabsolute Ġcolumn Ġsum Ġnorm , Ġmaximum Ġabsolute Ġrow Ġsum Ġnorm Ġand Ġthe Ġmaximum Ġnorm Ċ Ġ* Ġ@ param ĠB Ġtype Ġof Ġthe Ġsquare Ġof Ġthe Ġnorm s Ċ Ġ* Ġ@ property Ġentries Ġentries Ċ Ġ* Ġ@ constructor ĠConstructs Ġan Ġ[ Abstract Matrix ] Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ entries ] Ġis Ġempty Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ row Indices ] Ġ` != Ġexpected Row Indices ` Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Indices ] Ġ` != Ġexpected Column Indices ` Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġone Ġvalue Ġof Ġ[ entries ] Ġis Ġnull Ċ Ġ* Ġ@ author ĠL ars ĠT enn st ed t Ċ Ġ* Ġ@ since Ġ 0 . 0 . 1 Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠAbstract Matrix < ĊĠĠĠ ĠE Ġ: ĠNumber , ĊĠĠĠ ĠQ Ġ: ĠNumber , ĊĠĠĠ ĠV Ġ: ĠAbstract Vector < E , ĠQ , ĠV , Ġ*, Ġ* >, ĊĠĠĠ ĠM Ġ: ĠAbstract Matrix < E , ĠQ , ĠV , ĠM , ĠN , ĠB >, ĊĠĠĠ ĠN , ĊĠĠĠ ĠB ĊĠĠĠ Ġ>( ĊĠĠĠ Ġentries : ĠList < Matrix Entry < E >> Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnt ries ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġentries : ĠList < Matrix Entry < E >> Ġ= Ġentries . sorted () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġsquare ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Square : ĠBoolean Ġget () Ġ= Ġrow Size Ġ== Ġcolumn Size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġtri angular ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Tri angular : ĠBoolean Ġget () Ġ= Ġis Upper Tri angular Ġ|| Ġis Lower Tri angular ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġupper Ġtri angular ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Upper Tri angular : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentries . filter Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> Ġi Ġ> Ġj Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ Ġthis . quot ient Field . equality By Comp aring ( it , Ġquot ient Field . zero ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġlower Ġtri angular ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Lower Tri angular : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentries . filter Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> Ġi Ġ< Ġj Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ Ġthis . quot ient Field . equality By Comp aring ( it , Ġquot ient Field . zero ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġdiagonal ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Diag onal : ĠBoolean Ġget () Ġ= Ġis Upper Tri angular Ġ&& Ġis Lower Tri angular ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġthe Ġidentity Ġone ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Identity : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Diag onal Ġ&& Ġdiagonal Elements . all Ġ{ Ġquot ient Field . equality By Comp aring ( it , Ġquot ient Field . zero ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġinvert ible ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġval ĠisIn vert ible : ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġsymmetric ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Symmetric : ĠBoolean Ġby Ġlazy Ġ{ Ġis Square Ġ&& Ġequals By Comp aring ( transpose ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġif Ġthis Ġis Ġskew Ġsymmetric ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Sk ew Symmetric : ĠBoolean Ġby Ġlazy Ġ{ Ġis Square Ġ&& Ġtranspose (). equals By Comp aring ( neg ate ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRow Ġindices ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġrow Indices : ĠList < Int > Ġby Ġlazy Ġ{ Ġthis . entries . map Ġ{ Ġit . rowIndex Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠColumn Ġindices ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġcolumn Indices : ĠList < Int > Ġby Ġlazy Ġ{ Ġthis . entries . map Ġ{ Ġit . column Index Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠElements ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġelements : ĠList < E > Ġby Ġlazy Ġ{ Ġthis . entries . map Ġ{ Ġit . element Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiag onal Ġelements ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġdiagonal Elements : ĠList < E > Ġby Ġlazy Ġ{ Ġthis . entries . filter Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> Ġi Ġ== Ġj Ġ}. map Ġ{ Ġit . element Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiag onal Ġ[ Matrix Entries ][ Matrix Entry ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġdiagonal Entries : ĠList < Matrix Entry < E >> Ġby Ġlazy Ġ{ Ġthis . entries . filter Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> Ġi Ġ== Ġj Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRow Ġsize ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġrow Size : ĠInt Ġget () Ġ= Ġrow Indices . size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠColumn Ġsize ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġcolumn Size : ĠInt Ġget () Ġ= Ġcolumn Indices . size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠField ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġval Ġquot ient Field : ĠQu ot ient Field < E , ĠQ , ĠV , ĠM > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( entries . isNotEmpty ()) Ġ{ Ġ" expected Ġentries Ġnot Ġbe Ġempty Ġbut Ġentries Ġ= Ġ$ entries " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Row Indices Ġ= Ġ( 1 .. row Size ). toList () ĊĠĠĠĠĠĠĠ Ġrequire ( row Indices Ġ== Ġexpected Row Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġrow Indices Ġ== Ġexpected Row Indices Ġbut Ġ$ row Indices Ġ!= Ġ$ expected Row Indices " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Column Indices Ġ= Ġ( 1 .. column Size ). toList () ĊĠĠĠĠĠĠĠ Ġrequire ( column Indices Ġ== Ġexpected Column Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġcolumn Indices Ġ== Ġexpected Column Indices Ġbut Ġ$ column Indices Ġ!= Ġ$ expected Column Indices " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġsum Ġof Ġthis Ġand Ġthe Ġ[ sum mand ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ row Size ] Ġ!= Ġ` sum mand . row Size ` ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` sum mand . column Size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġadd ( sum mand : ĠM ): ĠM Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( row Size Ġ== Ġsum mand . row Size ) Ġ{ Ġ" Equal Ġrow Ġsizes Ġexpected Ġbut Ġ$ row Size Ġ!= Ġ${ sum mand . row Size }" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( column Size Ġ== Ġsum mand . column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Equal Ġcolumn Ġsizes Ġexpected Ġbut Ġ$ column Size Ġ!= Ġ${ sum mand . column Size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . matrix Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> ĠMatrix Entry ( i , Ġj , Ġquot ient Field . addition ( e , Ġsum mand [ i , Ġj ])) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġdifference Ġof Ġthis Ġand Ġthe Ġ[ sub tr ah end ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ row Size ] Ġ!= Ġ` sub tr ah end . row Size ` ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` sub tr ah end . column Size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġsubtract ( sub tr ah end : ĠM ): ĠM Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( row Size Ġ== Ġsub tr ah end . row Size ) Ġ{ Ġ" Equal Ġrow Ġsizes Ġexpected Ġbut Ġ$ row Size Ġ!= Ġ${ sub tr ah end . row Size }" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( column Size Ġ== Ġsub tr ah end . column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Equal Ġcolumn Ġsizes Ġexpected Ġbut Ġ$ column Size Ġ!= Ġ${ sub tr ah end . column Size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . matrix Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> ĠMatrix Entry ( i , Ġj , Ġquot ient Field . sub traction ( e , Ġsub tr ah end [ i , Ġj ])) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġproduct Ġof Ġthis Ġand Ġthe Ġ[ factor ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` factor . row Size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġmultiply ( factor : ĠM ): ĠM Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( column Size Ġ== Ġfactor . row Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Equal Ġcolumn Ġsizes Ġexpected Ġbut Ġ$ column Size Ġ!= Ġ${ factor . row Size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . matrix Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġ( 1 .. column Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġc Ġ-> Ġquot ient Field . multip lication ( this [ i , Ġc ], Ġfactor [ c , Ġj ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> Ġquot ient Field . addition ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix Entry ( i , Ġj , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġproduct Ġof Ġthis Ġand Ġthe Ġ[ vector ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` vector . size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġmultiply Vector ( vector : ĠV ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( column Size Ġ== Ġvector . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" column Size Ġ== Ġvector . size Ġexpected Ġbut Ġ$ column Size Ġ!= Ġ${ vector . size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . vector Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġ_, Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġ( 1 .. column Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġc Ġ-> Ġquot ient Field . multip lication ( this [ i , Ġc ], Ġvector [ c ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> Ġquot ient Field . addition ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVector Entry ( i , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġscalar Ġproduct Ġof Ġthis Ġand Ġthe Ġ[ scalar ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġscalar Multiply ( scalar : ĠE ): ĠM Ġ= Ġquot ient Field . matrix Constructor ( ĊĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> ĠMatrix Entry ( i , Ġj , Ġquot ient Field . multip lication ( scalar , Ġe )) Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġneg ated Ġ[ Abstract Matrix ] Ġand Ġthis ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġneg ate (): ĠM Ġ= Ġscalar Multiply ( quot ient Field . neg ation ( quot ient Field . one )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġtrace ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġ` this ` Ġis Ġnot Ġsquare ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġtrace (): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( is Square ) Ġ{ Ġ" square Ġmatrix Ġexpected Ġbut Ġ$ row Size Ġ!= Ġ$ column Size " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Diag onal Elements () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġdetermin ant ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġdetermin ant (): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( is Square ) Ġ{ Ġ" expected Ġsquare Ġmatrix Ġbut Ġ$ row Size Ġ!= Ġ$ column Size " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Tri angular Ġ-> Ġadd Diag onal Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ> Ġ 3 Ġ-> Ġle ib n iz Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ== Ġ 3 Ġ-> Ġrule Of S arr us () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdetermin ant Of 2 x 2 Matrix () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġtranspose ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġtranspose (): ĠM Ġ= Ġquot ient Field . matrix Constructor ( entries . map Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> ĠMatrix Entry ( j , Ġi , Ġe ) Ġ}) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġminor Ġdependent Ġon Ġthe Ġ[ rowIndex ] Ġand Ġ[ column Index ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ rowIndex ] Ġ! in Ġ 1 .. [ row Size ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Index ] Ġ! in Ġ 1 .. [ column Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġminor ( rowIndex : ĠInt , ĠcolumnIndex : ĠInt ): ĠM Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġin Ġ 1 .. row Size ) Ġ{ Ġ" expected ĠrowIndex Ġin Ġ 1 .. $ row Size Ġbut ĠrowIndex Ġ= Ġ$ rowIndex " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( column Index Ġin Ġ 1 .. column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected ĠcolumnIndex Ġin Ġ 1 .. $ column Size Ġbut ĠcolumnIndex Ġ= Ġ$ column Index " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . matrix Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . map Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew RowIndex Ġ= Ġif Ġ( i Ġ>= ĠrowIndex ) Ġi Ġ- Ġ 1 Ġelse Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Column Index Ġ= Ġif Ġ( j Ġ>= ĠcolumnIndex ) Ġj Ġ- Ġ 1 Ġelse Ġj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix Entry ( new RowIndex , Ġnew Column Index , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġabsolute Ġcolumn Ġsum Ġnorm ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġmax Abs Column Sum Norm (): ĠN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġabsolute Ġcolumn Ġsum Ġnorm Ġbased Ġon Ġthe Ġ[ math Context ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġmax Abs Column Sum Norm ( math Context : ĠMath Context ): ĠN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġabsolute Ġrow Ġsum Ġnorm ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġmax Abs Row Sum Norm (): ĠN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġabsolute Ġrow Ġsum Ġnorm Ġbased Ġon Ġthe Ġ[ math Context ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġmax Abs Row Sum Norm ( math Context : ĠMath Context ): ĠN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġsquare Ġof Ġthe Ġf ro ben ius Ġnorm ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġf ro ben ius Norm Pow 2 (): ĠB ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġf ro ben ius Ġnorm Ġbased Ġon Ġthe Ġ[ math Context ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġf ro ben ius Norm ( math Context : ĠMath Context ): ĠBigDecimal ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġnorm ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġmax Norm (): ĠN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġelement Ġat Ġthe Ġ[ rowIndex ] Ġand Ġ[ column Index ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ rowIndex ] Ġ! in Ġ 1 .. [ row Size ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Index ] Ġ! in Ġ 1 .. [ column Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun Ġget ( rowIndex : ĠInt , ĠcolumnIndex : ĠInt ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġin Ġ 1 .. row Size ) Ġ{ Ġ" expected ĠrowIndex Ġin Ġ 1 .. $ row Size Ġbut ĠrowIndex Ġ= Ġ$ rowIndex " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( column Index Ġin Ġ 1 .. column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected ĠcolumnIndex Ġin Ġ 1 .. $ column Size Ġbut ĠcolumnIndex Ġ= Ġ$ column Index " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis [ rowIndex , ĠcolumnIndex ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Matrix Entry ] Ġat Ġthe Ġ[ rowIndex ] Ġand Ġ[ column Index ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ rowIndex ] Ġ! in Ġ 1 .. [ row Size ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Index ] Ġ! in Ġ 1 .. [ column Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġentry ( rowIndex : ĠInt , ĠcolumnIndex : ĠInt ): ĠMatrix Entry < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġin Ġ 1 .. row Size ) Ġ{ Ġ" expected ĠrowIndex Ġin Ġ 1 .. $ row Size Ġbut ĠrowIndex Ġ= Ġ$ rowIndex " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( column Index Ġin Ġ 1 .. column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected ĠcolumnIndex Ġin Ġ 1 .. $ column Size Ġbut ĠcolumnIndex Ġ= Ġ$ column Index " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . single Ġ{ Ġ( i , Ġj , Ġ_) Ġ-> Ġi Ġ== ĠrowIndex Ġ&& Ġj Ġ== ĠcolumnIndex Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġrow Ġat Ġthe Ġ[ rowIndex ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ rowIndex ] Ġ! in Ġ 1 .. [ row Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġrow ( rowIndex : ĠInt ): ĠMap < Int , ĠE > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġin Ġ 1 .. row Size ) Ġ{ Ġ" expected ĠrowIndex Ġin Ġ 1 .. $ row Size Ġbut ĠrowIndex Ġ= Ġ$ rowIndex " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . sorted (). filter Ġ{ Ġit . rowIndex Ġ== ĠrowIndex Ġ}. associate Ġ{ Ġ(_, Ġj , Ġe ) Ġ-> Ġj Ġto Ġe Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcolumn Ġat Ġthe Ġ[ column Index ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Index ] Ġ! in Ġ 1 .. [ column Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcolumn ( column Index : ĠInt ): ĠMap < Int , ĠE > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( column Index Ġin Ġ 1 .. column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected ĠcolumnIndex Ġin Ġ 1 .. $ column Size Ġbut ĠcolumnIndex Ġ= Ġ$ column Index " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . sorted (). filter Ġ{ Ġit . column Index Ġ== ĠcolumnIndex Ġ}. associate Ġ{ Ġ( i , Ġ_, Ġe ) Ġ-> Ġi Ġto Ġe Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġrows ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġrows (): ĠList < Map < Int , ĠE >> Ġ= Ġ( 1 .. row Size ). map Ġ{ Ġrow ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġcolumns ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcolumns (): ĠList < Map < Int , ĠE >> Ġ= Ġ( 1 .. column Size ). map Ġ{ Ġcolumn ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġrow Ġvector Ġat Ġthe Ġ[ rowIndex ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ rowIndex ] Ġ! in Ġ 1 .. [ row Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġrow Vector ( rowIndex : ĠInt ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġin Ġ 1 .. row Size ) Ġ{ Ġ" expected ĠrowIndex Ġin Ġ 1 .. $ row Size Ġbut ĠrowIndex Ġ= Ġ$ rowIndex " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . vector Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . filter Ġ{ Ġit . rowIndex Ġ== ĠrowIndex Ġ}. map Ġ{ Ġ(_, Ġj , Ġe ) Ġ-> ĠVector Entry ( j , Ġe ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcolumn Ġvector Ġat Ġthe Ġ[ column Index ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Index ] Ġ! in Ġ 1 .. [ column Size ] ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcolumn Vector ( column Index : ĠInt ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( column Index Ġin Ġ 1 .. column Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected ĠcolumnIndex Ġin Ġ 1 .. $ column Size Ġbut ĠcolumnIndex Ġ= Ġ$ column Index " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . vector Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . filter Ġ{ Ġit . column Index Ġ== ĠcolumnIndex Ġ}. map Ġ{ Ġ( i , Ġ_, Ġe ) Ġ-> ĠVector Entry ( i , Ġe ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġrow Ġvectors ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġrow Vectors (): ĠList < V > Ġ= Ġ( 1 .. row Size ). map Ġ{ Ġrow Vector ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġcolumn Ġvectors ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcolumn Vectors (): ĠList < V > Ġ= Ġ( 1 .. column Size ). map Ġ{ Ġcolumn Vector ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġif Ġ[ element ] Ġis Ġcontained Ġin Ġ[ V ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun Ġcontains ( element : ĠE ): ĠBoolean Ġ= Ġelement Ġin Ġelements ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġif Ġthis Ġis Ġequal Ġto Ġ[ other ] Ġby Ġcomparing Ġelements ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ row Size ] Ġ!= Ġ` other . row Size ` ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` other . column Size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġequals By Comp aring ( other : ĠM ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġentries . all Ġ{ Ġ( i , Ġj , Ġe ) Ġ-> Ġquot ient Field . equality By Comp aring ( e , Ġother [ i , Ġj ]) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġif Ġthis Ġis Ġnot Ġequal Ġto Ġ[ other ] Ġby Ġcomparing Ġelements ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ row Size ] Ġ!= Ġ` other . row Size ` ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ column Size ] Ġ!= Ġ` other . column Size ` ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġdoes NotEqual By Comp aring ( other : ĠM ): ĠBoolean Ġ= Ġ! equals By Comp aring ( other ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġall Ġ[ diagonal Elements ] Ġand Ġreturns Ġthe Ġsum ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġadd Diag onal Elements (): ĠE Ġ= Ġelements . reduce Ġ{ Ġa , Ġb Ġ-> Ġquot ient Field . addition ( a , Ġb ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLe ib n iz Ġformula ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġdetermin ant ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġle ib n iz Formula (): ĠE Ġ= Ġ( 1 .. row Size ). toList (). per mutations (). map Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsigma Ġ= Ġ( 1 Ġuntil Ġrow Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġi Ġ-> Ġ(( i Ġ+ Ġ 1 ) .. row Size ). filter Ġ{ Ġj Ġ-> Ġp [ i ] Ġ> Ġp [ j ] Ġ}. size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġproduct Ġ= Ġ( 1 .. row Size ). map Ġ{ Ġthis [ p [ it Ġ- Ġ 1 ], Ġit ] Ġ}. reduce Ġ{ Ġa , Ġb Ġ-> Ġquot ient Field . multip lication ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠ Ġquot ient Field . multip lication ( quot ient Field . pow ( quot ient Field . int Converter (- 1 ), Ġsigma ), Ġproduct ) ĊĠĠĠ Ġ}. reduce Ġ{ Ġa , Ġb Ġ-> Ġquot ient Field . addition ( a , Ġb ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRule Ġof ĠS arr us ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġdetermin ant ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġrule Of S arr us (): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 1 , Ġ 1 ], Ġthis [ 2 , Ġ 2 ]), Ġthis [ 3 , Ġ 3 ]) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 1 , Ġ 2 ], Ġthis [ 2 , Ġ 3 ]), Ġthis [ 3 , Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 1 , Ġ 3 ], Ġthis [ 2 , Ġ 1 ]), Ġthis [ 3 , Ġ 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 3 , Ġ 1 ], Ġthis [ 2 , Ġ 2 ]), Ġthis [ 1 , Ġ 3 ]) ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 3 , Ġ 2 ], Ġthis [ 2 , Ġ 3 ]), Ġthis [ 1 , Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġquot ient Field . multip lication ( quot ient Field . multip lication ( this [ 3 , Ġ 3 ], Ġthis [ 2 , Ġ 1 ]), Ġthis [ 1 , Ġ 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġquot ient Field . addition ( quot ient Field . addition ( a , Ġb ), Ġc ) ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġquot ient Field . addition ( quot ient Field . addition ( d , Ġe ), Ġf ) ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . sub traction ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġdetermin ant Ġof Ġa Ġ 2 x 2 Ġmatrix ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġdetermin ant ĊĠĠĠĠ Ġ* Ġ@ since Ġ 0 . 0 . 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġdetermin ant Of 2 x 2 Matrix (): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġquot ient Field . multip lication ( this [ 1 , Ġ 1 ], Ġthis [ 2 , Ġ 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġquot ient Field . multip lication ( this [ 2 , Ġ 1 ], Ġthis [ 1 , Ġ 2 ]) ĊĠĠĠĠĠĠĠ Ġreturn Ġquot ient Field . sub traction ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĠObjects . hash ( entries ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠAbstract Matrix < *, Ġ*, Ġ*, Ġ*, Ġ*, Ġ* >) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġentries Ġ== Ġother . entries ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"${ this :: class . simple Name }( entries =$ entries )" ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ċ } Ċ