29
29
so don't use it. Use facexp instead. */
31
31
eval_when([batch,loadfile],
32
if get('GNAUTO,'DIAGEVAL_VERSION)=false
32
if get('gnauto,'diageval_version)=false
33
33
then load("genut"))$
35
COLLECTTEN(EXP):=COLLECTTERMSL(EXP,LISTOFTENS(EXP))$
37
COLLECTTERMS(EXP,[VARLIST]):=COLLECTTERMSL(EXP,VARLIST)$
39
COLLECTTERMSL(EXP,VARLIST):=BLOCK(
40
[PARTSWITCH:TRUE,INFLAG:TRUE,PIECE],
41
APPLY('COLLECTTERMS0,CONS(EXP,ARGSPLIT(EXP,VARLIST))))$
43
COLLECTTERMS0(EXP,THISLEVELDUM,NEXTLEVELDUM):=BLOCK(
44
[IFORP:TRUE,SPLITDUM1,SPLITDUM2,SPLITDUM3,ANSLIST:[],FDUM,
45
PREVDUM,LSPLIT3,ANSDUM,LASTDUMSAVE,PREVLASTDUM,
46
RTHISLEVELDUM,FTHISLEVELDUM],
47
MODEDECLARE(LSPLIT3,FIXNUM),
35
collectten(exp):=collecttermsl(exp,listoftens(exp))$
37
collectterms(exp,[varlist]):=collecttermsl(exp,varlist)$
39
collecttermsl(exp,varlist):=block(
40
[partswitch:true,inflag:true,piece],
41
apply('collectterms0,cons(exp,argsplit(exp,varlist))))$
43
collectterms0(exp,thisleveldum,nextleveldum):=block(
44
[iforp:true,splitdum1,splitdum2,splitdum3,anslist:[],fdum,
45
prevdum,lsplit3,ansdum,lastdumsave,prevlastdum,
46
rthisleveldum,fthisleveldum],
47
modedeclare(lsplit3,fixnum),
48
48
/* DECLARE([FDUM,SPLITDUM3,ANSDUM],SPECIAL), */
49
IF EXP=0 THEN RETURN(0),
50
IF NULLLISTP(THISLEVELDUM) OR FREEOFL(THISLEVELDUM,EXP)
51
THEN IF NULLLISTP(NEXTLEVELDUM)
53
ELSE (SPLITDUM1:ORPARTITIONL(EXP,"+",NEXTLEVELDUM),
54
RETURN(COLLECTTERMSL(FIRST(SPLITDUM1),NEXTLEVELDUM)
57
COLLECTTERMSL(TERMDUM,NEXTLEVELDUM)),
59
RTHISLEVELDUM:REST(THISLEVELDUM),
60
IF FREEOF(FTHISLEVELDUM:FIRST(THISLEVELDUM),EXP)
61
THEN RETURN(COLLECTTERMS0(EXP,RTHISLEVELDUM,NEXTLEVELDUM)),
62
SPLITDUM1:ORPARTITIONL(EXP,"+",THISLEVELDUM),
63
SPLITDUM2:ORPARTITIONL(LAST(SPLITDUM1),"+",[FTHISLEVELDUM]),
64
ANSDUM:COLLECTTERMSL(FIRST(SPLITDUM1),NEXTLEVELDUM)
65
+COLLECTTERMS0(FIRST(SPLITDUM2),RTHISLEVELDUM,NEXTLEVELDUM),
66
IF INPART(SPLITDUM3:LAST(SPLITDUM2),0)#"+"
67
THEN RETURN(ANSDUM+COLLECTTERMSL(SPLITDUM3,NEXTLEVELDUM)),
68
SPLITDUM3:SORT(MAPLIST(LAMBDA([TERM],ORPARTITIONL(TERM,"*",[FTHISLEVELDUM])),
71
LSPLIT3:LENGTH(SPLITDUM3)-1,
72
PREVLASTDUM:INPART(SPLITDUM3,1,2),
73
PREVDUM:INPART(SPLITDUM3,1,1),
74
SPLITDUM3:REST(SPLITDUM3),
75
FOR IDUM THRU LSPLIT3 DO
76
(IF (LASTDUMSAVE:INPART(SPLITDUM3,IDUM,2))=PREVLASTDUM
77
THEN PREVDUM:PREVDUM+INPART(SPLITDUM3,IDUM,1)
78
ELSE (ANSLIST:ENDCONS([PREVDUM,PREVLASTDUM],ANSLIST),
79
PREVDUM:INPART(SPLITDUM3,IDUM,1),
80
PREVLASTDUM:LASTDUMSAVE),
82
THEN ANSLIST:ENDCONS([PREVDUM,PREVLASTDUM],ANSLIST)),
83
LISTTOSUM(MAPLIST('LAMBDA([DUM], /* Maxima: quoted the lambda expression */
84
IF FREEOFL(RTHISLEVELDUM,FDUM:FIRST(DUM))
85
THEN COLLECTTERMSL(FDUM,NEXTLEVELDUM)
87
ELSE MULTTHRUSPLIT(LAST(DUM),
88
COLLECTTERMS0(FDUM,RTHISLEVELDUM,
93
ORDERLASTP(EXP1,EXP2):=ORDERLESSP(LAST(EXP1),LAST(EXP2))$
96
MULTTHRUSPLIT(FACTORDUM,SUMDUM,RTHISLEVELDUM):=BLOCK(
97
[SPLITDUM1:ORPARTITIONL(SUMDUM,"+",RTHISLEVELDUM)],
98
MULTTHRU(FACTORDUM,LAST(SPLITDUM1))+FACTORDUM*FIRST(SPLITDUM1))$
100
EVAL_WHEN(BATCH,TTYOFF:FALSE)$
49
if exp=0 then return(0),
50
if nulllistp(thisleveldum) or freeofl(thisleveldum,exp)
51
then if nulllistp(nextleveldum)
53
else (splitdum1:orpartitionl(exp,"+",nextleveldum),
54
return(collecttermsl(first(splitdum1),nextleveldum)
57
collecttermsl(termdum,nextleveldum)),
59
rthisleveldum:rest(thisleveldum),
60
if freeof(fthisleveldum:first(thisleveldum),exp)
61
then return(collectterms0(exp,rthisleveldum,nextleveldum)),
62
splitdum1:orpartitionl(exp,"+",thisleveldum),
63
splitdum2:orpartitionl(last(splitdum1),"+",[fthisleveldum]),
64
ansdum:collecttermsl(first(splitdum1),nextleveldum)
65
+collectterms0(first(splitdum2),rthisleveldum,nextleveldum),
66
if inpart(splitdum3:last(splitdum2),0)#"+"
67
then return(ansdum+collecttermsl(splitdum3,nextleveldum)),
68
splitdum3:sort(maplist(lambda([term],orpartitionl(term,"*",[fthisleveldum])),
71
lsplit3:length(splitdum3)-1,
72
prevlastdum:inpart(splitdum3,1,2),
73
prevdum:inpart(splitdum3,1,1),
74
splitdum3:rest(splitdum3),
75
for idum thru lsplit3 do
76
(if (lastdumsave:inpart(splitdum3,idum,2))=prevlastdum
77
then prevdum:prevdum+inpart(splitdum3,idum,1)
78
else (anslist:endcons([prevdum,prevlastdum],anslist),
79
prevdum:inpart(splitdum3,idum,1),
80
prevlastdum:lastdumsave),
82
then anslist:endcons([prevdum,prevlastdum],anslist)),
83
listtosum(maplist('lambda([dum], /* Maxima: quoted the lambda expression */
84
if freeofl(rthisleveldum,fdum:first(dum))
85
then collecttermsl(fdum,nextleveldum)
87
else multthrusplit(last(dum),
88
collectterms0(fdum,rthisleveldum,
93
orderlastp(exp1,exp2):=orderlessp(last(exp1),last(exp2))$
96
multthrusplit(factordum,sumdum,rthisleveldum):=block(
97
[splitdum1:orpartitionl(sumdum,"+",rthisleveldum)],
98
multthru(factordum,last(splitdum1))+factordum*first(splitdum1))$
100
eval_when(batch,ttyoff:false)$