`type/unipoly` := proc(f) type(f,list([rational,nonnegint])) end: AddPol := proc( f::unipoly, g::unipoly ) local m,n,h,i,j,k,c; m,n := nops(f),nops(g); h := Array(1..m+n); i,j,k := 1,1,0; while i<=m and j<=n do if f[i][2]>g[j][2] then k++; h[k] := f[i]; i++; elif f[i][2]0 then k++; h[k] := [c,f[i][2]]; fi; i++; j++; fi; od; while i<=m do k++; h[k] := f[i]; i++; od; while j<=n do k++; h[k] := g[j]; j++; od; h := [seq( h[i], i=1..k )]; end: MAPLE2SPARSE := proc(f,x) local cofs,mons,i; cofs := coeffs(f,x,'mons'); cofs,mons := [cofs],[mons]; [seq( [cofs[i],degree(mons[i],x)], i=1..nops(cofs) )]; end: SPARSE2MAPLE := proc(f,x) local t; add( t[1]*x^t[2], t in f ); end: f := 2*x^3+4*x+3*x^2; F := MAPLE2SPARSE(f,x); g := 3*x^4-3*x^2+x^3-2*x; G := MAPLE2SPARSE(g,x); H := AddPol(F,G); SPARSE2MAPLE(H,x); f+g; MulPol := proc(f::unipoly,g::unipoly) local h,s,t,T; h := []; # h = 0 for s in f do T := [seq( [s[1]*t[1], s[2]+t[2]], t in g )]; h := AddPol(h,T); od; h; end: H := MulPol(F,G); SPARSE2MAPLE(H,x); expand(f*g);