randRangeNonZero( -1, 1 ) ( PM === 1 ? "+" : "-") randRange( 2, 19 ) ( PM === 1 ? randRange( 1, 19 ) : randRange( -W1 + 1, -1 ))
randRange( 3, 20 ) randRange( 3, 20 )
randRange( 1, D1 - 1 ) randRange( 1, D2 - 1 )
getGCD( N1, D1 ) N1 / GCD1 D1 / GCD1 getGCD( N2, D2 ) N2 / GCD2 D2 / GCD2 getLCM( SIMP_D1, SIMP_D2 ) getGCD( SIMP_N1 * LCM / SIMP_D1 + PM * SIMP_N2 * LCM / SIMP_D2 , LCM )

`expr(["+", W1 + fraction( N1, D1 ), W2 + fraction( N2, D2 )]) = {?}`

W1 + W2 + N1 / D1 + PM * N2 / D2

Separate the whole numbers from the fractional parts:

`= \color{red}{W1} + \color{red}{fraction( N1, D1 )} SIGN \color{blue}{abs( W2 )} SIGN \color{blue}{fraction( N2, D2 )}`

Bring the whole numbers together and the fractions together:

`= \color{red}{W1} SIGN \color{blue}{abs( W2 )} + \color{red}{fraction( N1, D1 )} SIGN \color{blue}{fraction( N2, D2 )}`

`=W1 + W2 + \color{red}{fraction( N1, D1 )} SIGN \color{blue}{fraction( N2, D2 )}`

`= expr(["+", W1 + W2, fraction( N1 + PM * N2, D2 )])`
`= W1 + W2 + fraction( SIMP_N1 * LCM / SIMP_D1 + PM * SIMP_N2 * LCM / SIMP_D2, LCM )`
`= W1 + W2 + fractionReduce( SIMP_N1 * LCM / SIMP_D1 + PM * SIMP_N2 * LCM / SIMP_D2, LCM )`