code 32020; real procedure SUMPOSSERIES(AI, I, MAXADDUP, MAXZERO,MAXRECURS, MACHEXP, TIM); value MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM; real AI, I, MAXZERO; integer MAXADDUP, MAXRECURS, MACHEXP, TIM; begin integer RECURS, VL, VL2, VL4; real procedure SUMUP(AI, I); real AI, I; begin integer J; real SUM, NEXTTERM; I:= MAXADDUP + 1; J:= 1; CHECK ADD: if AI <= MAXZERO then begin if J < TIM then begin J:= J + 1; I:= I + 1; "GO TO" CHECK ADD end end else if RECURS ^= MAXRECURS then "GO TO" TRANSFORMSERIES; SUM:= 0; I:= 0; J:= 0; ADD LOOP: I:= I + 1; NEXTTERM:= AI; J:= if NEXTTERM <= MAXZERO then J + 1 else 0; SUM:= SUM + NEXTTERM; if J < TIM then "GO TO" ADD LOOP; SUMUP:= SUM; "GO TO" GOTSUM; TRANSFORMSERIES: begin boolean JODD; integer J2; array V[1:VL]; real procedure BJK(J, K); value J, K; real K; integer J; begin real COEFF; if K > MACHEXP then BJK:= 0 else begin COEFF:= 2 ** (K - 1); I:= J * COEFF; BJK:= COEFF * AI end end BJK real procedure VJ(J); value J; integer J; begin real TEMP, K; if JODD then begin JODD:= false; RECURS:= RECURS + 1; TEMP:= VJ:= SUMUP(BJK(J, K), K); RECURS:= RECURS - 1; if J <= VL then V[J]:= TEMP else if J <= VL2 then V[J - VL]:= TEMP end else begin JODD:= true; if J > VL4 then begin RECURS:= RECURS + 1; VJ:= - SUMUP(BJK(J, K), K); RECURS:= RECURS - 1 end else begin J2:= J2 + 1; I:= J2; if J > VL2 then VJ:= - (V[J2 - VL] - AI) / 2 else begin TEMP:= V[if J <= VL then J else J - VL]:= (V[J2] - AI) / 2; VJ:= - TEMP end end end end VJ; J2:= 0; JODD:= true; SUMUP:= EULER(VJ(J + 1), J, MAXZERO, TIM) end TRANSFORMSERIES; GOTSUM: end SUMUP; RECURS:= 0; VL:= 1000; VL2:= 2 * VL; VL4:= 2 * VL2; SUMPOSSERIES:= SUMUP(AI, I) end SUMPOSSERIES; eop