(* Content-type: application/mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 6.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 145, 7] NotebookDataLength[ 126640, 3952] NotebookOptionsPosition[ 114771, 3569] NotebookOutlinePosition[ 115320, 3589] CellTagsIndexPosition[ 115277, 3586] WindowFrame->Normal ContainsDynamic->False*) (* Beginning of Notebook Content *) Notebook[{ Cell[CellGroupData[{ Cell["Using the groebner60.m Package", "Title", CellChangeTimes->{{3.424628733897263*^9, 3.424628735068343*^9}}], Cell["\<\ By William Gryc and Ben Krause, Amherst College \tCongratulations! You've downloaded the new groebner60.m package and are \ now itching to use it. But there are so many commands, and so many \ parameters that your head is spinning. Well, this tutorial is designed for \ you. Before starting, make sure you have your copy of \"Ideals, Varieties, \ and Algorithms\" handy since there will be frequent references to sections of \ the text. On to.....\ \>", "Text", CellChangeTimes->{{3.4246287395619497`*^9, 3.42462874339624*^9}, { 3.424697718708481*^9, 3.424697719158422*^9}}], Cell[CellGroupData[{ Cell["The Basics", "Section"], Cell["\<\ \tThese are the basic commands you will be using in the package. Most of the \ algorithms here are detailed in \"Ideals, Varieties, and Algorithms.\" \ Remember, for this package to work properly, you must have \"groebner60.m\". \ Also, this package might be slow in parts, especially in some of the more \ advanced commands. \tBefore you can do anything with the package, you must load it. Assuming \ you saved the package under the name \"groebner60.m\", load it by typing: \ \>", "Text", CellChangeTimes->{{3.4246287530178823`*^9, 3.42462875969794*^9}}], Cell[BoxData[ RowBox[{"<<", "groebner60.m"}]], "Input", CellChangeTimes->{{3.424628762915359*^9, 3.424628763744458*^9}}], Cell["\<\ \tThe rest of this tutorial will be devoted to demonstrating the commands of \ the groebner60.m package. At the end of the tutorial, there is a reference \ guide that gives more formal information on commands. For quick reference, \ you might want to look at the reference guide instead of searching through \ the tutorial.\ \>", "Text", CellChangeTimes->{{3.424628769034931*^9, 3.424628769682987*^9}}], Cell[CellGroupData[{ Cell["MonOrder", "Subsection"], Cell[TextData[{ "\tThe most basic command in the package is MonOrder. It sets the monomial \ order (see Chapter 2, Section 2) for all relevant commands in the package \ (i.e. all commands whose output depends on a distinct monomial order). The \ orders that can be set using MonOrder are lex, grlex, grevlex (see Chapter 2, \ Section 2), elimination order (see Chapter 2, Section 4, Exercise 12 and \ Chapter 3, Section 1, Exercise 6), and matrix order. The latter is not dealt \ with in the text explicitly. Say you are working in k[x1,...,xn]. Then a \ matrix order would consist of n linearly independant vectors {", StyleBox["v1, ..., vn", FontWeight->"Bold"], "}, such that \[Alpha] > \[Beta] iff ", StyleBox["v1*", FontWeight->"Bold"], "\[Alpha]>", StyleBox["v1", FontWeight->"Bold"], "*\[Beta], or ", StyleBox["v1*", FontWeight->"Bold"], "\[Alpha]=", StyleBox["v1", FontWeight->"Bold"], "*\[Beta] and ", StyleBox["v2*", FontWeight->"Bold"], "\[Alpha]>", StyleBox["v2", FontWeight->"Bold"], "*\[Beta], or...etc. All monomial orders we will use can be written as \ matrix orders. For example, lex in k[x1, x2, x3] is the matrix order \ {{1,0,0}, {0,1,0},{0,0,1}}. As a matrix, each vector in the list is a row of \ the matrix. Note that the order of the rows is important.\n\tTo see the \ current monomial ordering, type" }], "Text", CellChangeTimes->{{3.429386578071302*^9, 3.429386578329163*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "]"}]], "Input"], Cell[BoxData["Lex"], "Output"] }, Open ]], Cell["\<\ \tThe output is Lex, because Lex is the current (i.e. default) ordering. \ Notice that Lex is capitalized. The package will only recognize the \ capitalized versions of Lex, Grlex, and Grevlex. Changing the ordering to \ lex, grlex, or grevlex is very straightforward. Simply type the name of the \ order (capitalized, of course) as a parameter to MonOrder. For example, to \ change the order to grevlex, type\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "Grevlex", "]"}]], "Input"], Cell[BoxData["Grevlex"], "Output"] }, Open ]], Cell["\<\ \tChanging to an elimination order is different, but not hard. Say you want \ to eliminate the first three of five variables. Then type\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", RowBox[{"{", RowBox[{"3", ",", " ", "5"}], "}"}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{"3", ",", "5"}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tThus, the input is of the form {k, n}, where you want the kth elimination \ order of n variables. Naturally, k must be strictly less than n, or else \ MonOrder will complain and stick with the previous order.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}], "]"}]], "Input"], Cell[BoxData["\<\"Error: Not a valid Elimination form\"\>"], "Print"], Cell[BoxData[ RowBox[{"{", RowBox[{"3", ",", "5"}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tMatrix orders are different yet. Say you wanted to use the matrix order \ determined by the matrix {{3, 0, 5}, {0, 9, 1}, {7, 4, 0}}. This becomes the \ input for MonOrder.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"3", ",", "0", ",", "5"}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "9", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"7", ",", "4", ",", "0"}], "}"}]}], "}"}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"3", ",", "0", ",", "5"}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "9", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"7", ",", "4", ",", "0"}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tMonOrder will complain if the matrix isn't square, or if the rows of the \ matrix aren't linearly independent. Also, notice that with setting an \ elimination or matrix order, the input is a list. Brackets {...} must be \ placed around the list for MonOrder to work properly. \tSo far we've seen how to set the monomial order for the package, but so far \ there is no proof that MonOrder actually is anything more than a mindless \ command that echoes certain input. In the next subsection, we will see that \ it does have an affect on other commands. \ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Division and Computing GroebnerBases", "Subsection"], Cell["\tLet's set the order to Grevlex.", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "Grevlex", "]"}]], "Input"], Cell[BoxData["Grevlex"], "Output"] }, Open ]], Cell["\tLet's create a basis for an ideal", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{"x", " ", "-", " ", RowBox[{"z", "^", "4"}]}], ",", " ", RowBox[{"y", " ", "-", " ", RowBox[{"z", "^", "5"}]}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"x", "-", SuperscriptBox["z", "4"]}], ",", RowBox[{"y", "-", SuperscriptBox["z", "5"]}]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tThe package includes two related commands, PRemainder and PQuotient, that \ allow you to find the remainder and quotient, respectively (and obviously), \ of a polynomial divided by a set of polynomials, relative to the order set by \ MonOrder. Both commands simply use ", StyleBox["Mathematica", FontSlant->"Italic"], "'s built-in PolynomialReduce. (Why we bother placing them in the package \ will be explained in a later part of this subsection.) PolynomialReduce is a \ quick implementation of the Divison Algorithm of Chapter 2 Section 3. Let's \ try an example." }], "Text", CellChangeTimes->{3.429386617871071*^9}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"PRemainder", "[", RowBox[{ RowBox[{ RowBox[{"-", "y"}], " ", "+", " ", RowBox[{"x", "*", "z"}]}], ",", " ", "basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{ RowBox[{"-", "y"}], "+", RowBox[{"x", " ", "z"}]}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"PQuotient", "[", RowBox[{ RowBox[{ RowBox[{"-", "y"}], " ", "+", RowBox[{"x", "*", "z"}]}], ",", " ", "basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tEven though -y +xz has a nonzero remainder, it might still be in the ideal \ generated by the basis. What we need is a Groebner basis for the ideal. \tBut maybe our ideal is already a Groebner basis. To check, the package \ provides the GroebnerQ command. Its input is a polynomial list, followed by \ the variable list. There is also an optional third parameter which allows \ GroebnerQ to use a monomial order different from the one set by MonOrder. \ For example, let's try GroebnerQ on our basis.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"GroebnerQ", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["False"], "Output"] }, Open ]], Cell["\tMaybe it's a Groebner basis with respect to Lex order.", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"GroebnerQ", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", "Lex"}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell["\<\ \tSo it is a Groebner basis in Lex order! Even though GroebnerQ used a \ different monomial order, it did not change the preset order.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "]"}]], "Input"], Cell[BoxData["Grevlex"], "Output"] }, Open ]], Cell["\<\ \tNow we know that are basis isn't a Groebner basis in Grevlex, we want to \ find its Groebner basis (i.e. we want to do exercise 2c in Chapter 2 \ Section 7). This package provides three ways to find it. First, and most \ basic, is the command Buch. Buch implements the basic Buchberger algorithm \ as detailed in Chapter 2 Section 7. As arguments, Buch takes a list of \ polynomials (like our basis), and a list of variables (remember, order of the \ variables is important). The monomial order depends on the monomial order \ already set by MonOrder. So, to find a Groebner basis for our basis with \ respect to Grevlex ordering, we type\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Buch", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{"y", "-", RowBox[{"x", " ", "z"}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 1, ": ", {y - x z}, " added."], Editable->False]], "Print"], Cell[BoxData["\<\" 1 division performed.\"\>"], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "2", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{"-", SuperscriptBox["x", "2"]}], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 2, ": ", {-x^2 + y z^3}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "2", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 2, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ SuperscriptBox["x", "3"], "-", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 3, ": ", {x^3 - y^2 z^2}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 3, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "4", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ SuperscriptBox["x", "4"], "-", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 4, ": ", {x^4 - y^3 z}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "4", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 4, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "5", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 5, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "5", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 5, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"15", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[15, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"x", "-", SuperscriptBox["z", "4"]}], ",", RowBox[{"y", "-", SuperscriptBox["z", "5"]}], ",", RowBox[{"y", "-", RowBox[{"x", " ", "z"}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "2"]}], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ SuperscriptBox["x", "3"], "-", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ SuperscriptBox["x", "4"], "-", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}]}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tNotice that Buch prints how many divisions it had to do with the \ S-Polynomials, and every time a polynomial is added to the basis, it prints \ that polynomial and how many divisions there were between what was just added \ and the previous added polynomial. This printing may be removed, by setting \ the PrintSteps option to False.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Buch", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"PrintSteps", " ", "->", " ", "False"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"x", "-", SuperscriptBox["z", "4"]}], ",", RowBox[{"y", "-", SuperscriptBox["z", "5"]}], ",", RowBox[{"y", "-", RowBox[{"x", " ", "z"}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "2"]}], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ SuperscriptBox["x", "3"], "-", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ SuperscriptBox["x", "4"], "-", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}]}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tSadly, this version of the Buch algorithm is very naive and, consequently, \ very slow. There is a minor variation on Buch called AltBuchberger. In \ computing the remainders for S-polynomials, AltBuchberger uses the most \ up-to-date basis for division. The algorithm in the text is modified so the \ set of dividing polynomials is G as opposed to G' (see the Buchberger \ Algorithm Chapter 2 Section 7). This minor refinement can yield dramatic \ results. Consider the following example:\ \>", "Text", CellChangeTimes->{{3.4293866774066896`*^9, 3.4293866782946987`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basisprime", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"x", "^", "3"}], " ", "-", " ", RowBox[{"z", "^", "2"}]}], ",", " ", RowBox[{ RowBox[{"y", "^", "3"}], " ", "+", " ", "z"}], ",", " ", RowBox[{ RowBox[{ RowBox[{"x", "^", "2"}], "*", "y"}], " ", "+", " ", RowBox[{"x", "*", RowBox[{"y", "^", "2"}]}]}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ SuperscriptBox["x", "3"], "-", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "3"], "+", "z"}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "y"}], "+", RowBox[{"x", " ", SuperscriptBox["y", "2"]}]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"m", " ", "=", RowBox[{"Buch", "[", RowBox[{"basisprime", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "-", RowBox[{"y", " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "z"}], "+", RowBox[{"x", " ", "y", " ", "z"}]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 1, ": ", {-x z - y z^2, x^2 z + x y z}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 3, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "2", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["y", "2"], " ", "z"}], "+", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["y", "2"], " ", "z"}], "+", SuperscriptBox["z", "3"]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm[ "Step ", 2, ": ", { x y^2 z - z^3, -x y^2 z + z^3, x y^2 z - z^3, -x y^2 z + z^3}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "7", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 7, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm[ "Step ", 3, ": ", {-x z^2 + x z^3, -x z^2 + x z^3, -x z^2 + x z^3, -x z^2 + x z^3, -z^3 + z^4, -z^3 + z^4, -z^3 + z^4, -z^3 + z^4, -x z^2 + x z^3, -x z^2 + x z^3, -x z^2 + x z^3, -x z^2 + x z^3}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "26", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 26, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "4", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 4, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "174", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 174, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"210", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[210, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ SuperscriptBox["x", "3"], "-", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "3"], "+", "z"}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "y"}], "+", RowBox[{"x", " ", SuperscriptBox["y", "2"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "-", RowBox[{"y", " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "z"}], "+", RowBox[{"x", " ", "y", " ", "z"}]}], ",", RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["y", "2"], " ", "z"}], "+", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["y", "2"], " ", "z"}], "+", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"n", " ", "=", RowBox[{"AltBuchberger", "[", RowBox[{"basisprime", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "-", RowBox[{"y", " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "z"}], "+", RowBox[{"x", " ", "y", " ", "z"}]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 1, ": ", {-x z - y z^2, x^2 z + x y z}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 3, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "2", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 2, ": ", {x y^2 z - z^3}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "7", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 7, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\": \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}]}], "}"}], "\[InvisibleSpace]", "\<\" added.\"\>"}], SequenceForm["Step ", 3, ": ", {-x z^2 + x z^3, -z^3 + z^4}, " added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "5", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 5, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "4", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 4, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "13", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 13, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"28", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[28, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ SuperscriptBox["x", "3"], "-", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "3"], "+", "z"}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "y"}], "+", RowBox[{"x", " ", SuperscriptBox["y", "2"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "-", RowBox[{"y", " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ RowBox[{ SuperscriptBox["x", "2"], " ", "z"}], "+", RowBox[{"x", " ", "y", " ", "z"}]}], ",", RowBox[{ RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], "-", SuperscriptBox["z", "3"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"x", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["z", "3"]}], "+", SuperscriptBox["z", "4"]}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tNow, to see that both expressions produce a Groebner basis, we will use \ GroebnerQ:\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"GroebnerQ", "[", RowBox[{"m", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"GroebnerQ", "[", RowBox[{"n", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell["\<\ \tAltBuchberger blows away Buch is this example. There is still another \ Buchberger implementation called QuickBuchberger. It has the same parameters \ as Buch and AltBuchberger, but is even faster. The command implements the \ speed improvements found in Chapter 2 Section 9. Here are two examples to \ show the two different improvements :\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis1", "=", " ", RowBox[{"{", RowBox[{ RowBox[{"x", "^", "2"}], ",", " ", RowBox[{"y", "^", "4"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", SuperscriptBox["y", "4"]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"AltBuchberger", "[", RowBox[{"basis1", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y"}], "}"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 1, ": nothing added."], Editable->False]], "Print"], Cell[BoxData["\<\" 1 division performed.\"\>"], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"1", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[1, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", SuperscriptBox["y", "4"]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"QuickBuchberger", "[", RowBox[{"basis1", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y"}], "}"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 1, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "0", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 0, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"0", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[0, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", SuperscriptBox["y", "4"]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tObviously, ", StyleBox["basis1", FontWeight->"Bold"], " already forms a Groebner basis, but AltBuchberger still performs one \ division. QuickBuchberger cuts out this division by noticing that the \ monomials x^2 and y^4 are relatively prime (see Proposition 4 of Chapter 2 \ Section 9)." }], "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis2", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{"x", "^", "2"}], ",", " ", RowBox[{"x", "*", RowBox[{"y", "^", "3"}]}], ",", " ", RowBox[{ RowBox[{"x", "^", "2"}], "*", RowBox[{"y", "^", "3"}]}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", RowBox[{"x", " ", SuperscriptBox["y", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "3"]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"AltBuchberger", "[", RowBox[{"basis2", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y"}], "}"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 1, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "3", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 3, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"3", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[3, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", RowBox[{"x", " ", SuperscriptBox["y", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "3"]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"QuickBuchberger", "[", RowBox[{"basis2", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y"}], "}"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Step \"\>", "\[InvisibleSpace]", "1", "\[InvisibleSpace]", "\<\": nothing added.\"\>"}], SequenceForm["Step ", 1, ": nothing added."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\" \"\>", "\[InvisibleSpace]", "2", "\[InvisibleSpace]", "\<\" divisions performed.\"\>"}], SequenceForm[" ", 2, " divisions performed."], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"2", "\[InvisibleSpace]", "\<\" divisions total.\"\>"}], SequenceForm[2, " divisions total."], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "2"], ",", RowBox[{"x", " ", SuperscriptBox["y", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "3"]}]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tQuickBuchberger again is able to cut out one division. However, none of \ the leading terms in ", StyleBox["basis2", FontWeight->"Bold"], " are relatively prime, so the second improvment must be at work. Notice \ that the third leading term, x^2*y^3, divides the LCM of x^2 and xy^3. In \ fact, it is the LCM of x^2 and xy^3. By Proposition 10 of Chapter 2 Section \ 9, if the remainders of the S-polynomials of x^2, xy^3 and of x^2, x^2y^3 are \ both calculated, the remainder of the S-polynomial of xy^3 and x^2y^3 need \ not be calculated. Thus, QuickBuchberger does one less division. \n\n\tOne \ last way to find a Groebner basis is using the MathematicaBuchberger command. \ This simply uses the built in ", StyleBox["Mathematica", FontSlant->"Italic"], " GroebnerBasis command, like PRemainder or PQuotient, but provides a \ consistent interface for the rest of the package. ", StyleBox["Mathematica", FontSlant->"Italic"], ", for example, has different names for monomial orders. Lex is called \ Lexicographic and Grevlex is called DegreeReverseLexicographic. To save you \ from having to remember these correspondences, as well as allowing you to use \ the order fixed by MonOrder, MathematicaBuchberger is included in the \ package. You will notice that MathematicaBuchberger is ", StyleBox["much", FontSlant->"Italic"], " faster than Buchberger, AltBuchberger or QuickBuchberger. We include the \ others since they work fine for many of the simpler examples in the text, and \ are direct implementations of algorithms in the text. To see \ MathematicaBuchberger at work, consider" }], "Text", CellChangeTimes->{{3.4293867691979933`*^9, 3.42938680992552*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MathematicaBuchberger", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"-", "y"}], "+", RowBox[{"x", " ", "z"}]}], ",", RowBox[{"x", "-", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "2"]}], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ SuperscriptBox["x", "3"], "-", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "4"]}], "+", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}]}]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tNotice that this is ", StyleBox["not", FontSlant->"Italic"], " the same as the output of Buchberger on ", StyleBox["basis", FontWeight->"Bold"], ". This difference reflects that MathematicaBuchberger returns a ", StyleBox["reduced", FontSlant->"Italic"], " (see Chapter 2 Section 7) Groebner basis, while the others do not. There \ is a command in the package called ReduceGroebner that will produce a reduced \ Groebner basis from any Groebner basis:" }], "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"ReduceGroebner", "[", RowBox[{ RowBox[{"QuickBuchberger", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"PrintSteps", " ", "->", " ", "False"}]}], "]"}], ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"-", "x"}], "+", SuperscriptBox["z", "4"]}], ",", RowBox[{ RowBox[{"-", "y"}], "+", RowBox[{"x", " ", "z"}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "2"]}], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}]}], ",", RowBox[{ RowBox[{"-", SuperscriptBox["x", "3"]}], "+", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}]}], ",", RowBox[{ SuperscriptBox["x", "4"], "-", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}]}]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tAs you can see, the reduced Groebner bases are the same for \ QuickBuchberger and MathematicaBuchberger, and that -y + xz is in the ideal.\n\ \n\tUnlike Buch, AltBuchberger, and QuickBuchberger, there is no PrintSteps \ option for MathematicaBuchberger, since MathematicaBuchberger is basically a \ front end to internal code. MathematicaBuchberger will never print steps.\n\n\ \tYou might have noticed that these function names are fairly cumbersome. \ That is why each command has a counterpart with an abbrievated name. For \ example, QuickBuchberger and QB are the same function. The following is a \ table of full names and abbreviated names:\n\t\n\t", StyleBox["Full Name\t\t\t\tAbbreviated Name", FontWeight->"Bold"], "\n\tBuch\t\t\t\t\tB\n\tAltBuchberger\t\t\t AB\n\tQuickBuchberger\ \t\t\tQB\n\tMathematicaBuchberger\t\tMB" }], "Text", CellChangeTimes->{{3.424628961103533*^9, 3.4246289633433*^9}}], Cell["\<\ \tFinally it should be mentioned that there is a command that computes \ S-polynomials (as described in Chapter 2 Section 6). It is called, \ appropriately, SPoly, and takes two polynomials and a varlist as parameters. \ For example,\ \>", "Text", CellChangeTimes->{{3.4293867341342983`*^9, 3.4293867405822363`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"SPoly", "[", RowBox[{ RowBox[{"y", "-", " ", RowBox[{"z", "^", "5"}]}], ",", " ", RowBox[{"x", " ", "-", " ", RowBox[{"z", "^", "4"}]}], ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{ RowBox[{"-", "y"}], "+", RowBox[{"x", " ", "z"}]}]], "Output"] }, Open ]], Cell["\<\ \tSo, you can manually (somewhat) do the Buchberger algorithm on your own.\ \>", "Text"], Cell["\<\ \tNow that we can find Groebner bases, the next section details how we can \ use them.\ \>", "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Commands that Use Groebner Bases", "Section"], Cell["\<\ \tNow that we can build a Groebner basis, we can solve problems like the \ ideal membership problem (see Chapter 2, Section 8). Let's use the Lagrange \ multipliers example from Chapter 2 Section 8. This gives the basis:\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"3", "*", RowBox[{"x", "^", "2"}]}], " ", "+", " ", RowBox[{"2", "*", "y", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "x", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"2", "*", "x", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "y", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"2", "*", "x", "*", "y"}], " ", "-", " ", RowBox[{"2", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "z", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"x", "^", "2"}], " ", "+", " ", RowBox[{"y", "^", "2"}], " ", "+", " ", RowBox[{"z", "^", "2"}], " ", "-", " ", "1"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"3", " ", SuperscriptBox["x", "2"]}], "+", RowBox[{"2", " ", "y", " ", "z"}], "-", RowBox[{"2", " ", "x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "z"}], "-", RowBox[{"2", " ", "y", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "y"}], "-", RowBox[{"2", " ", "z"}], "-", RowBox[{"2", " ", "z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tTo see if a polynomial is in the ideal, you can use IdealQ, which \ implements the ideal membership algorithm found in Chapter 2 Section 8. \ IdealQ takes a polynomial, a polynomial list that does NOT have to be a \ Groebner basis, and a variable list. Let's see if 2x\[Lambda], or even \ 1152z^7 + 1763z^5 + 655z^3 - 44z is in the ideal generated by the Lagrange \ multipliers: \ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"IdealQ", "[", RowBox[{ RowBox[{"2", "*", "x", "*", "\[Lambda]"}], ",", " ", "basis", ",", " ", RowBox[{"{", RowBox[{"\[Lambda]", ",", " ", "x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["False"], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"IdealQ", "[", RowBox[{ RowBox[{ RowBox[{"1152", "*", RowBox[{"z", "^", "7"}]}], " ", "-", " ", RowBox[{"1763", "*", RowBox[{"z", "^", "5"}]}], " ", "+", " ", RowBox[{"655", "*", RowBox[{"z", "^", "3"}]}], " ", "-", " ", RowBox[{"44", "*", "z"}]}], ",", " ", "basis", ",", " ", RowBox[{"{", RowBox[{"\[Lambda]", ",", " ", "x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell["\<\ \tOf course the second polynomial should be in the ideal, as it is in the lex \ Groebner basis of the ideal. As well as testing for ideal membership, \ sometimes one wants to test for radical ideal membership (see Chapter 4 \ Section 2 for the explanation of the radical). RadicalQ implements the \ radical membership algorithm detailed in Chapter 4 Section 2 of the text. \ RadicalQ takes the same arguments as IdealQ. Let's use exercise 7a of \ Chapter 4 Section 2 as an example.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{"x", "^", "3"}], ",", " ", RowBox[{"y", "^", "3"}], ",", " ", RowBox[{"xy", "*", RowBox[{"(", RowBox[{"x", " ", "+", "y"}], ")"}]}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ SuperscriptBox["x", "3"], ",", SuperscriptBox["y", "3"], ",", RowBox[{"xy", " ", RowBox[{"(", RowBox[{"x", "+", "y"}], ")"}]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"RadicalQ", "[", RowBox[{ RowBox[{"x", "+", "y"}], ",", " ", "basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell[TextData[{ "\t(It should be noted that there is also a command in this package that \ returns the generators of the radical of any zero-dimensional ideal (i.e. an \ ideal ", StyleBox["I", FontSlant->"Italic"], " where ", StyleBox["V", FontWeight->"Bold"], "(", StyleBox["I", FontSlant->"Italic"], ") is finite). Its details will be given in the next section.)\n\n\tOne \ final True/False-type command is the FiniteQ command, which returns True if \ the variety of the given ideal is finite over an algebraically closed field. \ This algorithm uses statement 3 of the theorem of Chapter 5 Section 3 as the \ criterion. Its parameters are a polynomial list that does NOT have to be a \ Groebner basis and a variable list. For an example, let's look at the ideal \ given in the discussion that follows the proof of the aforementioned \ theorem." }], "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "Grlex", "]"}]], "Input"], Cell[BoxData["Grlex"], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"x", "^", "5"}], " ", "+", " ", RowBox[{"y", "^", "3"}], " ", "+", " ", RowBox[{"z", "^", "2"}], " ", "-", " ", "1"}], ",", " ", RowBox[{ RowBox[{"x", "^", "2"}], " ", "+", " ", RowBox[{"y", "^", "3"}], " ", "+", " ", "z", " ", "-", " ", "1"}], ",", " ", RowBox[{ RowBox[{"x", "^", "4"}], " ", "+", " ", RowBox[{"y", "^", "5"}], " ", "+", " ", RowBox[{"z", "^", "6"}], " ", "-", " ", "1"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "5"], "+", SuperscriptBox["y", "3"], "+", SuperscriptBox["z", "2"]}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "3"], "+", "z"}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "4"], "+", SuperscriptBox["y", "5"], "+", SuperscriptBox["z", "6"]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"FiniteQ", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell[TextData[{ "\tAs indicated by the text, the answer is true. Notice that for the \ previous three commands, the monomial order is irrevelent. The package uses \ Grevlex in all Groebner basis calculations in these functions, because \ Grevlex usually yields the fastest computations.\n\n\tOne final command that \ should be mentioned in this section is VSDimension. Its parameters are a \ polynomial list, and a variable list, with an optional third parameter for \ the monomial order. If the polynomials in the list form a zero-dimensional \ ideal (i.e. if FiniteQ would return True on them), VSDimension returns a list \ of the remainder monomials and the number of remainders (i.e. the dimension \ of the space spanned by the remainder monomials). The number of remainder \ monomials is also an upper bound for the number solutions of the equations of \ the ideal. (As explained in Corollary 2.5 in Chapter 4 of \"Using Algebraic \ Geometry\" by [CLO], this is the number of solutions with multiplicities. \ So, if the ideal is radical, the number is ", StyleBox["exactly", FontSlant->"Italic"], " the number of solutions.) If there are infinitely many remainders, the \ command returns {Infinity, Infinity}. If left unspecified, the monomial \ ordering is the ordering determined by the current order set by MonOrder. \ Let's use the current basis for an example:" }], "Text", CellChangeTimes->{3.429386842965695*^9}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"VSDimension", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"1", ",", "x", ",", SuperscriptBox["x", "2"], ",", SuperscriptBox["x", "3"], ",", SuperscriptBox["x", "4"], ",", "y", ",", SuperscriptBox["y", "2"], ",", RowBox[{"x", " ", "y"}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y"}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y"}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y"}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"]}], ",", "z", ",", SuperscriptBox["z", "2"], ",", SuperscriptBox["z", "3"], ",", SuperscriptBox["z", "4"], ",", SuperscriptBox["z", "5"], ",", RowBox[{"x", " ", "z"}], ",", RowBox[{"x", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"x", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{"x", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{"x", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{"y", " ", "z"}], ",", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{"x", " ", "y", " ", "z"}], ",", RowBox[{"x", " ", "y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"x", " ", "y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{"x", " ", "y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{"x", " ", "y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y", " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", "y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "2"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y", " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", "y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "3"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y", " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", "y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["x", "4"], " ", SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}]}], "}"}], ",", "90"}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tHere is the same example, this time using an elimination order:\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"VSDimension", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"1", ",", " ", "3"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"1", ",", "x", ",", "y", ",", SuperscriptBox["y", "2"], ",", SuperscriptBox["y", "3"], ",", SuperscriptBox["y", "4"], ",", SuperscriptBox["y", "5"], ",", RowBox[{"x", " ", "y"}], ",", RowBox[{"x", " ", SuperscriptBox["y", "2"]}], ",", "z", ",", SuperscriptBox["z", "2"], ",", SuperscriptBox["z", "3"], ",", SuperscriptBox["z", "4"], ",", SuperscriptBox["z", "5"], ",", SuperscriptBox["z", "6"], ",", SuperscriptBox["z", "7"], ",", SuperscriptBox["z", "8"], ",", SuperscriptBox["z", "9"], ",", SuperscriptBox["z", "10"], ",", SuperscriptBox["z", "11"], ",", SuperscriptBox["z", "12"], ",", SuperscriptBox["z", "13"], ",", SuperscriptBox["z", "14"], ",", SuperscriptBox["z", "15"], ",", SuperscriptBox["z", "16"], ",", RowBox[{"x", " ", "z"}], ",", RowBox[{"x", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"y", " ", "z"}], ",", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "3"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "4"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "5"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "6"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "7"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "8"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "9"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "10"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "11"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "12"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "13"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "14"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "15"]}], ",", RowBox[{"y", " ", SuperscriptBox["z", "16"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", "z"}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "6"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "7"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "8"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "9"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "10"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "11"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "12"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "13"]}], ",", RowBox[{ SuperscriptBox["y", "2"], " ", SuperscriptBox["z", "14"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", "z"}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "6"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "7"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "8"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "9"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "10"]}], ",", RowBox[{ SuperscriptBox["y", "3"], " ", SuperscriptBox["z", "11"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", "z"}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "6"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "7"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "8"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "9"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "10"]}], ",", RowBox[{ SuperscriptBox["y", "4"], " ", SuperscriptBox["z", "11"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", "z"}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "2"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "3"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "4"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "5"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "6"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "7"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "8"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "9"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "10"]}], ",", RowBox[{ SuperscriptBox["y", "5"], " ", SuperscriptBox["z", "11"]}]}], "}"}], ",", "90"}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tNotice that while the dimension was constant across monomial orders, the \ monomials themselves were not. Since the dimension is independent of \ monomial ordering, you might as well use Grevlex as your ordering if you are \ only interested in the dimension. \tAll the commands described thus far have algorithms that can be found in \ the text. The next commands use algorithms that go beyond the scope of the \ text, but could still be useful for the casual IVA reader.\ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Beyond IVA", "Section"], Cell["\<\ \tWhile these commands use algorithms not found in IVA, their purpose can be \ easily understood by the IVA reader. The first algorithm was previously \ noted in a parenthetical note, and is the function that return the \ generators, NOT necessarily the Groebner basis, of the radical of a \ zero-dimensional ideal. Do note that this command only works on \ zero-dimensional ideals (i.e. those for which FiniteQ returns True). The \ command is called Radical (makes sense, right?) and takes a polynomial list \ and variable list as parameters. To create generators, the type of monomial \ order does not matter and Radical uses Grevlex. This algorithm is a \ consequence of Proposition 2.7 of Chapter 2 Section 2 of [CLO]. Let's use \ the Lagrange multipliers basis for an example.\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"basis", " ", "=", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"3", "*", RowBox[{"x", "^", "2"}]}], " ", "+", " ", RowBox[{"2", "*", "y", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "x", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"2", "*", "x", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "y", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"2", "*", "x", "*", "y"}], " ", "-", " ", RowBox[{"2", "*", "z"}], " ", "-", " ", RowBox[{"2", "*", "z", "*", "\[Lambda]"}]}], ",", " ", RowBox[{ RowBox[{"x", "^", "2"}], " ", "+", " ", RowBox[{"y", "^", "2"}], " ", "+", " ", RowBox[{"z", "^", "2"}], " ", "-", " ", "1"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"3", " ", SuperscriptBox["x", "2"]}], "+", RowBox[{"2", " ", "y", " ", "z"}], "-", RowBox[{"2", " ", "x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "z"}], "-", RowBox[{"2", " ", "y", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "y"}], "-", RowBox[{"2", " ", "z"}], "-", RowBox[{"2", " ", "z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"radbasis", " ", "=", RowBox[{"Radical", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"\[Lambda]", ",", "x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"3", " ", SuperscriptBox["x", "2"]}], "+", RowBox[{"2", " ", "y", " ", "z"}], "-", RowBox[{"2", " ", "x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "z"}], "-", RowBox[{"2", " ", "y", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"2", " ", "x", " ", "y"}], "-", RowBox[{"2", " ", "z"}], "-", RowBox[{"2", " ", "z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "6"}], " ", "x"}], "-", RowBox[{"25", " ", SuperscriptBox["x", "2"]}], "-", RowBox[{"18", " ", SuperscriptBox["x", "3"]}], "+", RowBox[{"25", " ", SuperscriptBox["x", "4"]}], "+", RowBox[{"24", " ", SuperscriptBox["x", "5"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "99"}], " ", "y"}], "+", RowBox[{"1118", " ", SuperscriptBox["y", "3"]}], "-", RowBox[{"2171", " ", SuperscriptBox["y", "5"]}], "+", RowBox[{"1152", " ", SuperscriptBox["y", "7"]}]}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tThere is also a command RadicalIdealQ, which returns True if the ideal is \ radical. The parameters are the same as Radical. Let's use the Lagrange \ multipliers for an example. \ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"RadicalIdealQ", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"\[Lambda]", ",", "x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["False"], "Output"] }, Open ]], Cell["\<\ \tSo the basis alone is not radical. However, after performing Radical....\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"RadicalIdealQ", "[", RowBox[{"radbasis", ",", " ", RowBox[{"{", RowBox[{"\[Lambda]", ",", "x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData["True"], "Output"] }, Open ]], Cell["\<\ \t....the answer is obviously True. \tThe next command is called ConvertGB, and can convert a GroebnerBasis of \ any monomial order and variable order into a Groebner basis of any variable \ order and either Lex or Grlex. It also returns the remainder monomials of \ the Groebner basis. It can't convert to Grevlex, since Grevlex Groebner \ bases are quick to compute anyway, and there would be no real need to convert \ them. Other monomial orders, such as matrix orders, are not easy to convert \ (i.e. we are not sure how to do it yet). ConvertGB implements the algorithm \ first given in [FGLM], and directly implements the version given of Chapter 2 \ Section 3 of [CLO]. For parameters, ConvertGB takes a list of polynomial \ that form a Groebner basis, a new variable list, and the original variable \ list. The command assumes that the basis that it is getting as a parameter \ is a Groebner basis with respect to the current order set by MonOrder. If \ the Groebner basis is of some other order, you can set the OldOrderType \ option to the appropriate order (as you would if it were input to MonOrder). \ If the polynomials do not form a Groebner basis under the orignal variable \ list and monomial order, ConvertGB will complain and not produce output. \ There are other options for ConvertGB. OrderType can be set to Lex or Grlex, \ depending on which order you would like to convert your Groebner basis into. \ Its default is Lex. PrintSteps can be set to True or False, depending if you \ would like to see the added element of the Groebner basis and the most \ recently added remainder monomials every time a new equation is added to the \ constructed Groebner basis. Again, we'll use the Lagrange multipliers basis \ for the example.\ \>", "Text", CellChangeTimes->{{3.429386889504826*^9, 3.429386890229101*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "Grevlex", "]"}]], "Input"], Cell[BoxData["Grevlex"], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"gb", " ", "=", RowBox[{"MathematicaBuchberger", "[", RowBox[{"basis", ",", " ", RowBox[{"{", RowBox[{"y", ",", " ", "x", ",", " ", "\[Lambda]", ",", " ", "z"}], "}"}]}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"x", " ", "z"}], "-", RowBox[{"y", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"3", " ", SuperscriptBox["x", "2"]}], "+", RowBox[{"2", " ", "y", " ", "z"}], "-", RowBox[{"2", " ", "x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"x", " ", "y"}], "-", "z", "-", RowBox[{"z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", "3"}], "+", RowBox[{"3", " ", SuperscriptBox["y", "2"]}], "-", RowBox[{"2", " ", "y", " ", "z"}], "+", RowBox[{"3", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"2", " ", "x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "3"}], " ", "x"}], "+", RowBox[{"15", " ", "y", " ", "z"}], "+", RowBox[{"14", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"2", " ", "\[Lambda]"}], "-", RowBox[{"18", " ", "x", " ", "\[Lambda]"}], "+", RowBox[{"24", " ", SuperscriptBox["z", "2"], " ", "\[Lambda]"}], "+", RowBox[{"12", " ", SuperscriptBox["\[Lambda]", "2"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "15"}], " ", "x"}], "+", RowBox[{"27", " ", "y", " ", "z"}], "-", RowBox[{"2", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"24", " ", "x", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"10", " ", "\[Lambda]"}], "-", RowBox[{"18", " ", "x", " ", "\[Lambda]"}], "+", RowBox[{"12", " ", SuperscriptBox["\[Lambda]", "2"]}]}], ",", RowBox[{ RowBox[{"12", " ", "z"}], "+", RowBox[{"17", " ", "x", " ", "z"}], "+", RowBox[{"17", " ", "y", " ", SuperscriptBox["z", "2"]}], "-", RowBox[{"13", " ", SuperscriptBox["z", "3"]}], "-", RowBox[{"z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"4", " ", "z"}], "-", RowBox[{"10", " ", SuperscriptBox["z", "3"]}], "-", RowBox[{"23", " ", "z", " ", "\[Lambda]"}], "-", RowBox[{"17", " ", "z", " ", SuperscriptBox["\[Lambda]", "2"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "6"}], " ", "z"}], "-", RowBox[{"17", " ", "x", " ", "z"}], "-", RowBox[{"2", " ", SuperscriptBox["z", "3"]}], "-", RowBox[{"8", " ", "z", " ", "\[Lambda]"}], "-", RowBox[{"17", " ", "x", " ", "z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"6", " ", "x"}], "+", RowBox[{"6", " ", "y", " ", "z"}], "+", RowBox[{"11", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"23", " ", "\[Lambda]"}], "-", RowBox[{"12", " ", SuperscriptBox["\[Lambda]", "3"]}]}], ",", RowBox[{ RowBox[{"3", " ", "x"}], "+", RowBox[{"9", " ", "y", " ", "z"}], "+", RowBox[{"4", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"16", " ", "\[Lambda]"}], "-", RowBox[{"18", " ", "x", " ", "\[Lambda]"}], "+", RowBox[{"12", " ", SuperscriptBox["\[Lambda]", "2"]}], "-", RowBox[{"12", " ", "x", " ", SuperscriptBox["\[Lambda]", "2"]}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "699"}], " ", "x"}], "+", RowBox[{"1047", " ", "y", " ", "z"}], "-", RowBox[{"1850", " ", SuperscriptBox["z", "2"]}], "+", RowBox[{"1152", " ", SuperscriptBox["z", "4"]}], "+", RowBox[{"466", " ", "\[Lambda]"}], "-", RowBox[{"1746", " ", "x", " ", "\[Lambda]"}], "+", RowBox[{"1164", " ", SuperscriptBox["\[Lambda]", "2"]}]}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"ConvertGB", "[", RowBox[{"gb", ",", RowBox[{"{", RowBox[{"\[Lambda]", ",", " ", "x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"y", ",", " ", "x", ",", " ", "\[Lambda]", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"11", " ", "z"}], "288"]}], "+", FractionBox[ RowBox[{"655", " ", SuperscriptBox["z", "3"]}], "1152"], "-", FractionBox[ RowBox[{"1763", " ", SuperscriptBox["z", "5"]}], "1152"], "+", SuperscriptBox["z", "7"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "y"}], " ", "z"}], "-", FractionBox[ RowBox[{"453", " ", SuperscriptBox["z", "2"]}], "118"], "+", RowBox[{"y", " ", SuperscriptBox["z", "3"]}], "+", FractionBox[ RowBox[{"1605", " ", SuperscriptBox["z", "4"]}], "118"], "-", FractionBox[ RowBox[{"576", " ", SuperscriptBox["z", "6"]}], "59"]}], ",", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"3839", " ", "z"}], "3835"]}], "+", RowBox[{ SuperscriptBox["y", "2"], " ", "z"}], "+", FractionBox[ RowBox[{"827", " ", SuperscriptBox["z", "3"]}], "295"], "-", FractionBox[ RowBox[{"6912", " ", SuperscriptBox["z", "5"]}], "3835"]}], ",", RowBox[{ RowBox[{"-", "y"}], "+", SuperscriptBox["y", "3"], "-", FractionBox[ RowBox[{"2562", " ", "z"}], "3835"], "+", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], "+", FractionBox[ RowBox[{"906", " ", SuperscriptBox["z", "3"]}], "295"], "-", FractionBox[ RowBox[{"9216", " ", SuperscriptBox["z", "5"]}], "3835"]}], ",", RowBox[{ FractionBox[ RowBox[{"2556", " ", "z"}], "3835"], "+", RowBox[{"x", " ", "z"}], "+", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], "-", FractionBox[ RowBox[{"108", " ", SuperscriptBox["z", "3"]}], "295"], "-", FractionBox[ RowBox[{"1152", " ", SuperscriptBox["z", "5"]}], "3835"]}], ",", RowBox[{ RowBox[{"x", " ", "y"}], "-", FractionBox[ RowBox[{"6403", " ", "z"}], "3835"], "+", FractionBox[ RowBox[{"1999", " ", SuperscriptBox["z", "3"]}], "295"], "-", FractionBox[ RowBox[{"19584", " ", SuperscriptBox["z", "5"]}], "3835"]}], ",", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}], ",", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"3", " ", "x"}], "2"]}], "-", FractionBox[ RowBox[{"3", " ", "y", " ", "z"}], "2"], "-", FractionBox[ RowBox[{"134419", " ", SuperscriptBox["z", "2"]}], "7670"], "+", FractionBox[ RowBox[{"36717", " ", SuperscriptBox["z", "4"]}], "590"], "-", FractionBox[ RowBox[{"167616", " ", SuperscriptBox["z", "6"]}], "3835"], "+", "\[Lambda]"}]}], "}"}], ",", RowBox[{"{", RowBox[{"1", ",", "z", ",", SuperscriptBox["z", "2"], ",", SuperscriptBox["z", "3"], ",", SuperscriptBox["z", "4"], ",", SuperscriptBox["z", "5"], ",", SuperscriptBox["z", "6"], ",", "y", ",", RowBox[{"y", " ", "z"}], ",", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], ",", SuperscriptBox["y", "2"], ",", "x"}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"ConvertGB", "[", RowBox[{"gb", ",", RowBox[{"{", RowBox[{"\[Lambda]", ",", " ", "x", ",", " ", "y", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"y", ",", " ", "x", ",", " ", "\[Lambda]", ",", " ", "z"}], "}"}], ",", " ", RowBox[{"OldOrderType", "->", " ", "Grevlex"}], ",", " ", RowBox[{"OrderType", " ", "->", " ", "Grlex"}], ",", " ", RowBox[{"PrintSteps", " ", "->", " ", "True"}]}], "]"}]], "Input"], Cell[CellGroupData[{ Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to remainders: \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{"1", ",", "z", ",", "y", ",", "x", ",", "\[Lambda]", ",", SuperscriptBox["z", "2"], ",", RowBox[{"y", " ", "z"}], ",", SuperscriptBox["y", "2"], ",", RowBox[{"x", " ", "z"}], ",", RowBox[{"x", " ", "y"}]}], "}"}]}], SequenceForm[ "Added to remainders: ", {1, z, y, x, \[Lambda], z^2, y z, y^2, x z, x y}], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}]}], SequenceForm["Added to Groebner basis: ", -1 + x^2 + y^2 + z^2], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "y"}], "+", "z", "+", RowBox[{"z", " ", "\[Lambda]"}]}]}], SequenceForm["Added to Groebner basis: ", -x y + z + z \[Lambda]], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "+", RowBox[{"y", " ", "\[Lambda]"}]}]}], SequenceForm["Added to Groebner basis: ", -x z + y \[Lambda]], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["3", "2"]}], "+", FractionBox[ RowBox[{"3", " ", SuperscriptBox["y", "2"]}], "2"], "-", RowBox[{"y", " ", "z"}], "+", FractionBox[ RowBox[{"3", " ", SuperscriptBox["z", "2"]}], "2"], "+", RowBox[{"x", " ", "\[Lambda]"}]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-3, 2] + Rational[3, 2] y^2 - y z + Rational[3, 2] z^2 + x \[Lambda]], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to remainders: \"\>", "\[InvisibleSpace]", RowBox[{"{", RowBox[{ SuperscriptBox["\[Lambda]", "2"], ",", SuperscriptBox["z", "3"]}], "}"}]}], SequenceForm["Added to remainders: ", {\[Lambda]^2, z^3}], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"x", " ", "y"}], "17"]}], "+", FractionBox[ RowBox[{"13", " ", "z"}], "17"], "+", RowBox[{"x", " ", "z"}], "+", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], "-", FractionBox[ RowBox[{"13", " ", SuperscriptBox["z", "3"]}], "17"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-1, 17] x y + Rational[13, 17] z + x z + y z^2 + Rational[-13, 17] z^3], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"6", " ", "x", " ", "y"}], "17"]}], "-", FractionBox[ RowBox[{"7", " ", "z"}], "17"], "+", RowBox[{ SuperscriptBox["y", "2"], " ", "z"}], "+", FractionBox[ RowBox[{"7", " ", SuperscriptBox["z", "3"]}], "17"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-6, 17] x y + Rational[-7, 17] z + y^2 z + Rational[7, 17] z^3], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", "y"}], "-", FractionBox[ RowBox[{"7", " ", "x", " ", "y"}], "17"], "+", SuperscriptBox["y", "3"], "-", FractionBox[ RowBox[{"11", " ", "z"}], "17"], "-", RowBox[{"x", " ", "z"}], "+", FractionBox[ RowBox[{"11", " ", SuperscriptBox["z", "3"]}], "17"]}]}], SequenceForm[ "Added to Groebner basis: ", -y + Rational[-7, 17] x y + y^3 + Rational[-11, 17] z - x z + Rational[11, 17] z^3], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox[ RowBox[{"5", " ", "x"}], "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "+", FractionBox[ RowBox[{"3", " ", "y", " ", "z"}], "8"], "+", FractionBox[ RowBox[{"25", " ", SuperscriptBox["z", "2"]}], "24"], "+", RowBox[{"x", " ", SuperscriptBox["z", "2"]}], "+", FractionBox[ RowBox[{"5", " ", "\[Lambda]"}], "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-9, 8] + Rational[-5, 8] x + Rational[9, 8] y^2 + Rational[3, 8] y z + Rational[25, 24] z^2 + x z^2 + Rational[5, 12] \[Lambda] + Rational[1, 2] \[Lambda]^2], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox["x", "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "-", FractionBox[ RowBox[{"y", " ", "z"}], "8"], "+", RowBox[{"x", " ", "y", " ", "z"}], "+", FractionBox[ RowBox[{"17", " ", SuperscriptBox["z", "2"]}], "24"], "+", FractionBox["\[Lambda]", "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-9, 8] + Rational[-1, 8] x + Rational[9, 8] y^2 + Rational[-1, 8] y z + x y z + Rational[17, 24] z^2 + Rational[1, 12] \[Lambda] + Rational[1, 2] \[Lambda]^2], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox[ RowBox[{"5", " ", "x"}], "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "+", RowBox[{"x", " ", SuperscriptBox["y", "2"]}], "-", FractionBox[ RowBox[{"5", " ", "y", " ", "z"}], "8"], "+", FractionBox[ RowBox[{"25", " ", SuperscriptBox["z", "2"]}], "24"], "+", FractionBox[ RowBox[{"5", " ", "\[Lambda]"}], "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-9, 8] + Rational[-5, 8] x + Rational[9, 8] y^2 + x y^2 + Rational[-5, 8] y z + Rational[25, 24] z^2 + Rational[5, 12] \[Lambda] + Rational[1, 2] \[Lambda]^2], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["x", "2"]}], "-", FractionBox[ RowBox[{"y", " ", "z"}], "2"], "-", FractionBox[ RowBox[{"11", " ", SuperscriptBox["z", "2"]}], "12"], "-", FractionBox[ RowBox[{"23", " ", "\[Lambda]"}], "12"], "+", SuperscriptBox["\[Lambda]", "3"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-1, 2] x + Rational[-1, 2] y z + Rational[-11, 12] z^2 + Rational[-23, 12] \[Lambda] + \[Lambda]^3], Editable->False]], "Print"], Cell[BoxData[ InterpretationBox[ RowBox[{"\<\"Added to Groebner basis: \"\>", "\[InvisibleSpace]", RowBox[{ RowBox[{"-", FractionBox["291", "128"]}], "-", FractionBox[ RowBox[{"233", " ", "x"}], "384"], "+", FractionBox[ RowBox[{"291", " ", SuperscriptBox["y", "2"]}], "128"], "-", FractionBox[ RowBox[{"233", " ", "y", " ", "z"}], "384"], "+", FractionBox[ RowBox[{"769", " ", SuperscriptBox["z", "2"]}], "1152"], "+", SuperscriptBox["z", "4"], "+", FractionBox[ RowBox[{"233", " ", "\[Lambda]"}], "576"], "+", FractionBox[ RowBox[{"97", " ", SuperscriptBox["\[Lambda]", "2"]}], "96"]}]}], SequenceForm[ "Added to Groebner basis: ", Rational[-291, 128] + Rational[-233, 384] x + Rational[291, 128] y^2 + Rational[-233, 384] y z + Rational[769, 1152] z^2 + z^4 + Rational[233, 576] \[Lambda] + Rational[97, 96] \[Lambda]^2], Editable->False]], "Print"] }, Open ]], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"-", "1"}], "+", SuperscriptBox["x", "2"], "+", SuperscriptBox["y", "2"], "+", SuperscriptBox["z", "2"]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "y"}], "+", "z", "+", RowBox[{"z", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{ RowBox[{"-", "x"}], " ", "z"}], "+", RowBox[{"y", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", FractionBox["3", "2"]}], "+", FractionBox[ RowBox[{"3", " ", SuperscriptBox["y", "2"]}], "2"], "-", RowBox[{"y", " ", "z"}], "+", FractionBox[ RowBox[{"3", " ", SuperscriptBox["z", "2"]}], "2"], "+", RowBox[{"x", " ", "\[Lambda]"}]}], ",", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"x", " ", "y"}], "17"]}], "+", FractionBox[ RowBox[{"13", " ", "z"}], "17"], "+", RowBox[{"x", " ", "z"}], "+", RowBox[{"y", " ", SuperscriptBox["z", "2"]}], "-", FractionBox[ RowBox[{"13", " ", SuperscriptBox["z", "3"]}], "17"]}], ",", RowBox[{ RowBox[{"-", FractionBox[ RowBox[{"6", " ", "x", " ", "y"}], "17"]}], "-", FractionBox[ RowBox[{"7", " ", "z"}], "17"], "+", RowBox[{ SuperscriptBox["y", "2"], " ", "z"}], "+", FractionBox[ RowBox[{"7", " ", SuperscriptBox["z", "3"]}], "17"]}], ",", RowBox[{ RowBox[{"-", "y"}], "-", FractionBox[ RowBox[{"7", " ", "x", " ", "y"}], "17"], "+", SuperscriptBox["y", "3"], "-", FractionBox[ RowBox[{"11", " ", "z"}], "17"], "-", RowBox[{"x", " ", "z"}], "+", FractionBox[ RowBox[{"11", " ", SuperscriptBox["z", "3"]}], "17"]}], ",", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox[ RowBox[{"5", " ", "x"}], "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "+", FractionBox[ RowBox[{"3", " ", "y", " ", "z"}], "8"], "+", FractionBox[ RowBox[{"25", " ", SuperscriptBox["z", "2"]}], "24"], "+", RowBox[{"x", " ", SuperscriptBox["z", "2"]}], "+", FractionBox[ RowBox[{"5", " ", "\[Lambda]"}], "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}], ",", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox["x", "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "-", FractionBox[ RowBox[{"y", " ", "z"}], "8"], "+", RowBox[{"x", " ", "y", " ", "z"}], "+", FractionBox[ RowBox[{"17", " ", SuperscriptBox["z", "2"]}], "24"], "+", FractionBox["\[Lambda]", "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}], ",", RowBox[{ RowBox[{"-", FractionBox["9", "8"]}], "-", FractionBox[ RowBox[{"5", " ", "x"}], "8"], "+", FractionBox[ RowBox[{"9", " ", SuperscriptBox["y", "2"]}], "8"], "+", RowBox[{"x", " ", SuperscriptBox["y", "2"]}], "-", FractionBox[ RowBox[{"5", " ", "y", " ", "z"}], "8"], "+", FractionBox[ RowBox[{"25", " ", SuperscriptBox["z", "2"]}], "24"], "+", FractionBox[ RowBox[{"5", " ", "\[Lambda]"}], "12"], "+", FractionBox[ SuperscriptBox["\[Lambda]", "2"], "2"]}], ",", RowBox[{ RowBox[{"-", FractionBox["x", "2"]}], "-", FractionBox[ RowBox[{"y", " ", "z"}], "2"], "-", FractionBox[ RowBox[{"11", " ", SuperscriptBox["z", "2"]}], "12"], "-", FractionBox[ RowBox[{"23", " ", "\[Lambda]"}], "12"], "+", SuperscriptBox["\[Lambda]", "3"]}], ",", RowBox[{ RowBox[{"-", FractionBox["291", "128"]}], "-", FractionBox[ RowBox[{"233", " ", "x"}], "384"], "+", FractionBox[ RowBox[{"291", " ", SuperscriptBox["y", "2"]}], "128"], "-", FractionBox[ RowBox[{"233", " ", "y", " ", "z"}], "384"], "+", FractionBox[ RowBox[{"769", " ", SuperscriptBox["z", "2"]}], "1152"], "+", SuperscriptBox["z", "4"], "+", FractionBox[ RowBox[{"233", " ", "\[Lambda]"}], "576"], "+", FractionBox[ RowBox[{"97", " ", SuperscriptBox["\[Lambda]", "2"]}], "96"]}]}], "}"}], ",", RowBox[{"{", RowBox[{"1", ",", "z", ",", "y", ",", "x", ",", "\[Lambda]", ",", SuperscriptBox["z", "2"], ",", RowBox[{"y", " ", "z"}], ",", SuperscriptBox["y", "2"], ",", RowBox[{"x", " ", "z"}], ",", RowBox[{"x", " ", "y"}], ",", SuperscriptBox["\[Lambda]", "2"], ",", SuperscriptBox["z", "3"]}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tAs you can see, PrintSteps can get out of control with chunky bases. \tThe last command in the package is called IdealofPoints, and returns a \ Groebner basis of the ideal of all polynomials that vanish on the points you \ provide, plus a list of its remainder monomials. It is the implementation of \ the Buchberger-M\[ODoubleDot]ller algorithm found in [BM]. Its parameters \ are a list of points, a variable list, and an optional third parameter of the \ monomial order. If left unspecified, the monomial order is the order set by \ MonOrder. Please note that the dimension of the varlist must equal the \ dimension of each point, or else the points don't make much sense and \ IdealofPoints will complain. Also, the points must be written in list form. \ Here is an example:\ \>", "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"MonOrder", "[", "]"}]], "Input"], Cell[BoxData["Grevlex"], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"points", " ", "=", " ", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"1", ",", " ", "2", ",", " ", "6"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"8", ",", " ", "8", ",", " ", "2"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"4", ",", " ", "5", ",", " ", "1"}], "}"}], ",", " ", RowBox[{"{", RowBox[{"5", ",", " ", "12", ",", " ", "0"}], "}"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{"1", ",", "2", ",", "6"}], "}"}], ",", RowBox[{"{", RowBox[{"8", ",", "8", ",", "2"}], "}"}], ",", RowBox[{"{", RowBox[{"4", ",", "5", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"5", ",", "12", ",", "0"}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"IdealofPoints", "[", RowBox[{"points", ",", " ", RowBox[{"{", RowBox[{"x", ",", " ", "y", ",", " ", "z"}], "}"}]}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{ FractionBox["143", "35"], "+", FractionBox[ RowBox[{"59", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"73", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"463", " ", "z"}], "70"], "+", SuperscriptBox["z", "2"]}], ",", RowBox[{ FractionBox["159", "35"], "-", FractionBox[ RowBox[{"93", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"51", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"179", " ", "z"}], "70"], "+", RowBox[{"y", " ", "z"}]}], ",", RowBox[{ FractionBox["227", "35"], "-", FractionBox[ RowBox[{"109", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"53", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"127", " ", "z"}], "70"], "+", RowBox[{"x", " ", "z"}]}], ",", RowBox[{ FractionBox["1767", "35"], "+", FractionBox[ RowBox[{"171", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"1277", " ", "y"}], "70"], "+", SuperscriptBox["y", "2"], "-", FractionBox[ RowBox[{"267", " ", "z"}], "70"]}], ",", RowBox[{ FractionBox["173", "5"], "-", FractionBox[ RowBox[{"31", " ", "x"}], "5"], "-", FractionBox[ RowBox[{"53", " ", "y"}], "10"], "+", RowBox[{"x", " ", "y"}], "-", FractionBox[ RowBox[{"33", " ", "z"}], "10"]}], ",", RowBox[{ FractionBox["1138", "35"], "-", FractionBox[ RowBox[{"381", " ", "x"}], "35"], "+", SuperscriptBox["x", "2"], "-", FractionBox[ RowBox[{"9", " ", "y"}], "35"], "-", FractionBox[ RowBox[{"129", " ", "z"}], "35"]}]}], "}"}], ",", RowBox[{"{", RowBox[{"1", ",", "z", ",", "y", ",", "x"}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell[TextData[{ "\tThe generators given above form a Groebner basis and generate a radical \ ideal (can you figure out why it's radical?). To prove that these equations \ to vanish on the given points, we will turn the polynomials into equations \ and have ", StyleBox["Mathematica", FontSlant->"Italic"], " solve them." }], "Text"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"polys", " ", "=", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ FractionBox["143", "35"], "+", FractionBox[ RowBox[{"59", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"73", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"463", " ", "z"}], "70"], "+", SuperscriptBox["z", "2"]}], "==", "0"}], ",", RowBox[{ RowBox[{ FractionBox["159", "35"], "-", FractionBox[ RowBox[{"93", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"51", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"179", " ", "z"}], "70"], "+", RowBox[{"y", " ", "z"}]}], " ", "==", " ", "0"}], ",", RowBox[{ RowBox[{ FractionBox["227", "35"], "-", FractionBox[ RowBox[{"109", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"53", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"127", " ", "z"}], "70"], "+", RowBox[{"x", " ", "z"}]}], " ", "==", "0"}], ",", RowBox[{ RowBox[{ FractionBox["1767", "35"], "+", FractionBox[ RowBox[{"171", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"1277", " ", "y"}], "70"], "+", SuperscriptBox["y", "2"], "-", FractionBox[ RowBox[{"267", " ", "z"}], "70"]}], " ", "==", " ", "0"}], ",", RowBox[{ RowBox[{ FractionBox["173", "5"], "-", FractionBox[ RowBox[{"31", " ", "x"}], "5"], "-", FractionBox[ RowBox[{"53", " ", "y"}], "10"], "+", RowBox[{"x", " ", "y"}], "-", FractionBox[ RowBox[{"33", " ", "z"}], "10"]}], " ", "==", " ", "0"}], ",", RowBox[{ RowBox[{ FractionBox["1138", "35"], "-", FractionBox[ RowBox[{"381", " ", "x"}], "35"], "+", SuperscriptBox["x", "2"], "-", FractionBox[ RowBox[{"9", " ", "y"}], "35"], "-", FractionBox[ RowBox[{"129", " ", "z"}], "35"]}], " ", "==", " ", "0"}]}], "}"}]}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{ RowBox[{ FractionBox["143", "35"], "+", FractionBox[ RowBox[{"59", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"73", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"463", " ", "z"}], "70"], "+", SuperscriptBox["z", "2"]}], "\[Equal]", "0"}], ",", RowBox[{ RowBox[{ FractionBox["159", "35"], "-", FractionBox[ RowBox[{"93", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"51", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"179", " ", "z"}], "70"], "+", RowBox[{"y", " ", "z"}]}], "\[Equal]", "0"}], ",", RowBox[{ RowBox[{ FractionBox["227", "35"], "-", FractionBox[ RowBox[{"109", " ", "x"}], "35"], "+", FractionBox[ RowBox[{"53", " ", "y"}], "70"], "-", FractionBox[ RowBox[{"127", " ", "z"}], "70"], "+", RowBox[{"x", " ", "z"}]}], "\[Equal]", "0"}], ",", RowBox[{ RowBox[{ FractionBox["1767", "35"], "+", FractionBox[ RowBox[{"171", " ", "x"}], "35"], "-", FractionBox[ RowBox[{"1277", " ", "y"}], "70"], "+", SuperscriptBox["y", "2"], "-", FractionBox[ RowBox[{"267", " ", "z"}], "70"]}], "\[Equal]", "0"}], ",", RowBox[{ RowBox[{ FractionBox["173", "5"], "-", FractionBox[ RowBox[{"31", " ", "x"}], "5"], "-", FractionBox[ RowBox[{"53", " ", "y"}], "10"], "+", RowBox[{"x", " ", "y"}], "-", FractionBox[ RowBox[{"33", " ", "z"}], "10"]}], "\[Equal]", "0"}], ",", RowBox[{ RowBox[{ FractionBox["1138", "35"], "-", FractionBox[ RowBox[{"381", " ", "x"}], "35"], "+", SuperscriptBox["x", "2"], "-", FractionBox[ RowBox[{"9", " ", "y"}], "35"], "-", FractionBox[ RowBox[{"129", " ", "z"}], "35"]}], "\[Equal]", "0"}]}], "}"}]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Solve", "[", "polys", "]"}]], "Input"], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"x", "\[Rule]", "1"}], ",", RowBox[{"y", "\[Rule]", "2"}], ",", RowBox[{"z", "\[Rule]", "6"}]}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"x", "\[Rule]", "4"}], ",", RowBox[{"y", "\[Rule]", "5"}], ",", RowBox[{"z", "\[Rule]", "1"}]}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"x", "\[Rule]", "5"}], ",", RowBox[{"y", "\[Rule]", "12"}], ",", RowBox[{"z", "\[Rule]", "0"}]}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"x", "\[Rule]", "8"}], ",", RowBox[{"y", "\[Rule]", "8"}], ",", RowBox[{"z", "\[Rule]", "2"}]}], "}"}]}], "}"}]], "Output"] }, Open ]], Cell["\<\ \tAmazingly enough, these points are the same as the points we started with. \ If you're still not convinced, you could convert the polynomial output of \ IdealofPoints to a Lex Groebner basis, and find the solutions yourself. \tI hope this tutorial has been helpful. If you have further questions, you \ can e-mail David Cox at dac@cs.amherst.edu. \tGood luck and have fun!\ \>", "Text", TextAlignment->Left] }, Open ]], Cell[CellGroupData[{ Cell["References", "Section"], Cell[TextData[{ "[CLO] D. Cox, J. Little, D. O'Shea, ", StyleBox["Using Algebraic Geometry,", FontSlant->"Italic"], " Springer-Verlag New York Inc., New York, 1998.\n[FGLM] J. \ Faug\[EGrave]re, P. Gianni, D. Lazrad, and T. Mora. ", StyleBox["Efficient computation of zero-dimensional Groebner bases by change \ of ordering", FontSlant->"Italic"], ", J. Symbolic Comput. ", StyleBox["16", FontWeight->"Bold"], " (1993), 329-344.\n[BM] B. Buchberger, H.M. M\[ODoubleDot]ller. ", StyleBox["The construction of multivariate polynomials with preassigned \ zeros,", FontSlant->"Italic"], " J. Lecture Notes in Comp. Sci., ", StyleBox["144", FontWeight->"Bold"], " (1982), 24-31, Marseille, France. Springer." }], "Text", TextAlignment->Left] }, Open ]], Cell[CellGroupData[{ Cell["Reference Guide", "Section"], Cell["\<\ \tThis guide gives formal descriptions of commands in the package. Commands \ are listed in order of complexity. \tNote that there is also on-line documentation for each of these commands. \ For example, to find out about the \"Buch\" command, type \t?Buch at the Mathematica prompt.. Any parameters listed in parentheses are optional.\ \>", "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["Monorder", "Subsubsection"], "\nThis command is used to set the monomial order used in all other commands \ in the package. The allowable monomial orders are denoted as follows:\n \ Lex (lexicographic order) \n Grlex (graded lexicographic order) \n \ Grevlex (graded reverse lexicographic order)\n {k,n} (elimination \ order, eliminating the first k of n variables) \n \ {{a11,...,a1n},...,{an1,...,ann}} (matrix order for n variables)\nNote the \ use of capital letters in the names of the first three of these orders. \ Thus, to change the monomial order to Grlex, you would issue the command \n\t\ MonOrder[Grlex]\nFurthemore, the command \n\tMonOrder[]\nwill return the \ current monomial order. This is useful if you've forgotten what the order \ is. The default monomial order is Lex." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["PRemainder", "Subsubsection"], "\nThe format for this command is\n\tPRemainder[f,{f1,...,fs},varlist] \n\ where f is the polynomial to be divided and {f1,...,fs} is the list of \ polynomials to divide by. The output will be the remainder of f on division \ by f1,...fs. \n\tThe \"varlist\" is a list of variables. You should be \ aware that the order of the variables in varlist is important since it \ (together with what you specified in MonOrder) determines the monomial \ order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["PQuotient", "Subsubsection"], "\nThe format is\n\tPQuotient[f,{f1,...,fs},varlist] \nwhere f is the \ polynomial to be divided and {f1,...,fs} is the list of polynomials to divide \ by. The output will be a list of quotients {a1,...,as} of f on division by \ f1,...fs. The \"varlist\" is a list of variables that determines the order \ of the variables in the current monomial order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["GroebnerQ ", "Subsubsection"], "\nThe format is\n\tGroebnerQ[{f1,...,fs},varlist,(torder)]\nThis command \ returns either True or False, depending on whether {f1,...,fs} forms a \ Groebner basis under the current monomial ordering or torder, if it is \ specified, with \"varlist\" determining the order of the variables used in \ the monomial order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["Buch", "Subsubsection"], " or ", StyleBox["B", "Subsubsection"], "\nThe format is\n\tBuch[{f1,...,fs},varlist,options...] or \ B[{f1,...,fs},varlist,options...]\nwhere {f1,...,fs} is a list of polynomials \ and, \"varlist\" determines the order of the variables used in the current \ monomial order. The output of this command is a Groebner basis for the ideal \ with respect to the current monomial order, and it also prints \ out the number of times that PRemainder is performed. The algorithm employed \ is a naive version of the Buchberger algorithm, with the one efficiency that \ no S-polynomial that has already been checked is checked again. The output \ need not be a reduced Groebner basis, and the steps of the computation will \ be printed. If this printing is not desired, the option PrintSteps should be \ set to False." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["AltBuchberger ", "Subsubsection"], "or ", StyleBox["AB", "Subsubsection"], "\nThe format is\n\tAltBuchberger[{f1,...,fs},varlist,options...] or \ AB[{f1,...,fs},varlist,options...]\nThis command is a slightly modified \ version of Buch. It returns a Groebner basis for the ideal , with \ respect to the current monomial order and the order of varlist. It is the \ same algorithm as Buch, but uses the up-to-date constructed basis for all \ S-polynomial remainder computations. The output need not be a reduced \ Groebner basis, and the steps of the computation will be printed. If this \ printing is not desired, the option PrintSteps should be set to False." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["QuickBuchberger ", "Subsubsection"], "or ", StyleBox["QB", "Subsubsection"], "\nThe format is\n\tQuickBuchberger[{f1,...,fs},varlist,options...] or \ QB[{f1,...,fs},varlist,options...]\nThis command uses a more efficient \ version of the Buckberger algorithm to compute a Groebner basis for the ideal \ with respect to the current monomial order. As usual, \ \"varlist\" determines the order of the variables used in the current \ monomial order. The output need not be a reduced Groebner basis, and the \ steps of the computation will be printed. If this printing is not desired, \ the option PrintSteps should be set to False." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["MathematicaBuchberger ", "Subsubsection"], "or ", StyleBox["MB", "Subsubsection"], "\nThe format is\n\tMathematicaBuchberger[{f1,...,fs},varlist] or \ MB[{f1,...,fs},varlist,options...]\nThis command directly uses ", StyleBox["Mathematica", FontSlant->"Italic"], "'s GroebnerBasis command to find a reduced Groebner basis for the ideal \ with respect to the current monomial order. As usual, varlist \ determines the order of the variables." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["ReduceGroebner", "Subsubsection"], "\nThe format is\n\tReduceGroebner[{f1,...,fs},varlist,(torder)]\nThis \ command takes a Groebner basis {f1,...,fs} and produces a reduced Groebner \ basis for the same ideal. If specified, torder is the monomial ordering. \ If left unspecified, the monomial ordering is determined by what is set by \ MonOrder. Be sure not to change the monomial order or \"varlist\" from when \ you produced the Groebner basis." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["SPoly", "Subsubsection"], "\nThe format is\n\tSPoly[poly1,poly2,varlist] \nThis command returns the \ S-polynomial of poly1 and poly2, and \"varlist\" determines the order of the \ variables used in the current monomial order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["IdealQ\n", "Subsubsection"], "The format is \n\tIdealQ[f,{f1,...,fs},varlist] \nThis is an implementation \ of the Ideal Membership Algorithm. The command returns either True or False, \ depending on whether the polynomial f is in the ideal , with \ \"varlist\"\ndetermining the order of the variables used in the current \ monomial order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["RadicalQ", "Subsubsection"], "\nThe format is\n\tRadicalQ[f,{f1,...,fs},varlist] \nThis is an \ implementation of the Radical Membership Algorithm. The command returns \ either True or False, depending on whether the polynomial f is in the radical \ of the ideal , with \"varlist\" determining the order of the \ variables used in the current monomial order." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["FiniteQ", "Subsubsection"], "\nThe format is\n\tFiniteQ[{f1,...,fs},varlist] \nThis is an implementation \ of the Finiteness Algorithm. The command returns True or False, depending on \ whether the set of equations specified by f1=...=fs=0 has a finite number of \ solutions over the complex numbers." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["VSDimension", "Subsubsection"], "\nThe format is\n\tVSDimension[{f1,...,fs},varlist, (torder)] \nThis \ command returns the basis remainders and the dimension (as a vector space) of \ the polynomial ring modulo the ideal . The output is {Infinity, \ Infinity} if the quotient is infinite dimensional. If specified, torder sets \ the monomial order, and if unspecified, the monomial order is the order \ currently set by MonOrder." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["Radical", "Subsubsection"], "\nThe format is\n Radical[{f1,...fs}, varlist]\nThis command returns \ generators of the radical of the zero-dimesnional ideal . The \ returned polynomials do NOT necessarily form a Groebner basis." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["RadicalIdealQ", "Subsubsection"], "\n The format is\n RadicalIdealQ[{f1,...,fs}, varlist]\nThis command \ returns True if the zero-dimensional ideal generated by {f1,...,fs} is \ radical, and False otherwise." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["ConvertGB", "Subsubsection"], " \nThe format is\n ConvertGB[{f1,...,fs}, varlist, oldvarlist, \ options...]\nIn this command, {f1,...,fs} form a Groebner basis of a \ zero-dimensional ideal for oldvarlist and the current monomial order set by \ MonOrder. This monomial order specification can be changed by setting the \ option OldOrderType to the appropriate order. The other options are \ OrderType and PrintSteps. When OrderType is set to Grlex, ConvertGB returns \ a Groebner basis with respect to varlist and grlex that generates the same \ ideal as {f1,...,fs}. If set to Lex or left unset, ConvertGB returns a \ Groebner basis with respect to varlist and lex. In both cases, the remainder \ monomials with respect to the monomial ordering are also returned. If \ PrintSteps is set to True, every time the command adds a polynomial to the \ constructed Groebner basis, it will print that polynomial and print the \ remainder monomials added since the last polynomial was added, if any were \ added." }], "Text", TextAlignment->Left], Cell[TextData[{ StyleBox["IdealofPoints", "Subsubsection"], "\n The format is\n IdealofPoints[{P1,...,Ps}, varlist, (torder)]\n\ This command returns the Groebner basis of the ideal of all polynomials which \ vanish on points {P1,...,Ps}. Each point is given as an n-dimensional \ vector. If left unspecified, torder is the monomial order set by MonOrder.\n\ " }], "Text", CellChangeTimes->{{3.429386926253023*^9, 3.429386927269189*^9}}, TextAlignment->Left] }, Open ]], Cell[CellGroupData[{ Cell["Acknowledgements", "Section"], Cell[TextData[{ "Will Gryc would like to thank the Charleton Trust for supporting his work \ on this ", StyleBox["Mathematica", FontSlant->"Italic"], " notebook. Similarly, Ben Krause would like to thank the Schupf Fund for \ supporting his work on the notebook." }], "Text", CellChangeTimes->{{3.424628819200265*^9, 3.4246288850875797`*^9}, { 3.424697821971778*^9, 3.424697822502364*^9}, {3.429433922817535*^9, 3.429433925249781*^9}}] }, Open ]] }, Open ]] }, WindowSize->{1231, 1074}, WindowMargins->{{Automatic, 165}, {18, Automatic}}, PrintingPageRange->{Automatic, Automatic}, PrintingOptions->{"Magnification"->1., "PaperOrientation"->"Portrait", "PaperSize"->{611.25, 789.5625}, "PostScriptOutputFile"->"/home/dac/necuse/gryc/groebner40.nb.ps"}, FrontEndVersion->"6.0 for Linux x86 (32-bit) (June 2, 2008)", StyleDefinitions->"Default.nb" ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{} *) (*CellTagsIndex CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[590, 23, 113, 1, 82, "Title"], Cell[706, 26, 593, 11, 283, "Text"], Cell[CellGroupData[{ Cell[1324, 41, 29, 0, 71, "Section"], Cell[1356, 43, 574, 10, 249, "Text"], Cell[1933, 55, 122, 2, 46, "Input"], Cell[2058, 59, 415, 7, 147, "Text"], Cell[CellGroupData[{ Cell[2498, 70, 30, 0, 36, "Subsection"], Cell[2531, 72, 1442, 35, 385, "Text"], Cell[CellGroupData[{ Cell[3998, 111, 56, 1, 46, "Input"], Cell[4057, 114, 30, 0, 46, "Output"] }, Open ]], Cell[4102, 117, 438, 7, 181, "Text"], Cell[CellGroupData[{ Cell[4565, 128, 67, 1, 46, "Input"], Cell[4635, 131, 34, 0, 46, "Output"] }, Open ]], Cell[4684, 134, 161, 3, 79, "Text"], Cell[CellGroupData[{ Cell[4870, 141, 113, 3, 46, "Input"], Cell[4986, 146, 73, 2, 46, "Output"] }, Open ]], Cell[5074, 151, 235, 4, 113, "Text"], Cell[CellGroupData[{ Cell[5334, 159, 108, 3, 46, "Input"], Cell[5445, 164, 69, 0, 39, "Print"], Cell[5517, 166, 73, 2, 46, "Output"] }, Open ]], Cell[5605, 171, 200, 4, 79, "Text"], Cell[CellGroupData[{ Cell[5830, 179, 301, 9, 46, "Input"], Cell[6134, 190, 260, 8, 46, "Output"] }, Open ]], Cell[6409, 201, 584, 10, 249, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[7030, 216, 58, 0, 36, "Subsection"], Cell[7091, 218, 49, 0, 45, "Text"], Cell[CellGroupData[{ Cell[7165, 222, 67, 1, 46, "Input"], Cell[7235, 225, 34, 0, 35, "Output"] }, Open ]], Cell[7284, 228, 51, 0, 34, "Text"], Cell[CellGroupData[{ Cell[7360, 232, 237, 7, 35, "Input"], Cell[7600, 241, 173, 6, 45, "Output"] }, Open ]], Cell[7788, 250, 649, 12, 126, "Text"], Cell[CellGroupData[{ Cell[8462, 266, 258, 7, 35, "Input"], Cell[8723, 275, 91, 3, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[8851, 283, 252, 7, 35, "Input"], Cell[9106, 292, 73, 2, 35, "Output"] }, Open ]], Cell[9194, 297, 532, 9, 172, "Text"], Cell[CellGroupData[{ Cell[9751, 310, 163, 4, 35, "Input"], Cell[9917, 316, 32, 0, 35, "Output"] }, Open ]], Cell[9964, 319, 72, 0, 34, "Text"], Cell[CellGroupData[{ Cell[10061, 323, 183, 5, 35, "Input"], Cell[10247, 330, 31, 0, 35, "Output"] }, Open ]], Cell[10293, 333, 159, 3, 57, "Text"], Cell[CellGroupData[{ Cell[10477, 340, 56, 1, 35, "Input"], Cell[10536, 343, 34, 0, 35, "Output"] }, Open ]], Cell[10585, 346, 673, 10, 149, "Text"], Cell[CellGroupData[{ Cell[11283, 360, 158, 4, 35, "Input"], Cell[CellGroupData[{ Cell[11466, 368, 358, 9, 28, "Print"], Cell[11827, 379, 63, 0, 28, "Print"], Cell[11893, 381, 440, 12, 38, "Print"], Cell[12336, 395, 235, 5, 28, "Print"], Cell[12574, 402, 447, 12, 38, "Print"], Cell[13024, 416, 235, 5, 28, "Print"], Cell[13262, 423, 417, 11, 38, "Print"], Cell[13682, 436, 235, 5, 28, "Print"], Cell[13920, 443, 219, 5, 28, "Print"], Cell[14142, 450, 235, 5, 28, "Print"], Cell[14380, 457, 172, 4, 28, "Print"] }, Open ]], Cell[14567, 464, 616, 22, 45, "Output"] }, Open ]], Cell[15198, 489, 361, 6, 103, "Text"], Cell[CellGroupData[{ Cell[15584, 499, 221, 5, 35, "Input"], Cell[15808, 506, 616, 22, 45, "Output"] }, Open ]], Cell[16439, 531, 590, 9, 126, "Text"], Cell[CellGroupData[{ Cell[17054, 544, 424, 13, 35, "Input"], Cell[17481, 559, 337, 12, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[17855, 576, 194, 5, 35, "Input"], Cell[CellGroupData[{ Cell[18074, 585, 603, 17, 38, "Print"], Cell[18680, 604, 235, 5, 28, "Print"], Cell[18918, 611, 938, 28, 38, "Print"], Cell[19859, 641, 235, 5, 28, "Print"], Cell[20097, 648, 2324, 76, 71, "Print"], Cell[22424, 726, 237, 5, 28, "Print"], Cell[22664, 733, 219, 5, 28, "Print"], Cell[22886, 740, 239, 5, 28, "Print"], Cell[23128, 747, 174, 4, 28, "Print"] }, Open ]], Cell[23317, 754, 2820, 103, 108, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[26174, 862, 203, 5, 35, "Input"], Cell[CellGroupData[{ Cell[26402, 871, 603, 17, 38, "Print"], Cell[27008, 890, 235, 5, 28, "Print"], Cell[27246, 897, 429, 11, 38, "Print"], Cell[27678, 910, 235, 5, 28, "Print"], Cell[27916, 917, 617, 18, 38, "Print"], Cell[28536, 937, 235, 5, 28, "Print"], Cell[28774, 944, 219, 5, 28, "Print"], Cell[28996, 951, 237, 5, 28, "Print"], Cell[29236, 958, 172, 4, 28, "Print"] }, Open ]], Cell[29423, 965, 978, 35, 45, "Output"] }, Open ]], Cell[30416, 1003, 110, 3, 34, "Text"], Cell[CellGroupData[{ Cell[30551, 1010, 159, 4, 35, "Input"], Cell[30713, 1016, 31, 0, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[30781, 1021, 159, 4, 35, "Input"], Cell[30943, 1027, 31, 0, 35, "Output"] }, Open ]], Cell[30989, 1030, 370, 6, 103, "Text"], Cell[CellGroupData[{ Cell[31384, 1040, 161, 5, 35, "Input"], Cell[31548, 1047, 123, 4, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[31708, 1056, 153, 4, 35, "Input"], Cell[CellGroupData[{ Cell[31886, 1064, 219, 5, 28, "Print"], Cell[32108, 1071, 63, 0, 28, "Print"], Cell[32174, 1073, 170, 4, 28, "Print"] }, Open ]], Cell[32359, 1080, 123, 4, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[32519, 1089, 155, 4, 35, "Input"], Cell[CellGroupData[{ Cell[32699, 1097, 219, 5, 28, "Print"], Cell[32921, 1104, 235, 5, 28, "Print"], Cell[33159, 1111, 170, 4, 28, "Print"] }, Open ]], Cell[33344, 1118, 123, 4, 45, "Output"] }, Open ]], Cell[33482, 1125, 325, 8, 80, "Text"], Cell[CellGroupData[{ Cell[33832, 1137, 284, 9, 35, "Input"], Cell[34119, 1148, 234, 8, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[34390, 1161, 153, 4, 35, "Input"], Cell[CellGroupData[{ Cell[34568, 1169, 219, 5, 28, "Print"], Cell[34790, 1176, 235, 5, 28, "Print"], Cell[35028, 1183, 170, 4, 28, "Print"] }, Open ]], Cell[35213, 1190, 234, 8, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[35484, 1203, 155, 4, 35, "Input"], Cell[CellGroupData[{ Cell[35664, 1211, 219, 5, 28, "Print"], Cell[35886, 1218, 235, 5, 28, "Print"], Cell[36124, 1225, 170, 4, 28, "Print"] }, Open ]], Cell[36309, 1232, 234, 8, 45, "Output"] }, Open ]], Cell[36558, 1243, 1718, 31, 379, "Text"], Cell[CellGroupData[{ Cell[38301, 1278, 175, 4, 35, "Input"], Cell[38479, 1284, 597, 22, 45, "Output"] }, Open ]], Cell[39091, 1309, 498, 13, 103, "Text"], Cell[CellGroupData[{ Cell[39614, 1326, 379, 9, 86, "Input"], Cell[39996, 1337, 617, 23, 46, "Output"] }, Open ]], Cell[40628, 1363, 948, 15, 555, "Text"], Cell[41579, 1380, 329, 6, 113, "Text"], Cell[CellGroupData[{ Cell[41933, 1390, 283, 8, 46, "Input"], Cell[42219, 1400, 91, 3, 46, "Output"] }, Open ]], Cell[42325, 1406, 98, 2, 45, "Text"], Cell[42426, 1410, 110, 3, 45, "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[42585, 1419, 51, 0, 71, "Section"], Cell[42639, 1421, 246, 4, 113, "Text"], Cell[CellGroupData[{ Cell[42910, 1429, 762, 19, 61, "Input"], Cell[43675, 1450, 638, 19, 45, "Output"] }, Open ]], Cell[44328, 1472, 407, 7, 103, "Text"], Cell[CellGroupData[{ Cell[44760, 1483, 245, 6, 35, "Input"], Cell[45008, 1491, 32, 0, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[45077, 1496, 464, 13, 35, "Input"], Cell[45544, 1511, 31, 0, 35, "Output"] }, Open ]], Cell[45590, 1514, 509, 8, 126, "Text"], Cell[CellGroupData[{ Cell[46124, 1526, 264, 8, 35, "Input"], Cell[46391, 1536, 209, 7, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[46637, 1548, 201, 5, 35, "Input"], Cell[46841, 1555, 31, 0, 35, "Output"] }, Open ]], Cell[46887, 1558, 876, 20, 195, "Text"], Cell[CellGroupData[{ Cell[47788, 1582, 65, 1, 35, "Input"], Cell[47856, 1585, 32, 0, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[47925, 1590, 568, 15, 35, "Input"], Cell[48496, 1607, 483, 16, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[49016, 1628, 161, 4, 35, "Input"], Cell[49180, 1634, 31, 0, 35, "Output"] }, Open ]], Cell[49226, 1637, 1441, 22, 333, "Text"], Cell[CellGroupData[{ Cell[50692, 1663, 165, 4, 46, "Input"], Cell[50860, 1669, 7455, 226, 320, "Output"] }, Open ]], Cell[58330, 1898, 89, 2, 45, "Text"], Cell[CellGroupData[{ Cell[58444, 1904, 234, 6, 46, "Input"], Cell[58681, 1912, 6279, 197, 281, "Output"] }, Open ]], Cell[64975, 2112, 500, 9, 249, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[65512, 2126, 29, 0, 71, "Section"], Cell[65544, 2128, 812, 12, 317, "Text"], Cell[CellGroupData[{ Cell[66381, 2144, 757, 19, 61, "Input"], Cell[67141, 2165, 638, 19, 45, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[67816, 2189, 221, 6, 35, "Input"], Cell[68040, 2197, 1226, 39, 78, "Output"] }, Open ]], Cell[69281, 2239, 206, 4, 57, "Text"], Cell[CellGroupData[{ Cell[69512, 2247, 188, 5, 35, "Input"], Cell[69703, 2254, 32, 0, 35, "Output"] }, Open ]], Cell[69750, 2257, 99, 2, 34, "Text"], Cell[CellGroupData[{ Cell[69874, 2263, 191, 5, 35, "Input"], Cell[70068, 2270, 31, 0, 35, "Output"] }, Open ]], Cell[70114, 2273, 1854, 27, 425, "Text"], Cell[CellGroupData[{ Cell[71993, 2304, 67, 1, 35, "Input"], Cell[72063, 2307, 34, 0, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[72134, 2312, 236, 6, 35, "Input"], Cell[72373, 2320, 3455, 99, 195, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[75865, 2424, 294, 8, 35, "Input"], Cell[76162, 2434, 3420, 108, 270, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[79619, 2547, 479, 11, 61, "Input"], Cell[CellGroupData[{ Cell[80123, 2562, 497, 12, 38, "Print"], Cell[80623, 2576, 349, 9, 33, "Print"], Cell[80975, 2587, 322, 8, 28, "Print"], Cell[81300, 2597, 308, 8, 28, "Print"], Cell[81611, 2607, 581, 17, 54, "Print"], Cell[82195, 2626, 306, 8, 38, "Print"], Cell[82504, 2636, 606, 18, 54, "Print"], Cell[83113, 2656, 571, 17, 54, "Print"], Cell[83687, 2675, 601, 17, 54, "Print"], Cell[84291, 2694, 923, 26, 55, "Print"], Cell[85217, 2722, 845, 23, 55, "Print"], Cell[86065, 2747, 924, 26, 55, "Print"], Cell[86992, 2775, 620, 17, 53, "Print"], Cell[87615, 2794, 971, 26, 81, "Print"] }, Open ]], Cell[88601, 2823, 4994, 155, 380, "Output"] }, Open ]], Cell[93610, 2981, 813, 13, 218, "Text"], Cell[CellGroupData[{ Cell[94448, 2998, 56, 1, 35, "Input"], Cell[94507, 3001, 34, 0, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[94578, 3006, 431, 11, 35, "Input"], Cell[95012, 3019, 330, 10, 35, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[95379, 3034, 168, 4, 35, "Input"], Cell[95550, 3040, 1899, 60, 157, "Output"] }, Open ]], Cell[97464, 3103, 338, 8, 80, "Text"], Cell[CellGroupData[{ Cell[97827, 3115, 2018, 64, 174, "Input"], Cell[99848, 3181, 1916, 63, 157, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[101801, 3249, 62, 1, 35, "Input"], Cell[101866, 3252, 714, 22, 61, "Output"] }, Open ]], Cell[102595, 3277, 425, 10, 195, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[103057, 3292, 29, 0, 67, "Section"], Cell[103089, 3294, 766, 21, 149, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[103892, 3320, 34, 0, 71, "Section"], Cell[103929, 3322, 395, 11, 317, "Text"], Cell[104327, 3335, 886, 14, 504, "Text"], Cell[105216, 3351, 548, 10, 266, "Text"], Cell[105767, 3363, 448, 8, 198, "Text"], Cell[106218, 3373, 412, 8, 198, "Text"], Cell[106633, 3383, 917, 16, 241, "Text"], Cell[107553, 3401, 740, 13, 195, "Text"], Cell[108296, 3416, 711, 13, 172, "Text"], Cell[109010, 3431, 524, 12, 149, "Text"], Cell[109537, 3445, 514, 9, 165, "Text"], Cell[110054, 3456, 289, 6, 119, "Text"], Cell[110346, 3464, 414, 8, 142, "Text"], Cell[110763, 3474, 433, 8, 198, "Text"], Cell[111199, 3484, 364, 7, 198, "Text"], Cell[111566, 3493, 505, 9, 232, "Text"], Cell[112074, 3504, 308, 6, 164, "Text"], Cell[112385, 3512, 278, 6, 164, "Text"], Cell[112666, 3520, 1080, 17, 453, "Text"], Cell[113749, 3539, 472, 9, 232, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[114258, 3553, 35, 0, 71, "Section"], Cell[114296, 3555, 447, 10, 113, "Text"] }, Open ]] }, Open ]] } ] *) (* End of internal cache information *)