
 	(DEFPROP MLCOUNT T SPECIAL)
(DEFPROP VARLIST T SPECIAL)
(DEFPROP REPSWITCH T SPECIAL)
(DEFPROP SP T SPECIAL)
(DEFPROP FLIST T SPECIAL)


(SETQ MLCOUNT 0)

(DEFPROP SOLVE
 (LAMBDA (X Y)
  (PROG
   (SOLVEE IT
	   SHEEP
	   GOATS
	   WORK
	   FLIST
	   DESCRIMSQRT
	   FIRSTQUOT
	   SECONDQUOT
	   HOLDSYM
           REPSWITCH)
  (COND
    ((OR (NULL X) (NULL (CDR X)) (CDDR X))
     (ERLIST (QUOTE (SOLVE TAKES
			   TWO
			   ARGUMENTS)))))
   (SETQ X (MAPCAR (FUNCTION (LAMBDA (J) (BIN (UNQUOTE J)))) X))
   (COND
    ((OR (ATOM (CAR X))
	 (NOT (EQ (CAAR X) (QUOTE EQUAL))))
     (ERLIST (QUOTE (FIRST ARGUMENT
			   OF
			   SOLVE
			   MUST
			   BE
			   AN
			   EQUATION)))))
   (SETQ SOLVEE (LIST (QUOTE DIFFERENCE)
		      (CADAR X)
		      (CADDAR X)))
   (COND ((NOT (RFP SOLVEE(CADR X)))
	  (ERLIST (QUOTE (FIRST ARGUMENT
				OF
				SOLVE
				MUST
				BE
				RATIONAL
				IN
				SECOND)))))
   (SETQ VARLIST (CDR X))
   (NEWVAR SOLVEE)
   (SETQ REPSWITCH T)
   (SETQ SOLVEE (NUMERATORF (REP SOLVEE)))
   (COND ((LESSP (LENGTH SOLVEE) 2)
	  (ERLIST (QUOTE (CANNOT SOLVE)))))
   (COND((POLMINUSP SOLVEE)(SETQ SOLVEE(POLMINUS SOLVEE))))
   (SETQ SOLVEE (INTFACTOR SOLVEE))
   (SETQ SOLVEE (CONS (RCONFAC (CAR SOLVEE))
		      (CDR SOLVEE)))
SHEEPFROMGOATS
   (COND ((NULL SOLVEE)
	  (GO TOLDSHEEPFROMGOATS)))
   (COND ((LESSP (LENGTH (CAR SOLVEE)) 4)
	  (GO TOLDASHEEP)))
   (SETQ GOATS (CONS (CAR SOLVEE) GOATS))
   (SETQ SOLVEE (CDR SOLVEE))
   (GO SHEEPFROMGOATS)
TOLDASHEEP
   (SETQ SHEEP (CONS (CAR SOLVEE) SHEEP))
   (SETQ SOLVEE (CDR SOLVEE))
   (GO SHEEPFROMGOATS)
TOLDSHEEPFROMGOATS
   (SETQ
    SHEEP
    (MULTSORT
     (MAPCAR (FUNCTION (LAMBDA (J)
			       (CONS 1 J)))
	     SHEEP)))
   (SETQ
    GOATS
    (MULTSORT
     (MAPCAR (FUNCTION (LAMBDA (J)
			       (CONS 1 J)))
	     GOATS)))
   (PRINLIST (QUOTE (THE ROOTS ARE)))
   (COND ((NULL SHEEP) (GO NOSHEEP)))
MORESHEEP
   (SETQ WORK (CAR SHEEP))
   (COND ((NULL (CDDDR WORK)) (GO LINEAR)))
   (SETQ
    DESCRIMSQRT
    (SQRTF
     (DIFFERENCEF
      (TIMESF (CADDR WORK) (CADDR WORK))
      (TIMESF
       (TIMESF
	(FORMCONST 4 (RANK (CADR WORK)))
	(CADR WORK))
       (CADDDR WORK)))))
   (SETQ
    FIRSTQUOT
    (SIMPSIMP
     (TRANS
      (QUOTIENTF
       (MINUSF (CADDR WORK))
       (TIMESF
	(FORMCONST 2 (RANK (CADR WORK)))
	(CADR WORK))))))
   (SETQ
    SECONDQUOT
    (SIMPSIMP
     (TRANS
      (QUOTIENTF
       (CAR DESCRIMSQRT)
       (TIMESF
	(FORMCONST 2 (RANK (CADR WORK)))
	(CADR WORK))))))
   (SETQ
    IT
    (SIMPSIMP
     (LIST
      (QUOTE PLUS)
      FIRSTQUOT
      (LIST
       (QUOTE TIMES)
       SECONDQUOT
       (LIST
	(QUOTE EXPT)
	(SIMPSIMP (TRANS (CDR DESCRIMSQRT)))
	(QUOTE (QUOTIENT 1 2)))))))
   (MLABSET (SETQ HOLDSYM (MLGEN))
	    (SPT (REMDIF (CLEANR IT)))
	    NIL)
   (REPEAT1 (LIST (QUOTE SETQ)
		  HOLDSYM
		  (MGET HOLDSYM)))
   (MULTPRINT (CAR WORK))
   (PRINT (QUOTE AND))
   (TERPRI)
   (SETQ
    IT
    (SIMPSIMP
     (LIST
      (QUOTE DIFFERENCE)
      FIRSTQUOT
      (LIST
       (QUOTE TIMES)
       SECONDQUOT
       (LIST
	(QUOTE EXPT)
	(SIMPSIMP (TRANS (CDR DESCRIMSQRT)))
	(QUOTE (QUOTIENT 1 2)))))))
   (MLABSET (SETQ HOLDSYM (MLGEN))
	    (SPT (REMDIF (CLEANR IT)))
	    NIL)
   (REPEAT1 (LIST (QUOTE SETQ)
		  HOLDSYM
		  (MGET HOLDSYM)))
   (GO SHEEPCONT)
NOMORESHEEP
   (COND
    ((NULL GOATS)
     (RETURN (AND (PRINT (QUOTE FINISHED))
		    (TERPRI NIL)))))
   (PRINC SP)
   (PRINC (QUOTE AND))
(PRINC SP)
   (GO NOSHEEP)
LINEAR
   (SETQ
    IT
    (SIMPSIMP
     (TRANS
      (TIMESF (INVERTF (MINUSF (CADR WORK)))
	      (CADDR WORK)))))
   (MLABSET (SETQ HOLDSYM (MLGEN))
	    (SPT (REMDIF (CLEANR IT)))
	    NIL)
   (REPEAT1 (LIST (QUOTE SETQ)
		  HOLDSYM
		  (MGET HOLDSYM)))
SHEEPCONT
   (MULTPRINT (CAR WORK))
   (SETQ SHEEP (CDR SHEEP))
   (COND ((NULL SHEEP) (GO NOMORESHEEP)))
   (PRINC SP)
   (PRINC (QUOTE AND))
   (GO MORESHEEP)
NOSHEEP
   (SETQ WORK (CAR GOATS))
   (SETQ HOLDSYM (MLGEN))
   (MLABSET
    HOLDSYM
    (LIST
     (QUOTE EQUAL)
(SPT(REMDIF     (CLEANR (SIMPSIMP (TRANS (CDR WORK))))))
     0)
    NIL)
   (PRINLIST (QUOTE (THE ROOTS OF)))
   (REPEAT1 (LIST (QUOTE SETQ)
		  HOLDSYM
		  (MGET HOLDSYM)))
   (MULTPRINT (CAR WORK))
   (SETQ GOATS (CDR GOATS))
   (COND
    ((NULL GOATS)
     (RETURN
	     (AND(PRINT (QUOTE FINISHED))(TERPRI NIL)))))
   (PRINC SP)
   (PRINC (QUOTE AND))
   (GO NOSHEEP)))
 FEXPR)


 (DEFPROP MULTPRINT
 (LAMBDA(N)
  (COND
   ((ONEP N)(PRINT(QUOTE ONCE)))
   ((EQUAL N 2)(PRINT(QUOTE TWICE)))
   (T(PROG()
      (PRINC N)
      (PRINC SP)
      (PRINC (QUOTE TIMES))
      (RETURN NIL)))
 ))EXPR)
  
  
  
 (DEFPROP MULTSORT
 (LAMBDA(L)
  (COND
    ((NULL L)NIL)
    ((MULTSORTQUERY(CDAR L)(CDR L))(MULTSORT(MULTSORTELIM(CAR L)(CDR 
L)))
             )
    (T(CONS(CAR L)(MULTSORT(CDR L))))
    ))EXPR)
  
 (DEFPROP MULTSORTQUERY
 (LAMBDA(X L)
  (COND
    ((NULL L)NIL)
    ((EQUAL X(CDAR L))T)
    (T(MULTSORTQUERY X(CDR L)))
 ))EXPR)
  
 (DEFPROP MULTSORTELIM
 (LAMBDA(X L)
  (COND
    ((EQUAL(CDR X)(CDAR L))
    (CONS(CONS(PLUS(CAR X)(CAAR L))
                  (CDR X))(CDR L)))
    (T(CONS(CAR L)(MULTSORTELIM X(CDR L))))
 ))EXPR)

(DEFPROP MLGEN
 (LAMBDA ()
  (PROG2
   (SETQ MLCOUNT (ADD1 MLCOUNT))
   (READLIST (MCONS (Q M)
		     (Q L)
		      (EXPLODE MLCOUNT)))))
