Function: math-solve-crunch-poly
math-solve-crunch-poly is a byte-compiled function defined in
calcalg2.el.gz.
Signature
(math-solve-crunch-poly MAX-DEGREE)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg2.el.gz
;;; This converts "a x^8 + b x^5 + c x^2" to "(a (x^3)^2 + b (x^3) + c) * x^2".
(defun math-solve-crunch-poly (max-degree) ; uses "t1", "t3"
(let ((count 0))
(while (and math-t1 (Math-zerop (car math-t1)))
(setq math-t1 (cdr math-t1)
count (1+ count)))
(and math-t1
(let* ((degree (1- (length math-t1)))
(scale degree))
(while (and (> scale 1) (= (car math-t3) 1))
(and (= (% degree scale) 0)
(let ((p math-t1)
(n 0)
(new-t1 nil)
(okay t))
(while (and p okay)
(if (= (% n scale) 0)
(setq new-t1 (nconc new-t1 (list (car p))))
(or (Math-zerop (car p))
(setq okay nil)))
(setq p (cdr p)
n (1+ n)))
(if okay
(setq math-t3 (cons scale (cdr math-t3))
math-t1 new-t1))))
(setq scale (1- scale)))
(setq math-t3 (list (math-mul (car math-t3) math-t2)
(math-mul count math-t2)))
(<= (1- (length math-t1)) max-degree)))))