1
ELIMINATE(EQNS,VARS):=BLOCK([TEQNS,SV,SE,L,FLAG,DISPFLAG],
2
MODEDECLARE([L,I],fixnum,FLAG,BOOLEAN),FLAG:DISPFLAG:FALSE,
3
IF NOT (LISTP(EQNS) AND LISTP(VARS)) THEN ERROR("THE ARGUMENTS MUST BOTH BE LISTS"),
4
IF LENGTH(VARS)>L:LENGTH(EQNS) THEN ERROR("MORE VARIABLES THEN EQUATIONS"),
5
IF L=1 THEN ERROR("CAN'T ELIMINATE FROM ONLY ONE EQUATION"),
6
IF LENGTH(VARS)=L THEN (VARS:REVERSE(VARS),SV:VARS[1], VARS:REVERSE(REST(VARS)),FLAG:TRUE),
1
eliminate(eqns,vars):=block([teqns,sv,se,l,flag,dispflag],
2
modedeclare([l,i],fixnum,flag,boolean),flag:dispflag:false,
3
if not (listp(eqns) and listp(vars)) then error("the arguments must both be lists"),
4
if length(vars)>l:length(eqns) then error("more variables then equations"),
5
if l=1 then error("can't eliminate from only one equation"),
6
if length(vars)=l then (vars:reverse(vars),sv:vars[1], vars:reverse(rest(vars)),flag:true),
7
7
/* ?meqhk turns [a=b] into [a-b] */
8
EQNS:MAP('?MEQHK,EQNS),
11
FOR J:1 THRU L WHILE(FREEOF(V,FIRST(EQNS))) DO(
12
TEQNS:CONS(FIRST(EQNS),TEQNS), EQNS:REST(EQNS)),
13
IF EQNS=[] THEN EQNS:TEQNS ELSE (TEQNS:APPEND(TEQNS,REST(EQNS)), EQNS:FIRST(EQNS), L:L-1, SE:[],
14
FOR J:1 THRU L DO SE:CONS(RESULTANT(EQNS,TEQNS[J],V),SE),
16
IF FLAG THEN [RHS(apply('EV,[LAST(SOLVE(EQNS[1],SV)),EVAL]))] ELSE EQNS)$
8
eqns:map('?meqhk,eqns),
11
for j:1 thru l while(freeof(v,first(eqns))) do(
12
teqns:cons(first(eqns),teqns), eqns:rest(eqns)),
13
if eqns=[] then eqns:teqns else (teqns:append(teqns,rest(eqns)), eqns:first(eqns), l:l-1, se:[],
14
for j:1 thru l do se:cons(resultant(eqns,teqns[j],v),se),
16
if flag then [rhs(apply('ev,[last(solve(eqns[1],sv)),eval]))] else eqns)$