@@ -1009,6 +1009,47 @@ describe('SUM', () => {
10091009 ce . parse ( '\\sum_{n=1}^{4}(3n + 5)' ) . evaluate ( ) . toString ( )
10101010 ) . toMatchInlineSnapshot ( `50` ) ;
10111011 } ) ;
1012+
1013+ // Alternating weighted binomial: Sum((-1)^k * k * C(n,k)) = 0 for n >= 2
1014+ it ( 'should simplify alternating weighted binomial sum to 0' , ( ) => {
1015+ expect (
1016+ ce . box ( [ 'Sum' , [ 'Multiply' , [ 'Power' , - 1 , 'k' ] , 'k' , [ 'Binomial' , 'b' , 'k' ] ] , [ 'Tuple' , 'k' , 0 , 'b' ] ] ) . simplify ( ) . toString ( )
1017+ ) . toMatchInlineSnapshot ( `0` ) ;
1018+ } ) ;
1019+
1020+ it ( 'should evaluate alternating weighted binomial sum' , ( ) => {
1021+ expect (
1022+ ce . box ( [ 'Sum' , [ 'Multiply' , [ 'Power' , - 1 , 'k' ] , 'k' , [ 'Binomial' , 4 , 'k' ] ] , [ 'Tuple' , 'k' , 0 , 4 ] ] ) . evaluate ( ) ?. toString ( )
1023+ ) . toMatchInlineSnapshot ( `0` ) ;
1024+ } ) ;
1025+
1026+ // Sum of binomial squares: Sum(C(n,k)^2) = C(2n, n)
1027+ it ( 'should simplify sum of binomial squares' , ( ) => {
1028+ expect (
1029+ ce . box ( [ 'Sum' , [ 'Power' , [ 'Binomial' , 'b' , 'k' ] , 2 ] , [ 'Tuple' , 'k' , 0 , 'b' ] ] ) . simplify ( ) . toString ( )
1030+ ) . toMatchInlineSnapshot ( `Binomial(2b, b)` ) ;
1031+ } ) ;
1032+
1033+ it ( 'should evaluate sum of binomial squares' , ( ) => {
1034+ // C(8,4) = 70
1035+ expect (
1036+ ce . box ( [ 'Sum' , [ 'Power' , [ 'Binomial' , 4 , 'k' ] , 2 ] , [ 'Tuple' , 'k' , 0 , 4 ] ] ) . evaluate ( ) ?. toString ( )
1037+ ) . toMatchInlineSnapshot ( `70` ) ;
1038+ } ) ;
1039+
1040+ // Sum of k*(k+1): n(n+1)(n+2)/3
1041+ it ( 'should simplify sum of k*(k+1)' , ( ) => {
1042+ expect (
1043+ ce . box ( [ 'Sum' , [ 'Multiply' , 'k' , [ 'Add' , 'k' , 1 ] ] , [ 'Tuple' , 'k' , 1 , 'b' ] ] ) . simplify ( ) . toString ( )
1044+ ) . toMatchInlineSnapshot ( `1/3 * b^3 + b^2 + 2/3 * b` ) ;
1045+ } ) ;
1046+
1047+ it ( 'should evaluate sum of k*(k+1)' , ( ) => {
1048+ // 4*5*6/3 = 40
1049+ expect (
1050+ ce . box ( [ 'Sum' , [ 'Multiply' , 'k' , [ 'Add' , 'k' , 1 ] ] , [ 'Tuple' , 'k' , 1 , 4 ] ] ) . evaluate ( ) ?. toString ( )
1051+ ) . toMatchInlineSnapshot ( `40` ) ;
1052+ } ) ;
10121053} ) ;
10131054
10141055describe ( 'PRODUCT' , ( ) => {
@@ -1155,6 +1196,34 @@ describe('PRODUCT', () => {
11551196 ce . parse ( '\\prod_{n=5}^{5}(2n)' ) . simplify ( ) . toString ( )
11561197 ) . toMatchInlineSnapshot ( `10` ) ;
11571198 } ) ;
1199+
1200+ // Telescoping product: Product((k+1)/k) = b+1
1201+ it ( 'should simplify telescoping product (k+1)/k' , ( ) => {
1202+ expect (
1203+ ce . parse ( '\\prod_{k=1}^{b}\\frac{k+1}{k}' ) . simplify ( ) . toString ( )
1204+ ) . toMatchInlineSnapshot ( `b + 1` ) ;
1205+ } ) ;
1206+
1207+ it ( 'should evaluate telescoping product (k+1)/k' , ( ) => {
1208+ // (2/1)*(3/2)*(4/3)*(5/4) = 5
1209+ expect (
1210+ ce . parse ( '\\prod_{k=1}^{4}\\frac{k+1}{k}' ) . evaluate ( ) . toString ( )
1211+ ) . toMatchInlineSnapshot ( `5` ) ;
1212+ } ) ;
1213+
1214+ // Wallis-like product: Product(1 - 1/k^2) = (b+1)/(2b) = 1/(2b) + 1/2
1215+ it ( 'should simplify Wallis-like product 1 - 1/k^2' , ( ) => {
1216+ expect (
1217+ ce . parse ( '\\prod_{k=2}^{b}(1 - \\frac{1}{k^2})' ) . simplify ( ) . toString ( )
1218+ ) . toMatchInlineSnapshot ( `1 / (2b) + 1/2` ) ;
1219+ } ) ;
1220+
1221+ it ( 'should evaluate Wallis-like product 1 - 1/k^2' , ( ) => {
1222+ // (1-1/4)*(1-1/9)*(1-1/16) = (3/4)*(8/9)*(15/16) = 5/8 = 0.625
1223+ expect (
1224+ ce . parse ( '\\prod_{k=2}^{4}(1 - \\frac{1}{k^2})' ) . evaluate ( ) . toString ( )
1225+ ) . toMatchInlineSnapshot ( `0.625` ) ;
1226+ } ) ;
11581227} ) ;
11591228
11601229describe ( 'GCD/LCM' , ( ) => {
0 commit comments