primaryDecomposition M
This routine returns a minimal primary decomposition for the zero submodule of M, i.e. a minimal list of submodules Q_i of M such that the intersection of all the Q_i is 0 and Ass(M/Q_i) = {p_i} for some associated prime p_i of M.
Here minimality means that the associated primes of the submodules are pairwise distinct, and that the decomposition is irredundant, i.e. no submodule contains the intersection of the others. The i-th element of this output is primary to the i-th element of associatedPrimes M. The algorithm used is inspired by the Eisenbud-Huneke-Vasconcelos algorithm, modified to work for modules.
|
|
|
|
|
|
|
|
Recall that in Macaulay2, a module is commonly represented as a subquotient, which is an ordered pair consisting of generators and relations represented as column matrices. As submodules of M, each module in the output list has the same relations as M, and has generators which are R-linear combinations of generators of M, where R = ring M.
To obtain a primary decomposition of a submodule N, run this function on the quotient M/N. Note that the / command does not check whether N is actually a submodule of M, and a non-sensible result may be returned if this is not the case.
This function generalizes primary decomposition of ideals (more precisely, cyclic modules), as can be seen by calling primaryDecomposition comodule I for an ideal I. For convenience, one can also call primaryDecomposition R for a ring R (which is most useful when R is a QuotientRing). When computing primary decompositions of ideals with this function, remember to add back the original ideal to obtain the desired primary ideals, as in the following example.
|
|
|
|
|
|
The results of the computation are stored inside M.cache, as a MutableHashTable whose keys are associated primes and values are the corresponding primary components. The list of all associated prime ideals is also cached, and can be obtained with associatedPrimes M. The computation may be interrupted at any point, and can be resumed later without recomputing already known primary components. To display detailed information throughout the computation, set the global variable debugLevel to a value greater than 0, e.g. debugLevel=1 (or debugLevel=2 for even more detail).
This function has one optional input Strategy, which accepts 3 possible values that determine the algorithm for finding embedded components.
This strategy is closest to the original Eisenbud-Huneke-Vasconcelos method.
While the default (and typically fastest) strategy is Sat, it is recommended to try different Strategy values if the computation of a particular embedded component is taking too long. One can start the computation with one strategy, and interrupt and resume with a different strategy (even multiple times) if desired.
Note that although isolated components (i.e. those corresponding to minimal primes) are unique, embedded components are never unique, and thus specifying generators of an embedded component requires non-canonical choices. For speed purposes, this algorithm searches for embedded components obtained by adding a bracket power of the embedded prime, with exponent determined by the degrees of generators of the embedded prime and ann M. In particular, the generators of an embedded component may not be of minimal possible degree.