Function: math-sum-rec
math-sum-rec is an autoloaded and byte-compiled function defined in
calcalg2.el.gz.
Signature
(math-sum-rec EXPR VAR &optional LOW HIGH STEP)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg2.el.gz
(defun math-sum-rec (expr var &optional low high step)
(or low (setq low '(neg (var inf var-inf)) high '(var inf var-inf)))
(and low (not high) (setq high low low 1))
(let (t1 t2 val)
(setq val
(cond
((not (math-expr-contains expr var))
(math-mul expr (math-add (math-div (math-sub high low) (or step 1))
1)))
((and step (not (math-equal-int step 1)))
(if (math-negp step)
(math-sum-rec expr var high low (math-neg step))
(let ((lo (math-simplify (math-div low step))))
(if (math-known-num-integerp lo)
(math-sum-rec (math-normalize
(math-expr-subst expr var
(math-mul step var)))
var lo (math-simplify (math-div high step)))
(math-sum-rec (math-normalize
(math-expr-subst expr var
(math-add (math-mul step var)
low)))
var 0
(math-simplify (math-div (math-sub high low)
step)))))))
((memq (setq t1 (math-compare low high)) '(0 1))
(if (eq t1 0)
(math-expr-subst expr var low)
0))
((setq t1 (math-is-polynomial expr var 20))
(let ((poly nil)
(n 0))
(while t1
(setq poly (math-poly-mix poly 1
(math-sum-integer-power n) (car t1))
n (1+ n)
t1 (cdr t1)))
(setq n (math-build-polynomial-expr poly high))
(if (= low 1)
n
(math-sub n (math-build-polynomial-expr poly
(math-sub low 1))))))
((and (memq (car expr) '(+ -))
(setq t1 (math-sum-rec (nth 1 expr) var low high)
t2 (math-sum-rec (nth 2 expr) var low high))
(not (and (math-expr-calls t1 '(calcFunc-sum))
(math-expr-calls t2 '(calcFunc-sum)))))
(list (car expr) t1 t2))
((and (eq (car expr) '*)
(setq t1 (math-sum-const-factors expr var)))
(math-mul (car t1) (math-sum-rec (cdr t1) var low high)))
((and (eq (car expr) '*) (memq (car-safe (nth 1 expr)) '(+ -)))
(math-sum-rec (math-add-or-sub (math-mul (nth 1 (nth 1 expr))
(nth 2 expr))
(math-mul (nth 2 (nth 1 expr))
(nth 2 expr))
nil (eq (car (nth 1 expr)) '-))
var low high))
((and (eq (car expr) '*) (memq (car-safe (nth 2 expr)) '(+ -)))
(math-sum-rec (math-add-or-sub (math-mul (nth 1 expr)
(nth 1 (nth 2 expr)))
(math-mul (nth 1 expr)
(nth 2 (nth 2 expr)))
nil (eq (car (nth 2 expr)) '-))
var low high))
((and (eq (car expr) '/)
(not (math-primp (nth 1 expr)))
(setq t1 (math-sum-const-factors (nth 1 expr) var)))
(math-mul (car t1)
(math-sum-rec (math-div (cdr t1) (nth 2 expr))
var low high)))
((and (eq (car expr) '/)
(setq t1 (math-sum-const-factors (nth 2 expr) var)))
(math-div (math-sum-rec (math-div (nth 1 expr) (cdr t1))
var low high)
(car t1)))
((eq (car expr) 'neg)
(math-neg (math-sum-rec (nth 1 expr) var low high)))
((and (eq (car expr) '^)
(not (math-expr-contains (nth 1 expr) var))
(setq t1 (math-is-polynomial (nth 2 expr) var 1)))
(let ((x (math-pow (nth 1 expr) (nth 1 t1))))
(math-div (math-mul (math-sub (math-pow x (math-add 1 high))
(math-pow x low))
(math-pow (nth 1 expr) (car t1)))
(math-sub x 1))))
((and (setq t1 (math-to-exponentials expr))
(setq t1 (math-sum-rec t1 var low high))
(not (math-expr-calls t1 '(calcFunc-sum))))
(math-to-exps t1))
((memq (car expr) '(calcFunc-ln calcFunc-log10))
(list (car expr) (calcFunc-prod (nth 1 expr) var low high)))
((and (eq (car expr) 'calcFunc-log)
(= (length expr) 3)
(not (math-expr-contains (nth 2 expr) var)))
(list 'calcFunc-log
(calcFunc-prod (nth 1 expr) var low high)
(nth 2 expr)))))
(if (equal val '(var nan var-nan)) (setq val nil))
(or val
(let* ((math-tabulate-initial 0)
(math-tabulate-function 'calcFunc-sum))
(calcFunc-table expr var low high)))))