changeset 65899:94998ac839a5

(math-known-square-matrixp): New function. (math-pow-fancy): Check for matrices before distributing exponent across products.
author Jay Belanger <jay.p.belanger@gmail.com>
date Fri, 07 Oct 2005 21:15:19 +0000
parents 00005df1b3eb
children 13cc64069e8c
files lisp/calc/calc-arith.el
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calc/calc-arith.el	Fri Oct 07 14:55:55 2005 +0000
+++ b/lisp/calc/calc-arith.el	Fri Oct 07 21:15:19 2005 +0000
@@ -305,6 +305,17 @@
   (and (not (Math-scalarp a))
        (not (math-known-scalarp a t))))
 
+(defun math-known-square-matrixp (a)
+  (if (eq (car-safe a) '^)
+      (math-known-square-matrixp (nth 1 a))
+    (and (math-known-matrixp a)
+         (or (math-square-matrixp a)
+             (and (or
+                   (integerp calc-matrix-mode)
+                   (eq calc-matrix-mode 'square))
+                  (eq (car-safe a) 'var)
+                  (not (math-const-var a)))))))
+                  
 ;;; Try to prove that A is a scalar (i.e., a non-vector).
 (defun math-check-known-scalarp (a)
   (cond ((Math-objectp a) t)
@@ -1869,6 +1880,21 @@
 	   (cond ((and math-simplify-only
 		       (not (equal a math-simplify-only)))
 		  (list '^ a b))
+                 ((and (eq (car-safe a) '*)
+                       (or 
+                        (and
+                         (math-known-matrixp (nth 1 a))
+                         (math-known-matrixp (nth 2 a)))
+                        (and
+                         calc-matrix-mode
+                         (not (eq calc-matrix-mode 'scalar))
+                         (and (not (math-known-scalarp (nth 1 a)))
+                              (not (math-known-scalarp (nth 2 a)))))))
+                  (if (and (= b -1)
+                           (math-known-square-matrixp (nth 1 a))
+                           (math-known-square-matrixp (nth 2 a)))
+                      (list '* (list '^ (nth 2 a) -1) (list '^ (nth 1 a) -1))
+                    (list '^ a b)))
 		 ((and (eq (car-safe a) '*)
 		       (or (math-known-num-integerp b)
 			   (math-known-nonnegp (nth 1 a))