Macaulay2 » Documentation
Packages » FastMinors :: RegularInCodimensionTutorial
next | previous | forward | backward | up | index | toc

RegularInCodimensionTutorial -- A tutorial for how to use the advanced options of the regularInCodimension function

Description

In this tutorial we explore the different options of RegularInCodimension (and related functions) on some cone singularities. For the most part we will not talk about the Strategy option, we have a separate tutorial for that FastMinorsStrategyTutorial.

We begin with the following ideal.

i1 : S = ZZ/103[x_1..x_9];
i2 : J = ideal(x_6*x_8-x_5*x_9,x_3*x_8-x_2*x_9,x_6*x_7-x_4*x_9,x_5*x_7-x_4*x_8,x_3*x_7-x_1*x_9,x_2*x_7-x_1*x_8,x_3*x_5-x_2*x_6,x_3*x_4-x_1*x_6,x_2*x_4-x_1*x_5,x_3^3-x_6^3-x_9^3,x_2*x_3^2-x_5*x_6^2-x_8*x_9^2,x_1*x_3^2-x_4*x_6^2-x_7*x_9^2,x_2^2*x_3-x_5^2*x_6-x_8^2*x_9,x_1*x_2*x_3-x_4*x_5*x_6-x_7*x_8*x_9,x_1^2*x_3-x_4^2*x_6-x_7^2*x_9,x_2^3-x_5^3-x_8^3,x_1*x_2^2-x_4*x_5^2-x_7*x_8^2,x_1^2*x_2-x_4^2*x_5-x_7^2*x_8,x_1^3-x_4^3-x_7^3);

o2 : Ideal of S
i3 : dim (S/J)

o3 = 4

It is the cone over $P^2 \times E$ where $E$ is an elliptic curve. We have embedded it with a Segre embedding inside $P^8$. In particular, this example is even regular in codimension 3.

i4 : time regularInCodimension(1, S/J)
 -- used 3.39871s (cpu); 2.46775s (thread); 0s (gc)

o4 = true
i5 : time regularInCodimension(2, S/J)
 -- used 14.2393s (cpu); 10.7346s (thread); 0s (gc)

o5 = true

We try to verify that $S/J$ is regular in codimension 1 or 2 by computing the ideal made up of a small number of minors of the Jacobian matrix. In this example, instead of computing all relevant 1465128 minors to compute the singular locus, and then trying to compute the dimension of the ideal they generate, we instead compute a few of them. regularInCodimension returns true if it verified that the ring is regular in codim 1 or 2 (respectively) and null if not. Because of the randomness that exists in terms of selecting minors, the execution time can actually vary quite a bit. Let's take a look at what is occurring by using the Verbose option. We go through the output and explain what each line is telling us.

i6 : time regularInCodimension(1, S/J, Verbose=>true)
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- used 3.8699s (cpu); 2.87289s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 452.908 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 7, and computed = 6
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 11, and computed = 9
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 15, and computed = 11
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 21, and computed = 15
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 28, and computed = 21
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 37, and computed = 29
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 49, and computed = 38
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 64, and computed = 48
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 84, and computed = 58
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 110, and computed = 73
regularInCodimension:  singularLocus dimension verified by isCodimAtLeast
regularInCodimension:  partial singular locus dimension computed, = 2
regularInCodimension:  Loop completed, submatrices considered = 110, and computed = 73.  singular locus dimension appears to be = 2

o6 = true

MaxMinors. The first output says that we will compute up to 452.9 minors before giving up. We can control that by setting the option MaxMinors.

i7 : time regularInCodimension(1, S/J, MaxMinors=>10, Verbose=>true)
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- used 0.280755s (cpu); 0.197196s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 10 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 7, and computed = 7
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 10, and computed = 10
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop completed, submatrices considered = 10, and computed = 10.  singular locus dimension appears to be = 3

There are other finer ways to control the MaxMinors option, but they will not be discussed in this tutorial. See regularInCodimension.

Selecting submatrices of the Jacobian. We also see output like: ``Choosing LexSmallest'' or ``Choosing Random''. This is saying how we are selecting a given submatrix. For instance, we can run:

i8 : time regularInCodimension(1, S/J, MaxMinors=>10, Strategy=>StrategyRandom, Verbose=>true)
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- used 0.279282s (cpu); 0.200788s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 10 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 7, and computed = 7
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 10, and computed = 10
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop completed, submatrices considered = 10, and computed = 10.  singular locus dimension appears to be = 3

and only random submatrices are chosen. We discuss strategies for choosing submatrices much more generally in the FastMinorsStrategyTutorial. Regardless, after a certain number of minors have been looked at, we see output lines like: ``Loop step, about to compute dimension. Submatrices considered: 7, and computed = 7''. We only compute minors we haven't considered before. So as we compute more minors, there can be a distinction between considered and computed.

Computing minors vs considering the dimension of what has been computed. Periodically we compute the codimension of the partial ideal of minors we have computed so far. There are two options to control this. First, we can tell the function when to first compute the dimension of the working partial ideal of minors.

