8
8
;;; (c) Copyright 1982 Massachusetts Institute of Technology ;;;
9
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
12
(macsyma-module sumcon)
14
14
(declare-top (special $genindex $niceindicespref $sumexpand)
18
(defmfun $sumcontract (e) ; e is assumed to be simplified
21
(do ((x (cdr e) (cdr x)) (sums) (notsums) (car-x))
22
((null x) (cond ((null sums)
23
(subst0 (cons '(mplus)
26
(t (setq sums (sumcontract1 sums))
27
(addn (cons sums notsums) t))))
30
(setq notsums (cons car-x notsums)))
31
((eq (caar car-x) '%sum)
32
(setq sums (cons (cons ($sumcontract (cadr car-x))
35
(t (setq notsums (cons car-x notsums))))))
36
(t (recur-apply #'$sumcontract e))))
38
(defmfun $intosum (e) ; e is assumed to be simplified
18
(defmfun $sumcontract (e) ; e is assumed to be simplified
21
(do ((x (cdr e) (cdr x)) (sums) (notsums) (car-x))
22
((null x) (cond ((null sums)
23
(subst0 (cons '(mplus)
26
(t (setq sums (sumcontract1 sums))
27
(addn (cons sums notsums) t))))
30
(setq notsums (cons car-x notsums)))
31
((eq (caar car-x) '%sum)
32
(setq sums (cons (cons ($sumcontract (cadr car-x))
35
(t (setq notsums (cons car-x notsums))))))
36
(t (recur-apply #'$sumcontract e))))
38
(defmfun $intosum (e) ; e is assumed to be simplified
39
39
(let (($sumexpand t))
41
((eq (caar e) 'mtimes) ;puts outside product inside
42
(do ((x (cdr e) (cdr x)) (sum) (notsum))
43
((null x) (cond ((null sum)
44
(subst0 (cons '(mtimes)
49
(cond ((free (cons nil notsum)
53
(cons nil (cons sum notsum)))))))
54
(setq sum (subst new-index (caddr sum) sum))
55
(rplaca (cdr sum) (muln (cons (cadr sum) notsum) t))
56
(rplacd (car sum) nil)
60
(setq notsum (cons (car x) notsum)))
62
(setq sum (if (null sum)
64
(muln (list sum (car x)) t))))
65
(t (setq notsum (cons ($sumcontract (car x))
67
(t (recur-apply #'$intosum e)))))
41
((eq (caar e) 'mtimes) ;puts outside product inside
42
(do ((x (cdr e) (cdr x)) (sum) (notsum))
43
((null x) (cond ((null sum)
44
(subst0 (cons '(mtimes)
49
(cond ((free (cons nil notsum)
53
(cons nil (cons sum notsum)))))))
54
(setq sum (subst new-index (caddr sum) sum))
55
(rplaca (cdr sum) (muln (cons (cadr sum) notsum) t))
56
(rplacd (car sum) nil)
60
(setq notsum (cons (car x) notsum)))
62
(setq sum (if (null sum)
64
(muln (list sum (car x)) t))))
65
(t (setq notsum (cons ($sumcontract (car x))
67
(t (recur-apply #'$intosum e)))))
69
69
(defun sumcontract1 (sums) (addn (sumcontract2 nil sums) t))
71
71
(defun sumcontract2 (result left)
72
(cond ((null left) result)
73
(t ((lambda (x) (sumcontract2 (append (car x) result)
75
(sumcombine1 (car left) (cdr left))))))
72
(cond ((null left) result)
73
(t ((lambda (x) (sumcontract2 (append (car x) result)
75
(sumcombine1 (car left) (cdr left))))))
77
77
(defun sumcombine1 (pattern llist)
78
(do ((sum pattern) (non-sums nil)
79
(un-matched-sums nil) (try-this-one)
80
(llist llist (cdr llist)))
81
((null llist) (cons (cons (simpsum (cons '(%sum) sum) 1 t)
84
(setq try-this-one (car llist))
85
(cond ((and (numberp (sub* (caddr sum) (caddr try-this-one)))
86
(numberp (sub* (cadddr sum) (cadddr try-this-one))))
87
((lambda (x) (setq sum (cdar x)
88
non-sums (cons (cdr x) non-sums)))
89
(sumcombine2 try-this-one sum)))
90
(t (setq un-matched-sums (cons try-this-one un-matched-sums))))))
78
(do ((sum pattern) (non-sums nil)
79
(un-matched-sums nil) (try-this-one)
80
(llist llist (cdr llist)))
81
((null llist) (cons (cons (simpsum (cons '(%sum) sum) 1 t)
84
(setq try-this-one (car llist))
85
(cond ((and (numberp (sub* (caddr sum) (caddr try-this-one)))
86
(numberp (sub* (cadddr sum) (cadddr try-this-one))))
87
((lambda (x) (setq sum (cdar x)
88
non-sums (cons (cdr x) non-sums)))
89
(sumcombine2 try-this-one sum)))
90
(t (setq un-matched-sums (cons try-this-one un-matched-sums))))))
92
92
(defun sumcombine2 (sum1 sum2)
93
((lambda (e1 e2 i1 i2 l1 l2 h1 h2)
94
((lambda (newl newh newi extracted new-sum)
95
(setq e1 (subst newi i1 e1))
96
(setq e2 (subst newi i2 e2))
97
(setq new-sum (list '(%sum)
106
(list newi newi newi newi)
107
(list l1 (add2 newh 1)
109
(list (sub* newl 1) h1
113
(cons new-sum extracted))
114
($max l1 l2) ($min h1 h2) (cond ((eq i1 i2) i1)
117
(t (get-free-index (list nil
123
(car sum1) (car sum2)
124
(cadr sum1) (cadr sum2)
125
(caddr sum1) (caddr sum2)
126
(cadddr sum1) (cadddr sum2)))
93
((lambda (e1 e2 i1 i2 l1 l2 h1 h2)
94
((lambda (newl newh newi extracted new-sum)
95
(setq e1 (subst newi i1 e1))
96
(setq e2 (subst newi i2 e2))
97
(setq new-sum (list '(%sum)
106
(list newi newi newi newi)
107
(list l1 (add2 newh 1)
109
(list (sub* newl 1) h1
113
(cons new-sum extracted))
114
(simplify `(($max) ,l1 ,l2)) (simplify `(($min) ,h1 ,h2))
115
(cond ((eq i1 i2) i1)
118
(t (get-free-index (list nil
124
(car sum1) (car sum2)
125
(cadr sum1) (cadr sum2)
126
(caddr sum1) (caddr sum2)
127
(cadddr sum1) (cadddr sum2)))
128
129
(defmvar $niceindicespref '((mlist simp) $i $j $k $l $m $n))
130
131
(defun get-free-index (llist)
131
(or (do ((try-list (cdr $niceindicespref) (cdr try-list)))
133
(if (free llist (car try-list)) (return (car try-list))))
134
(do ((n 0 (f1+ n)) (try))
136
(setq try (concat (cadr $niceindicespref) n))
137
(if (free llist try) (return try)))))
132
(or (do ((try-list (cdr $niceindicespref) (cdr try-list)))
134
(if (free llist (car try-list)) (return (car try-list))))
135
(do ((n 0 (f1+ n)) (try))
137
(setq try (concat (cadr $niceindicespref) n))
138
(if (free llist try) (return try)))))
139
(defmfun $bashindices (e) ; e is assumed to be simplified
140
(let (($genindex '$j))
142
((memq (caar e) '(%sum %product))
143
(sumconsimp (subst (gensumindex) (caddr e) e)))
144
(t (recur-apply #'$bashindices e)))))
140
(defmfun $bashindices (e) ; e is assumed to be simplified
141
(let (($genindex '$j))
143
((memq (caar e) '(%sum %product))
144
(sumconsimp (subst (gensumindex) (caddr e) e)))
145
(t (recur-apply #'$bashindices e)))))
146
147
(defmfun $niceindices (e)
148
(let ((e (recur-apply #'$niceindices e)))
149
(if (memq (caar e) '(%sum %product))
150
(sumconsimp (subst (get-free-index e) (caddr e) e))
149
(let ((e (recur-apply #'$niceindices e)))
150
(if (memq (caar e) '(%sum %product))
151
(sumconsimp (subst (get-free-index e) (caddr e) e))
153
154
(defun sumconsimp (e)
154
155
(if (and (not (atom e)) (memq (caar e) '(%sum %product)))