-*- M2 -*-

a formative attempt:

symmetricPower(ZZ, Matrix) := Matrix => (i,m) -> map(ring m, rawSymmetricPower(i, raw m))

symmetricPower(ZZ, Module) := (d,M) -> (
     -- written by David Eisenbud
     -- modified by Dan Grayson
     SM := symmetricAlgebra(M,Degrees => toList (numgens M : 1));
     B := basis(d, SM);
     md := presentation image B;
     prune cokernel ((map(ring M, SM)) md))
symmetricPower(ZZ,Matrix) := (i,m) -> (
     if true and numRows m != 1 then (
     	  -- written by David Eisenbud
	  -- modified by Dan Grayson
	  Ssource := symmetricAlgebra(source m, Degrees => toList (numgens source m : 1));
	  Starget := symmetricAlgebra(target m, Degrees => toList (numgens target m : 1));
	  Sm := map(Starget, Ssource, vars Starget * promote(m, Starget));
	  (map(ring m, Starget))(Sm basis (i, Ssource) // basis (i, Starget)))
     else (
	  -- old code, probably not right now, because we need agreement with the symmetric power module, which might have relations
	  map(ring m, rawSymmetricPower(i, raw m))
	  ))