i9 : time regularInCodimension(1, S/J, MaxMinors=>10, MinMinorsFunction => t->3, Verbose=>true)
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing Random
 -- used 0.450653s (cpu); 0.333958s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 10 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 3, and computed = 3
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 6, and computed = 6
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 8, and computed = 8
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 10, and computed = 10
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop completed, submatrices considered = 10, and computed = 10.  singular locus dimension appears to be = 3

MinMinorsFunction. We pass MinMinorsFunction a function which sends the minimum number of minors needed to verify that something is regular in codimension $n$ (which is always $n+1$) to the number of minors to compute before computing the dimension of the partial ideal of minors for the first time. You can see that three minors were computed in the above example before we attempt to compute codimension.

CodimCheckFunction. The option CodimCheckFunction controls how frequently the dimension of the partial ideal of minors is computed. For instance, setting CodimCheckFunction => t -> t/5 will say it should compute dimension after every 5 minors are examined. In general, after the output of the CodimCheckFunction increases by an integer we compute the codimension again. The default function has the space between computations grow exponentially.

i10 : time regularInCodimension(1, S/J, MaxMinors=>25, CodimCheckFunction => t->t/5, MinMinorsFunction => t->2, Verbose=>true)
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallest
 -- used 1.39538s (cpu); 1.06085s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 25 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 2, and computed = 2
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 5, and computed = 5
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 10, and computed = 10
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 15, and computed = 15
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 20, and computed = 20
regularInCodimension:  isCodimAtLeast failed, computing codim.
regularInCodimension:  partial singular locus dimension computed, = 3
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 25, and computed = 24
regularInCodimension:  singularLocus dimension verified by isCodimAtLeast
regularInCodimension:  partial singular locus dimension computed, = 2
regularInCodimension:  Loop completed, submatrices considered = 25, and computed = 24.  singular locus dimension appears to be = 2

o10 = true

isCodimAtLeast and dim. We see the lines about the ``isCodimAtLeast failed''. This means that isCodimAtLeast was not enough on its own to verify that our ring is regular in codimension 1. After this, ``partial singular locus dimension computed'' indicates we did a complete dimension computation of the partial ideal defining the singular locus. How isCodimAtLeast is called can be controlled via the options SPairsFunction and PairLimit, which are simply passed to isCodimAtLeast. You can force the function to only use isCodimAtLeast and not call dimension by setting UseOnlyFastCodim => true.

i11 : time regularInCodimension(1, S/J, MaxMinors=>25, UseOnlyFastCodim => true, Verbose=>true)
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing Random
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing RandomNonZero
 -- internalChooseMinor: Choosing LexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing LexSmallest
 -- internalChooseMinor: Choosing GRevLexSmallestTerm
 -- internalChooseMinor: Choosing GRevLexSmallest
 -- internalChooseMinor: Choosing RandomNonZero
 -- used 1.01742s (cpu); 0.74829s (thread); 0s (gc)
regularInCodimension: ring dimension =4, there are 1465128 possible 5 by 5 minors, we will compute up to 25 of them.
regularInCodimension: About to enter loop
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 7, and computed = 7
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 11, and computed = 11
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 15, and computed = 14
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 21, and computed = 19
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop step, about to compute dimension.  Submatrices considered: 25, and computed = 23
regularInCodimension:  partial singular locus dimension computed, = 4
regularInCodimension:  Loop completed, submatrices considered = 25, and computed = 23.  singular locus dimension appears to be = 4

This can be useful if the function is hanging when trying to compute the dimension, but you may wish increase PairLimit.

Summary. If you expect that finding a submatrix or computing a minor is relatively costly from a time perspective, then it makes sense to compute the codimension more frequently. If computing the codimension is relatively costly we recommend computing the codimension less frequently, or using the UseOnlyFastCodim => true with a high PairLimit. For example, if using StrategyPoints, then choosing a submatrix can be quite slow, however each submatrix is very ``valuable'', in that adding it to the ideal of minors so far is quite likely to reduce the dimension of the singular locus.

One may also change how minors (determinants of the Jacobian submatrix) are computed by using the DetStrategy option.

Proving a singularity is not regular.

Sometimes you think that a variety is not regular in codimension n. In that case, you can use the option VerifyNonRegular=>true. Below we have an example of a nodal elliptic curve cross P^1 expressed as a Segre prodcut, it is not even regular in codimension 1.

i12 : B = ZZ/103[a,b,c,d,e,f]/ideal(d*e-c*f,b*e-a*f,b*c-a*d,b^3-b^2*f-d^2*f,a*b^2-a*b*f-c*d*f,a^2*b-a^2*f-c^2*f,a^3-a^2*e-c^2*e)

o12 = B

o12 : QuotientRing
i13 : regularInCodimension(1, B, VerifyNonRegular=>true)

o13 = false

See also

For the programmer

The object RegularInCodimensionTutorial is a symbol.


The source of this document is in FastMinors.m2:1626:0.