? copylist;

Calculate

L:[1,2];

L2:copylist(L);

L2[2]:5;

Calculate

? copylist;

Calculate

L:[1,2];

L2:copylist(L);

L2[2]:5;

Calculate

### copylist

Run Example
```(%i1)get_deg_occ(eq,alist):=block(	[atomlistlen,deglist,occlist,i],	atomlistlen: length(alist),	deglist: makelist(0,ii,1,atomlistlen),	occlist: makelist(0,ii,1,atomlistlen),	for i:1 thru atomlistlen do (		deglist[i]: hipow(eq,alist[i]),		if deglist[i]>
0 then (			occlist[i]: 1		)	),	return([deglist,occlist]));
(%o1) get_deg_occ(eq, alist) := block([atomlistlen, deglist, occlist, i],
atomlistlen : length(alist), deglist : makelist(0, ii, 1, atomlistlen),
occlist : makelist(0, ii, 1, atomlistlen),
for i thru atomlistlen do (deglist  : hipow(eq, alist ),
i                  i
if deglist  > 0 then occlist  : 1), return([deglist, occlist]))
i                 i
(%i2) remove_col_row(dmatrix,omatrix,aelist,atomlistlen,eqlistlen,sumvalue):=block(	[degmatrix,occmatrix,llist,llistlen,latomlistlen,leqlistlen,ret,pos,i],	degmatrix: copymatrix(dmatrix),	occmatrix: copymatrix(omatrix),	llist: copylist(aelist),	latomlistlen: atomlistlen,	leqlistlen: eqlistlen,	ret: false,	while ret=false do (		pos: 0,		for i:1 thru latomlistlen do (			if sum(occmatrix[ii,i],ii,1,leqlistlen)=sumvalue then (				if sumvalue=0 then (					print("Column ",i," has sum=0 (atom=",llist[i],") and must be removed")				)				else (					/* sumvalue=1 */					print("Column ",i," has sum=1 and must be removed")				),				pos: i,				return(pos)			)		),		if pos>
0 then (			if sumvalue=0 then (				/* remove column pos from degmatrix and occmatrix, remove pos-th atom from atomlist */				degmatrix: submatrix(degmatrix,pos),				occmatrix: submatrix(occmatrix,pos),				llist: delete(llist[pos],llist),				latomlistlen: length(llist)			)			else (				/* sumvalue=1 */				/* remove row pos from degmatrix and occmatrix, remove pos-th equation from eqlist */				degmatrix: submatrix(pos,degmatrix),				occmatrix: submatrix(pos,occmatrix),				llist: delete(llist[pos],llist),				leqlistlen: length(llist)			)		)		else (			ret: true		),		if sumvalue=0 and latomlistlen=0 then (			error("no atoms remaining")		)		else if sumvalue=1 and leqlistlen=0 then (			error("no equations remaining")		)	),	return([degmatrix,occmatrix,llist]));
(%o2) remove_col_row(dmatrix, omatrix, aelist, atomlistlen, eqlistlen,
sumvalue) := block([degmatrix, occmatrix, llist, llistlen, latomlistlen,
leqlistlen, ret, pos, i], degmatrix : copymatrix(dmatrix),
occmatrix : copymatrix(omatrix), llist : copylist(aelist),
latomlistlen : atomlistlen, leqlistlen : eqlistlen, ret : false,
while ret = false do (pos : 0, for i thru latomlistlen
do if sum(occmatrix     , ii, 1, leqlistlen) = sumvalue
ii, i
then (if sumvalue = 0 then print("Column ", i, " has sum=0 (atom=", llist ,
i
") and must be removed") else print("Column ", i,
" has sum=1 and must be removed"), pos : i, return(pos)),
if pos > 0 then (if sumvalue = 0 then (degmatrix : submatrix(degmatrix, pos),
occmatrix : submatrix(occmatrix, pos), llist : delete(llist   , llist),
pos
latomlistlen : length(llist)) else (degmatrix : submatrix(pos, degmatrix),
occmatrix : submatrix(pos, occmatrix), llist : delete(llist   , llist),
pos
leqlistlen : length(llist))) else ret : true,
if (sumvalue = 0) and (latomlistlen = 0) then error("no atoms remaining")
else (if (sumvalue = 1) and (leqlistlen = 0)
then error("no equations remaining"))), return([degmatrix, occmatrix, llist]))
(%i3) pdesys2pde(alist,atlist,elist,etlist):=block(	[atomlist,atomtlist,eqlist,eqtlist,atomlistlen,atomtlistlen,eqlistlen,eqtlistlen,degmatrix,occmatrix,deglist,occlist,i,j,deg,ret,pos,neqlist,neqlistlen,nneqlist],	eqlist: copylist(elist),	eqtlist: copy(etlist),	atomlist: copylist(alist),	atomtlist: copylist(atlist),	eqlistlen: length(eqlist),	eqtlistlen: length(eqtlist),	atomlistlen: length(atomlist),	atomtlistlen: length(atomtlist),	/* for each equation, get the highest degree for each t-atom */	degmatrix: matrix(),	/* for each atom, get the number of occurrences in the equation set */	occmatrix: matrix(),	for i:1 thru eqtlistlen do (		[deglist,occlist]: get_deg_occ(eqtlist[i],atomtlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),print("Start: ",degmatrix),print("Start: ",occmatrix),return(0),	/* remove (recursively) all rows, whose sum is 1, that is, all equation containing atom occuring only once */	[degmatrix,occmatrix,eqlist]: remove_col_row(degmatrix,occmatrix,eqlist,atomlistlen,eqlistlen,1),	eqlistlen: length(eqlist),/*	ret: false,	while ret=false do (		pos: 0,		for i:1 thru atomlistlen do (			if sum(occmatrix[ii,i],ii,1,eqlistlen)=1 then (				print("Column ",i," has sum=1 and must be removed"),				pos: i,				return(pos)			)		),		if pos>
0 then (			-- remove row pos from degmatrix and occmatrix, remove pos-th equation from eqlist --			degmatrix: submatrix(pos,degmatrix),			occmatrix: submatrix(pos,occmatrix),			eqlist: delete(eqlist[pos],eqlist),			eqlistlen: length(eqlist)		)		else (			ret: true		),		if eqlistlen=0 then (			error("no equations remaining")		)	),*/	/* now remove (recursively) all columns, whose sum is 0: these variables are not used */	[degmatrix,occmatrix,atomlist]: remove_col_row(degmatrix,occmatrix,atomlist,atomlistlen,eqlistlen,0),	atomlistlen: length(atomlist),/*	ret: false,	while ret=false do (		pos: 0,		for i:1 thru atomlistlen do (			if sum(occmatrix[ii,i],ii,1,eqlistlen)=0 then (				print("Column ",i," has sum=0 (atom=",atomlist[i],") and must be removed"),				pos: i,				return(pos)			)		),		if pos>
0 then (			/* remove column pos from degmatrix and occmatrix, remove pos-th atom from atomlist */			degmatrix: submatrix(degmatrix,pos),			occmatrix: submatrix(occmatrix,pos),			atomlist: delete(atomlist[pos],atomlist),			atomlistlen: length(atomlist)		)		else (			ret: true		),		if atomlistlen=0 then (			error("no atoms remaining")		)	),*//*	for i:atomlistlen thru 1 step -1 do (		if sum(occmatrix[ii,i],ii,1,eqlistlen)=0 then (			-- remove column i from degmatrix and occmatrix, remove i-th atom from atomlist --			degmatrix: submatrix(degmatrix,i),			occmatrix: submatrix(occmatrix,i),			print("Column ",i," has sum=0 (atom=",atomlist[i],") and must be removed"),			atomlist: delete(atomlist[pos],atomlist)		)	),	atomlistlen: length(atomlist),*/print("End: ",atomlist),print("End: ",eqlist),print("End: ",degmatrix),print("End: ",occmatrix),return(0),	/* now, each atom exists in at least 2 equations */	/* reduce the set of equations, by eliminating the atoms starting by the highest derivative (x+t) */print("***"),	/* WWWHHH */	pos: atomlistlen,	neqlist: [],	for i:eqlistlen thru 1 step -1 do (		if occmatrix[i,pos]=1 then (print(i),			neqlist: append(neqlist,[eqlist[i]]),			/* remove row i from degmatrix and occmatrix */			degmatrix: submatrix(degmatrix,i),			occmatrix: submatrix(occmatrix,i)		)	),	nneqlist: [],	/* choose the data based on the degree! */	/* this is the basic variation: first equation is fixed */	for i:2 thru neqlistlen do (		nneqlist: append(nneqlist,[resultant(neqlist[1],neqlist[i],atomlist[pos])])	),	neqlist: copylist(nneqlist),	neqlistlen: length(neqlist),	atomlist: delete(atomlist[pos],atomlist),	atomlistlen: length(atomlist),	/* add row to degmatrix and occmatrix */	for i:1 thru neqlistlen do (		[deglist,occlist]: get_deg_occ(neqlist[i],atomlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),	/* now remove columns with sum=0 */	/* WWWHHH */	return(0));
(%o3) pdesys2pde(alist, atlist, elist, etlist) :=
block([atomlist, atomtlist, eqlist, eqtlist, atomlistlen, atomtlistlen,
eqlistlen, eqtlistlen, degmatrix, occmatrix, deglist, occlist, i, j, deg, ret,
pos, neqlist, neqlistlen, nneqlist], eqlist : copylist(elist),
eqtlist : copy(etlist), atomlist : copylist(alist),
atomtlist : copylist(atlist), eqlistlen : length(eqlist),
eqtlistlen : length(eqtlist), atomlistlen : length(atomlist),
atomtlistlen : length(atomtlist), degmatrix : matrix(), occmatrix : matrix(),
for i thru eqtlistlen do ([deglist, occlist] :
get_deg_occ(eqtlist , atomtlist), degmatrix : addrow(degmatrix, deglist),
i
occmatrix : addrow(occmatrix, occlist)), print("Start: ", degmatrix),
print("Start: ", occmatrix), return(0),
[degmatrix, occmatrix, eqlist] : remove_col_row(degmatrix, occmatrix, eqlist,
atomlistlen, eqlistlen, 1), eqlistlen : length(eqlist),
[degmatrix, occmatrix, atomlist] : remove_col_row(degmatrix, occmatrix,
atomlist, atomlistlen, eqlistlen, 0), atomlistlen : length(atomlist),
print("End: ", atomlist), print("End: ", eqlist), print("End: ", degmatrix),
print("End: ", occmatrix), return(0), print("***"), pos : atomlistlen,
neqlist : [], for i from eqlistlen step - 1 thru 1
do if occmatrix       = 1 then (print(i),
i, pos
neqlist : append(neqlist, [eqlist ]), degmatrix : submatrix(degmatrix, i),
i
occmatrix : submatrix(occmatrix, i)), nneqlist : [],
for i from 2 thru neqlistlen do nneqlist :
append(nneqlist, [resultant(neqlist , neqlist , atomlist   )]),
1         i          pos
neqlist : copylist(nneqlist), neqlistlen : length(neqlist),
atomlist : delete(atomlist   , atomlist), atomlistlen : length(atomlist),
pos
for i thru neqlistlen do ([deglist, occlist] :
get_deg_occ(neqlist , atomlist), degmatrix : addrow(degmatrix, deglist),
i
(%i4) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt],[vt-ux*vxx,utt-vt*vx-v*vxt,vxt-uxx*vxx-ux*vxxx],[ut-v*vx,uxt-vx^2-v*vxx,uxxt-3*vx*vxx-v*vxxx]);
[ 0  0 ]
[      ]
Start:  [ 0  0 ]
[      ]
[ 0  0 ]
[ 0  0 ]
[      ]
Start:  [ 0  0 ]
[      ]
[ 0  0 ]
(%o4)                                  0
(%i5) ```
Run Example
```get_deg_occ(eq,alist):=block(	[atomlistlen,deglist,occlist,i],	atomlistlen: length(alist),	deglist: makelist(0,ii,1,atomlistlen),	occlist: makelist(0,ii,1,atomlistlen),	for i:1 thru atomlistlen do (		deglist[i]: hipow(eq,alist[i]),		if deglist[i]>
0 then (			occlist[i]: 1		)	),	return([deglist,occlist]));
(%o1) get_deg_occ(eq, alist) := block([atomlistlen, deglist, occlist, i],
atomlistlen : length(alist), deglist : makelist(0, ii, 1, atomlistlen),
occlist : makelist(0, ii, 1, atomlistlen),
for i thru atomlistlen do (deglist  : hipow(eq, alist ),
i                  i
if deglist  > 0 then occlist  : 1), return([deglist, occlist]))
i                 i
(%i2) remove_col_row(dmatrix,omatrix,aelist,atomlistlen,eqlistlen,sumvalue):=block(	[degmatrix,occmatrix,llist,llistlen,latomlistlen,leqlistlen,ret,pos,i],	degmatrix: copymatrix(dmatrix),	occmatrix: copymatrix(omatrix),	llist: copylist(aelist),	latomlistlen: atomlistlen,	leqlistlen: eqlistlen,	ret: false,	while ret=false do (		pos: 0,		for i:1 thru latomlistlen do (			if sum(occmatrix[ii,i],ii,1,leqlistlen)=sumvalue then (				if sumvalue=0 then (					print("Column ",i," has sum=0 (atom=",llist[i],") and must be removed")				)				else (					/* sumvalue=1 */					print("Column ",i," has sum=1 and must be removed")				),				pos: i,				return(pos)			)		),		if pos>
0 then (			if sumvalue=0 then (				/* remove column pos from degmatrix and occmatrix, remove pos-th atom from atomlist */				degmatrix: submatrix(degmatrix,pos),				occmatrix: submatrix(occmatrix,pos),				llist: delete(llist[pos],llist),				latomlistlen: length(llist)			)			else (				/* sumvalue=1 */				/* remove row pos from degmatrix and occmatrix, remove pos-th equation from eqlist */				degmatrix: submatrix(pos,degmatrix),				occmatrix: submatrix(pos,occmatrix),				llist: delete(llist[pos],llist),				leqlistlen: length(llist)			)		)		else (			ret: true		),		if sumvalue=0 and latomlistlen=0 then (			error("no atoms remaining")		)		else if sumvalue=1 and leqlistlen=0 then (			error("no equations remaining")		)	),	return([degmatrix,occmatrix,llist]));
(%o2) remove_col_row(dmatrix, omatrix, aelist, atomlistlen, eqlistlen,
sumvalue) := block([degmatrix, occmatrix, llist, llistlen, latomlistlen,
leqlistlen, ret, pos, i], degmatrix : copymatrix(dmatrix),
occmatrix : copymatrix(omatrix), llist : copylist(aelist),
latomlistlen : atomlistlen, leqlistlen : eqlistlen, ret : false,
while ret = false do (pos : 0, for i thru latomlistlen
do if sum(occmatrix     , ii, 1, leqlistlen) = sumvalue
ii, i
then (if sumvalue = 0 then print("Column ", i, " has sum=0 (atom=", llist ,
i
") and must be removed") else print("Column ", i,
" has sum=1 and must be removed"), pos : i, return(pos)),
if pos > 0 then (if sumvalue = 0 then (degmatrix : submatrix(degmatrix, pos),
occmatrix : submatrix(occmatrix, pos), llist : delete(llist   , llist),
pos
latomlistlen : length(llist)) else (degmatrix : submatrix(pos, degmatrix),
occmatrix : submatrix(pos, occmatrix), llist : delete(llist   , llist),
pos
leqlistlen : length(llist))) else ret : true,
if (sumvalue = 0) and (latomlistlen = 0) then error("no atoms remaining")
else (if (sumvalue = 1) and (leqlistlen = 0)
then error("no equations remaining"))), return([degmatrix, occmatrix, llist]))
(%i3) pdesys2pde(alist,atlist,elist,etlist):=block(	[atomlist,atomtlist,eqlist,eqtlist,atomlistlen,atomtlistlen,eqlistlen,eqtlistlen,degmatrix,occmatrix,deglist,occlist,i,j,deg,ret,pos,neqlist,neqlistlen,nneqlist],	eqlist: copylist(elist),	eqtlist: copy(etlist),	atomlist: copylist(alist),	atomtlist: copylist(atlist),	eqlistlen: length(eqlist),	eqtlistlen: length(eqtlist),	atomlistlen: length(atomlist),	atomtlistlen: length(atomtlist),	/* for each equation, get the highest degree for each t-atom */	degmatrix: matrix(),	/* for each atom, get the number of occurrences in the equation set */	occmatrix: matrix(),	for i:1 thru eqtlistlen do (		[deglist,occlist]: get_deg_occ(eqtlist[i],atomtlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),print("Start: ",degmatrix),print("Start: ",occmatrix),	/* remove (recursively) all rows, whose sum is 1, that is, all equation containing atom occuring only once */	[degmatrix,occmatrix,eqtlist]: remove_col_row(degmatrix,occmatrix,eqtlist,atomtlistlen,eqtlistlen,1),	eqtlistlen: length(eqtlist),	/* now remove (recursively) all columns, whose sum is 0: these variables are not used */	[degmatrix,occmatrix,atomtlist]: remove_col_row(degmatrix,occmatrix,atomtlist,atomtlistlen,eqtlistlen,0),	atomtlistlen: length(atomtlist),print("End: ",atomlist),print("End: ",eqlist),print("End: ",degmatrix),print("End: ",occmatrix),return(0),	/* now, each atom exists in at least 2 equations */	/* reduce the set of equations, by eliminating the atoms starting by the highest derivative (x+t) */print("***"),	/* WWWHHH */	pos: atomlistlen,	neqlist: [],	for i:eqlistlen thru 1 step -1 do (		if occmatrix[i,pos]=1 then (print(i),			neqlist: append(neqlist,[eqlist[i]]),			/* remove row i from degmatrix and occmatrix */			degmatrix: submatrix(degmatrix,i),			occmatrix: submatrix(occmatrix,i)		)	),	nneqlist: [],	/* choose the data based on the degree! */	/* this is the basic variation: first equation is fixed */	for i:2 thru neqlistlen do (		nneqlist: append(nneqlist,[resultant(neqlist[1],neqlist[i],atomlist[pos])])	),	neqlist: copylist(nneqlist),	neqlistlen: length(neqlist),	atomlist: delete(atomlist[pos],atomlist),	atomlistlen: length(atomlist),	/* add row to degmatrix and occmatrix */	for i:1 thru neqlistlen do (		[deglist,occlist]: get_deg_occ(neqlist[i],atomlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),	/* now remove columns with sum=0 */	/* WWWHHH */	return(0));
(%o3) pdesys2pde(alist, atlist, elist, etlist) :=
block([atomlist, atomtlist, eqlist, eqtlist, atomlistlen, atomtlistlen,
eqlistlen, eqtlistlen, degmatrix, occmatrix, deglist, occlist, i, j, deg, ret,
pos, neqlist, neqlistlen, nneqlist], eqlist : copylist(elist),
eqtlist : copy(etlist), atomlist : copylist(alist),
atomtlist : copylist(atlist), eqlistlen : length(eqlist),
eqtlistlen : length(eqtlist), atomlistlen : length(atomlist),
atomtlistlen : length(atomtlist), degmatrix : matrix(), occmatrix : matrix(),
for i thru eqtlistlen do ([deglist, occlist] :
get_deg_occ(eqtlist , atomtlist), degmatrix : addrow(degmatrix, deglist),
i
occmatrix : addrow(occmatrix, occlist)), print("Start: ", degmatrix),
print("Start: ", occmatrix), [degmatrix, occmatrix, eqtlist] :
remove_col_row(degmatrix, occmatrix, eqtlist, atomtlistlen, eqtlistlen, 1),
eqtlistlen : length(eqtlist), [degmatrix, occmatrix, atomtlist] :
remove_col_row(degmatrix, occmatrix, atomtlist, atomtlistlen, eqtlistlen, 0),
atomtlistlen : length(atomtlist), print("End: ", atomlist),
print("End: ", eqlist), print("End: ", degmatrix), print("End: ", occmatrix),
return(0), print("***"), pos : atomlistlen, neqlist : [],
for i from eqlistlen step - 1 thru 1 do if occmatrix       = 1
i, pos
then (print(i), neqlist : append(neqlist, [eqlist ]),
i
degmatrix : submatrix(degmatrix, i), occmatrix : submatrix(occmatrix, i)),
nneqlist : [], for i from 2 thru neqlistlen
do nneqlist : append(nneqlist, [resultant(neqlist , neqlist , atomlist   )]),
1         i          pos
neqlist : copylist(nneqlist), neqlistlen : length(neqlist),
atomlist : delete(atomlist   , atomlist), atomlistlen : length(atomlist),
pos
for i thru neqlistlen do ([deglist, occlist] :
get_deg_occ(neqlist , atomlist), degmatrix : addrow(degmatrix, deglist),
i
(%i4) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt],[ut-v*vx,uxt-vx^2-v*vxx,uxxt-3*vx*vxx-v*vxxx],[vt-ux*vxx,utt-vt*vx-v*vxt,vxt-uxx*vxx-ux*vxxx]);
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
End:  [v, vx, vxx, vxxx]
2
End:  [ut - v vx, - v vxx - vx  + uxt, - v vxxx - 3 vx vxx + uxxt]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
(%o4)                                  0
(%i5) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt],[ut-v-vx,uxt-vx-vxx,uxxt-vxx-vxxx],[vt-vxx,utt-vt-vxt,vxt-vxxx]);
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
End:  [v, vx, vxx, vxxx]
End:  [- vx - v + ut, - vxx - vx + uxt, - vxxx - vxx + uxxt]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
(%o5)                                  0
(%i6) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt,vxxt],[ut-u*vxx,uxt-ux*vxx-u*vxxx],[vt-v*vx,utt-ut*vxx-u*vxxt,vxt-vx^2-v*vxx,vxxt-2*vx*vxx-v*vxxx]);
[ 1  0  0 ]
[         ]
[ 0  0  1 ]
Start:  [         ]
[ 0  1  0 ]
[         ]
[ 0  0  1 ]
[ 1  0  0 ]
[         ]
[ 0  0  1 ]
Start:  [         ]
[ 0  1  0 ]
[         ]
[ 0  0  1 ]
Column  1  has sum=1 and must be removed
Column  2  has sum=1 and must be removed
Column  1  has sum=0 (atom= vt ) and must be removed
Column  1  has sum=0 (atom= vxt ) and must be removed
End:  [v, vx, vxx, vxxx]
End:  [ut - u vxx, - u vxxx - ux vxx + uxt]
[ 1 ]
End:  [   ]
[ 1 ]
[ 1 ]
End:  [   ]
[ 1 ]
(%o6)                                  0
(%i7) ```
Run Example
```get_deg_occ(eq,alist):=block(	[atomlistlen,deglist,occlist,i],	atomlistlen: length(alist),	deglist: makelist(0,ii,1,atomlistlen),	occlist: makelist(0,ii,1,atomlistlen),	for i:1 thru atomlistlen do (		deglist[i]: hipow(eq,alist[i]),		if deglist[i]>
0 then (			occlist[i]: 1		)	),	return([deglist,occlist]));
(%o1) get_deg_occ(eq, alist) := block([atomlistlen, deglist, occlist, i],
atomlistlen : length(alist), deglist : makelist(0, ii, 1, atomlistlen),
occlist : makelist(0, ii, 1, atomlistlen),
for i thru atomlistlen do (deglist  : hipow(eq, alist ),
i                  i
if deglist  > 0 then occlist  : 1), return([deglist, occlist]))
i                 i
(%i2) remove_col_row(dmatrix,omatrix,aelist,atomlistlen,eqlistlen,sumvalue):=block(	[degmatrix,occmatrix,llist,llistlen,latomlistlen,leqlistlen,ret,pos,i],	degmatrix: copymatrix(dmatrix),	occmatrix: copymatrix(omatrix),	llist: copylist(aelist),	latomlistlen: atomlistlen,	leqlistlen: eqlistlen,	ret: false,	while ret=false do (		pos: 0,		for i:1 thru latomlistlen do (			if sum(occmatrix[ii,i],ii,1,leqlistlen)=sumvalue then (				if sumvalue=0 then (					print("Column ",i," has sum=0 (atom=",llist[i],") and must be removed")				)				else (					/* sumvalue=1 */					print("Row ",i," has sum=1 and must be removed")				),				pos: i,				return(pos)			)		),		if pos>
0 then (			if sumvalue=0 then (				/* remove column pos from degmatrix and occmatrix, remove pos-th atom from atomlist */				degmatrix: submatrix(degmatrix,pos),				occmatrix: submatrix(occmatrix,pos),				llist: delete(llist[pos],llist),				latomlistlen: length(llist)			)			else (				/* sumvalue=1 */				/* remove row pos from degmatrix and occmatrix, remove pos-th equation from eqlist */				degmatrix: submatrix(pos,degmatrix),				occmatrix: submatrix(pos,occmatrix),				llist: delete(llist[pos],llist),				leqlistlen: length(llist)			)		)		else (			ret: true		),		if sumvalue=0 and latomlistlen=0 then (			error("no atoms remaining")		)		else if sumvalue=1 and leqlistlen=0 then (			error("no equations remaining")		)	),	return([degmatrix,occmatrix,llist]));
(%o2) remove_col_row(dmatrix, omatrix, aelist, atomlistlen, eqlistlen,
sumvalue) := block([degmatrix, occmatrix, llist, llistlen, latomlistlen,
leqlistlen, ret, pos, i], degmatrix : copymatrix(dmatrix),
occmatrix : copymatrix(omatrix), llist : copylist(aelist),
latomlistlen : atomlistlen, leqlistlen : eqlistlen, ret : false,
while ret = false do (pos : 0, for i thru latomlistlen
do if sum(occmatrix     , ii, 1, leqlistlen) = sumvalue
ii, i
then (if sumvalue = 0 then print("Column ", i, " has sum=0 (atom=", llist ,
i
") and must be removed") else print("Row ", i,
" has sum=1 and must be removed"), pos : i, return(pos)),
if pos > 0 then (if sumvalue = 0 then (degmatrix : submatrix(degmatrix, pos),
occmatrix : submatrix(occmatrix, pos), llist : delete(llist   , llist),
pos
latomlistlen : length(llist)) else (degmatrix : submatrix(pos, degmatrix),
occmatrix : submatrix(pos, occmatrix), llist : delete(llist   , llist),
pos
leqlistlen : length(llist))) else ret : true,
if (sumvalue = 0) and (latomlistlen = 0) then error("no atoms remaining")
else (if (sumvalue = 1) and (leqlistlen = 0)
then error("no equations remaining"))), return([degmatrix, occmatrix, llist]))
(%i3) reduce_sys(alist,elist):=block(	[atomlist,eqlist,degmatrix,occmatrix,deglist,occlist],	eqlist: copylist(elist),	atomlist: copylist(alist),	eqlistlen: length(eqlist),	atomlistlen: length(atomlist),	/* for each equation, get the highest degree for each t-atom */	degmatrix: matrix(),	/* for each atom, get the number of occurrences in the equation set */	occmatrix: matrix(),	for i:1 thru eqlistlen do (		[deglist,occlist]: get_deg_occ(eqlist[i],atomlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),print("Start: ",degmatrix),print("Start: ",occmatrix),	/* remove (recursively) all rows, whose sum is 1, that is, all equation containing atom occuring only once */	[degmatrix,occmatrix,eqlist]: remove_col_row(degmatrix,occmatrix,eqlist,atomlistlen,eqlistlen,1),	eqlistlen: length(eqlist),	/* now remove (recursively) all columns, whose sum is 0: these variables are not used */	[degmatrix,occmatrix,atomlist]: remove_col_row(degmatrix,occmatrix,atomlist,atomlistlen,eqlistlen,0),	atomlistlen: length(atomlist),	return([degmatrix,occmatrix,eqlist,atomlist]));
(%o3) reduce_sys(alist, elist) := block([atomlist, eqlist, degmatrix,
occmatrix, deglist, occlist], eqlist : copylist(elist),
atomlist : copylist(alist), eqlistlen : length(eqlist),
atomlistlen : length(atomlist), degmatrix : matrix(), occmatrix : matrix(),
for i thru eqlistlen do ([deglist, occlist] : get_deg_occ(eqlist , atomlist),
i
occmatrix : addrow(occmatrix, occlist)), print("Start: ", degmatrix),
print("Start: ", occmatrix), [degmatrix, occmatrix, eqlist] :
remove_col_row(degmatrix, occmatrix, eqlist, atomlistlen, eqlistlen, 1),
eqlistlen : length(eqlist), [degmatrix, occmatrix, atomlist] :
remove_col_row(degmatrix, occmatrix, atomlist, atomlistlen, eqlistlen, 0),
atomlistlen : length(atomlist), return([degmatrix, occmatrix, eqlist,
atomlist]))
(%i4) remove_atom(dmatrix,omatrix,alist,elist,pos):=block(	[atomlist,eqlist,degmatrix,occmatrix,deglist,occlistposlist,i],	eqlist: copylist(elist),	atomlist: copylist(alist),	eqlistlen: length(eqlist),	atomlistlen: length(atomlist),	degmatrix: copymatrix(dmatrix),	occmatrix: copymatrix(omatrix),	poslist: [],	for i:1 thru eqlistlen do (		if occmatrix[i,pos]=1 then (			poslist: append(poslist,[i])		)	),	if length(poslist)#2 then (		error("too much equations")	),	neq: expand(resultant(eqlist[poslist[1]],eqlist[poslist[2]],atomlist[pos])),	degmatrix: submatrix(poslist[1],poslist[2],degmatrix,pos),	occmatrix: submatrix(poslist[1],poslist[2],occmatrix,pos),	atomlist: delete(atomlist[pos],atomlist),	eqlist: delete(eqlist[poslist[2]],eqlist),	eqlist: delete(eqlist[poslist[1]],eqlist),	eqlist: append(eqlist,[neq]),	if length(atomlist)#0 then (		[deglist,occlist]: get_deg_occ(neq,atomlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),		return([degmatrix,occmatrix,eqlist,atomlist]));
(%o4) remove_atom(dmatrix, omatrix, alist, elist, pos) :=
block([atomlist, eqlist, degmatrix, occmatrix, deglist, occlistposlist, i],
eqlist : copylist(elist), atomlist : copylist(alist),
eqlistlen : length(eqlist), atomlistlen : length(atomlist),
degmatrix : copymatrix(dmatrix), occmatrix : copymatrix(omatrix),
poslist : [], for i thru eqlistlen do if occmatrix       = 1
i, pos
then poslist : append(poslist, [i]), if length(poslist) # 2
then error("too much equations"), neq :
expand(resultant(eqlist        , eqlist        , atomlist   )),
poslist         poslist           pos
1               2
degmatrix : submatrix(poslist , poslist , degmatrix, pos),
1         2
occmatrix : submatrix(poslist , poslist , occmatrix, pos),
1         2
atomlist : delete(atomlist   , atomlist),
pos
eqlist : delete(eqlist        , eqlist),
poslist
2
eqlist : delete(eqlist        , eqlist), eqlist : append(eqlist, [neq]),
poslist
1
if length(atomlist) # 0 then ([deglist, occlist] : get_deg_occ(neq, atomlist),
return([degmatrix, occmatrix, eqlist, atomlist]))
(%i5) pdesys2pde(alist,atlist,elist,etlist):=block(	[atomlist,atomtlist,eqlist,eqtlist,atomlistlen,atomtlistlen,eqlistlen,eqtlistlen,degmatrix,occmatrix,deglist,occlist,i,j,deg,ret,pos,neqlist,neqlistlen,nneqlist],	eqlist: copylist(elist),	eqtlist: copy(etlist),	atomlist: copylist(alist),	atomtlist: copylist(atlist),	eqlistlen: length(eqlist),	eqtlistlen: length(eqtlist),	atomlistlen: length(atomlist),	atomtlistlen: length(atomtlist),	[degmatrix,occmatrix,eqtlist,atomtlist]: reduce_sys(atomtlist,eqtlist),	eqtlistlen: length(eqtlist),	atomtlistlen: length(atomtlist),print("End: ",atomlist),print("End: ",atomtlist),print("End: ",eqlist),print("End: ",eqtlist),print("End: ",degmatrix),print("End: ",occmatrix),	done: false,	while done=false do (		pos: 0,print(atomtlistlen,eqtlistlen),		for i:atomtlistlen thru 1 step -1 do (			if sum(occmatrix[ii,i],ii,1,eqlistlen)=2 then (				pos:i,				return(pos)			)		),		if pos>
0 then (			print("can do: ",pos),			[degmatrix,occmatrix,eqtlist,atomtlist]: remove_atom(degmatrix,occmatrix,atomtlist,eqtlist,pos),			eqtlistlen: length(eqtlist),			atomtlistlen: length(atomtlist)		)		else (			error("nothing can be done")		),		if atomtlistlen=0 then (			done: true		),		done: true	),print("End: ",atomlist),print("End: ",atomtlist),print("End: ",eqlist),print("End: ",eqtlist),print("End: ",degmatrix),print("End: ",occmatrix),return(0),	/* now, each atom exists in at least 2 equations */	/* reduce the set of equations, by eliminating the atoms starting by the highest derivative (x+t) */print("***"),	/* WWWHHH */	pos: atomlistlen,	neqlist: [],	for i:eqlistlen thru 1 step -1 do (		if occmatrix[i,pos]=1 then (print(i),			neqlist: append(neqlist,[eqlist[i]]),			/* remove row i from degmatrix and occmatrix */			degmatrix: submatrix(degmatrix,i),			occmatrix: submatrix(occmatrix,i)		)	),	nneqlist: [],	/* choose the data based on the degree! */	/* this is the basic variation: first equation is fixed */	for i:2 thru neqlistlen do (		nneqlist: append(nneqlist,[resultant(neqlist[1],neqlist[i],atomlist[pos])])	),	neqlist: copylist(nneqlist),	neqlistlen: length(neqlist),	atomlist: delete(atomlist[pos],atomlist),	atomlistlen: length(atomlist),	/* add row to degmatrix and occmatrix */	for i:1 thru neqlistlen do (		[deglist,occlist]: get_deg_occ(neqlist[i],atomlist),		degmatrix: addrow(degmatrix,deglist),		occmatrix: addrow(occmatrix,occlist)	),	/* now remove columns with sum=0 */	/* WWWHHH */	return(0));
(%o5) pdesys2pde(alist, atlist, elist, etlist) :=
block([atomlist, atomtlist, eqlist, eqtlist, atomlistlen, atomtlistlen,
eqlistlen, eqtlistlen, degmatrix, occmatrix, deglist, occlist, i, j, deg, ret,
pos, neqlist, neqlistlen, nneqlist], eqlist : copylist(elist),
eqtlist : copy(etlist), atomlist : copylist(alist),
atomtlist : copylist(atlist), eqlistlen : length(eqlist),
eqtlistlen : length(eqtlist), atomlistlen : length(atomlist),
atomtlistlen : length(atomtlist), [degmatrix, occmatrix, eqtlist, atomtlist] :
reduce_sys(atomtlist, eqtlist), eqtlistlen : length(eqtlist),
atomtlistlen : length(atomtlist), print("End: ", atomlist),
print("End: ", atomtlist), print("End: ", eqlist), print("End: ", eqtlist),
print("End: ", degmatrix), print("End: ", occmatrix), done : false,
while done = false do (pos : 0, print(atomtlistlen, eqtlistlen),
for i from atomtlistlen step - 1 thru 1
do if sum(occmatrix     , ii, 1, eqlistlen) = 2 then (pos : i, return(pos)),
ii, i
if pos > 0 then (print("can do: ", pos),
[degmatrix, occmatrix, eqtlist, atomtlist] :
remove_atom(degmatrix, occmatrix, atomtlist, eqtlist, pos),
eqtlistlen : length(eqtlist), atomtlistlen : length(atomtlist))
else error("nothing can be done"), if atomtlistlen = 0 then done : true,
done : true), print("End: ", atomlist), print("End: ", atomtlist),
print("End: ", eqlist), print("End: ", eqtlist), print("End: ", degmatrix),
print("End: ", occmatrix), return(0), print("***"), pos : atomlistlen,
neqlist : [], for i from eqlistlen step - 1 thru 1
do if occmatrix       = 1 then (print(i),
i, pos
neqlist : append(neqlist, [eqlist ]), degmatrix : submatrix(degmatrix, i),
i
occmatrix : submatrix(occmatrix, i)), nneqlist : [],
for i from 2 thru neqlistlen do nneqlist :
append(nneqlist, [resultant(neqlist , neqlist , atomlist   )]),
1         i          pos
neqlist : copylist(nneqlist), neqlistlen : length(neqlist),
atomlist : delete(atomlist   , atomlist), atomlistlen : length(atomlist),
pos
for i thru neqlistlen do ([deglist, occlist] :
get_deg_occ(neqlist , atomlist), degmatrix : addrow(degmatrix, deglist),
i
(%i6) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt],[ut-v*vx,uxt-vx^2-v*vxx,uxxt-3*vx*vxx-v*vxxx],[vt-ux*vxx,utt-vt*vx-v*vxt,vxt-uxx*vxx-ux*vxxx]);
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
End:  [v, vx, vxx, vxxx]
End:  [vt, vxt]
2
End:  [ut - v vx, - v vxx - vx  + uxt, - v vxxx - 3 vx vxx + uxxt]
End:  [vt - ux vxx, - v vxt - vt vx + utt, - ux vxxx - uxx vxx + vxt]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
2 3
can do:  2
End:  [v, vx, vxx, vxxx]
End:  [vt]
2
End:  [ut - v vx, - v vxx - vx  + uxt, - v vxxx - 3 vx vxx + uxxt]
End:  [vt - ux vxx, ux v vxxx + uxx v vxx + vt vx - utt]
[ 1 ]
End:  [   ]
[ 1 ]
[ 1 ]
End:  [   ]
[ 1 ]
(%o6)                                  0
(%i7) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt],[ut-v-vx,uxt-vx-vxx,uxxt-vxx-vxxx],[vt-vxx,utt-vt-vxt,vxt-vxxx]);
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
Start:  [ 1  1 ]
[      ]
[ 0  1 ]
End:  [v, vx, vxx, vxxx]
End:  [vt, vxt]
End:  [- vx - v + ut, - vxx - vx + uxt, - vxxx - vxx + uxxt]
End:  [vt - vxx, - vxt - vt + utt, vxt - vxxx]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
[ 1  0 ]
[      ]
End:  [ 1  1 ]
[      ]
[ 0  1 ]
2 3
can do:  2
End:  [v, vx, vxx, vxxx]
End:  [vt]
End:  [- vx - v + ut, - vxx - vx + uxt, - vxxx - vxx + uxxt]
End:  [vt - vxx, vxxx + vt - utt]
[ 1 ]
End:  [   ]
[ 1 ]
[ 1 ]
End:  [   ]
[ 1 ]
(%o7)                                  0
(%i8) pdesys2pde([v,vx,vxx,vxxx],[vt,vxt,vxxt],[ut-u*vxx,uxt-ux*vxx-u*vxxx],[vt-v*vx,utt-ut*vxx-u*vxxt,vxt-vx^2-v*vxx,vxxt-2*vx*vxx-v*vxxx]);
[ 1  0  0 ]
[         ]
[ 0  0  1 ]
Start:  [         ]
[ 0  1  0 ]
[         ]
[ 0  0  1 ]
[ 1  0  0 ]
[         ]
[ 0  0  1 ]
Start:  [         ]
[ 0  1  0 ]
[         ]
[ 0  0  1 ]
Row  1  has sum=1 and must be removed
Row  2  has sum=1 and must be removed
Column  1  has sum=0 (atom= vt ) and must be removed
Column  1  has sum=0 (atom= vxt ) and must be removed
End:  [v, vx, vxx, vxxx]
End:  [vxxt]
End:  [ut - u vxx, - u vxxx - ux vxx + uxt]
End:  [- u vxxt - ut vxx + utt, - v vxxx + vxxt - 2 vx vxx]
[ 1 ]
End:  [   ]
[ 1 ]
[ 1 ]
End:  [   ]
[ 1 ]
1 2
can do:  1
End:  [v, vx, vxx, vxxx]
End:  []
End:  [ut - u vxx, - u vxxx - ux vxx + uxt]
End:  [u v vxxx + 2 u vx vxx + ut vxx - utt]
End:  matrix()
End:  matrix()
(%o8)                                  0
(%i9) ```

### Related Help

Help for Copylist