  Key
    schurModule
    (schurModule, List, Module)
  Headline
    creates Schur module from a partition and free module
  Usage
    schurModule(lambda,E)
  Inputs
    lambda:List
      a list of numbers representing a partition; e.g. {3,1} stands for 2 rows of length 3 and 1. 
    E:Module
      a free module
  Outputs 
    M:Module
      The result of application of the Schur functor associated to lambda to E. 
  Description
    Text
      Applies the Schur functor associated to lambda to the free module E.
      For a detailed definition of the Schur module see p.106 of Fulton "Young Tableaux".

      The resulting M comes with cached data M.cache.Schur = {f, finv, AT, ST} where 

      {"f is a map from exterior_mu E to M;", 
	  "finv is a map from M to exterior_mu E;",
	  "AT is a hash table of all tableaux, whose entries increase in every column;",
	  "ST is a hash table of all standard tableaux (tableaux in AT, whose entries nondecrease in every row)."
	  }

      Tableaux are represented with objects of class Filling, 
      which is a double list whose entries are lists giving the fillings of the corresponding columns.          
    Example
      M=QQ^3;
      scan(4, i-> << i+1 << "-th symmetric power of M = " << schurModule({i+1},M) << endl)
      S = schurModule({3,2,1}, M);
      v = sum(numgens S, i-> (i+1)*S_i) -- an element of S represented by a vector
      printSchurModuleElement(v, S); 
  Caveat
    The partition lambda should be a valid nonempty partition.
  SeeAlso
    schur
