This method determines if a given element g is contained in the radical of a given ideal I. There are 2 algorithms implemented for doing so: the first (default) uses the Rabinowitsch trick in the proof of the Nullstellensatz, and is called with Strategy => "Rabinowitsch". The second algorithm, for homogeneous ideals, uses a theorem of Kollar to obtain an effective upper bound on the required power to check containment, together with repeated squaring, and is called with Strategy => "Kollar". The latter algorithm is generally quite fast if a Grobner basis of I has already been computed. A recommended way to do so is to check ordinary containment, i.e. g % I == 0, before calling this function.
i1 : d = (4,5,6,7) o1 = (4, 5, 6, 7) o1 : Sequence |
i2 : n = #d o2 = 4 |
i3 : R = QQ[x_0..x_n] o3 = R o3 : PolynomialRing |
i4 : I = ideal homogenize(matrix{{x_1^(d#0)} | apply(toList(1..n-2), i -> x_i - x_(i+1)^(d#i)) | {x_(n-1) - x_0^(d#-1)}}, x_n) 4 5 4 6 5 7 6 o4 = ideal (x , - x + x x , - x + x x , - x + x x ) 1 2 1 4 3 2 4 0 3 4 o4 : Ideal of R |
i5 : D = product(I_*/degree/sum) o5 = 840 |
i6 : x_0^(D-1) % I != 0 and x_0^D % I == 0 o6 = true |
i7 : elapsedTime radicalContainment(x_0, I) -- 0.161006 seconds elapsed o7 = true |
i8 : elapsedTime radicalContainment(x_0, I, Strategy => "Kollar") -- 0.00285815 seconds elapsed o8 = true |
i9 : elapsedTime radicalContainment(x_n, I, Strategy => "Kollar") -- 0.00254443 seconds elapsed o9 = false |
The object radicalContainment is a method function with options.