{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "renewable-trial",
"metadata": {},
"outputs": [],
"source": [
"using Oscar # start up Oscar"
]
},
{
"cell_type": "markdown",
"id": "vocal-annotation",
"metadata": {},
"source": [
"# Worksheet 3: parametrizations and normalization\n",
"\n",
"## Ideals defining images of maps\n",
"\n",
"Let $f \\colon X \\to Y$ be an algebraic/complex analytic map. \n",
"How can we compute the Zariski-closure of the image of $f$? \n",
"Finding equations for the image by hand is, in many cases, almost impossible. \n",
"Let us discuss how this can be achieved with the help of computers."
]
},
{
"cell_type": "markdown",
"id": "continuous-tablet",
"metadata": {},
"source": [
"### Manual computations using eleminitation orderings\n",
"\n",
"The following ideal models the graph of the map \n",
"\n",
"$f \\colon \\mathbb C \\to \\mathbb C^3, \\quad t \\mapsto (x,y,z) = (t^4, t^5, t^6)$.\n",
"\n",
"This is a *finite* map, so its image is a closed variety. We choose an *elemination ordering* for $t$ to compute the ideal $J$ defining the image."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "surprising-thanksgiving",
"metadata": {},
"outputs": [],
"source": [
"R, (t,x,y,z) = QQ[\"t\",\"x\", \"y\", \"z\"]\n",
"I = ideal(R, [x-t^4, y-t^5, z-t^6])\n",
"o = degrevlex([t])*degrevlex([x,y,z])\n",
"a = std_basis(I, o)\n",
"lead_a = (x->leading_monomial(x, o)).(a) # collect the leading monomials of all generators of the standard basis\n"
]
},
{
"cell_type": "markdown",
"id": "union-briefs",
"metadata": {},
"source": [
"As discussed in the lectures, the elements $g$ of a standard basis whose \n",
"leading term does not involve $t$ provide us with a set of generators for the ideal defining the image of $f$. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "international-arrest",
"metadata": {},
"outputs": [],
"source": [
"@show lead_a\n",
"gensJ = [g for g in a if !divides(leading_monomial(g, o), t)[1]] # select those leading monomials which are not divisible by t"
]
},
{
"cell_type": "markdown",
"id": "exclusive-strand",
"metadata": {},
"source": [
"### A taste of OSCAR: direct kernel computations\n",
"Compare the above procedure to the possibility to simply define the associated ring homomorphism of polynomial \n",
"rings and its kernel: Isn't it more convenient?"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "selected-physics",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y,z) = QQ[\"x\", \"y\", \"z\"]\n",
"# S, t = QQ[\"t\"] # DO NOT USE!!! This sets up S as a univariate \n",
" # polynomial ring which is another data structure\n",
" # There is no method for the computation of the \n",
" # kernel in this case!\n",
"S, (t,) = PolynomialRing(QQ, [\"t\"])\n",
"phi = hom(R, S, [t^4, t^5, t^6])\n",
"K = kernel(phi)"
]
},
{
"cell_type": "markdown",
"id": "reliable-spectacular",
"metadata": {},
"source": [
"## Parametrization of curve singularities\n",
"\n",
"### An example for manual normalization\n",
"\n",
"Consider the cuspidal curve $(X,0) \\subset (\\mathbb C^2,0)$ defined by the equation $f$ below."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "painful-tribe",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y) = QQ[\"x\", \"y\"]\n",
"f = x^2 - y^3\n",
"I = ideal(R, f)"
]
},
{
"cell_type": "markdown",
"id": "virtual-sudan",
"metadata": {},
"source": [
"We quickly compute the singular locus. No surprises."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "competitive-dictionary",
"metadata": {},
"outputs": [],
"source": [
"J = radical(singular_slocus(I)) # an ideal defining the singular locus"
]
},
{
"cell_type": "markdown",
"id": "realistic-background",
"metadata": {},
"source": [
"The *coordinate ring* $A$ of $X$ is given by the quotient ring modulo $I$. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "hearing-navigation",
"metadata": {},
"outputs": [],
"source": [
"A, _ = quo(R, I)"
]
},
{
"cell_type": "markdown",
"id": "outstanding-victor",
"metadata": {},
"source": [
"Let us check whether we find a suitable non-zerodivisor on $A$ in $J$."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "stable-venue",
"metadata": {},
"outputs": [],
"source": [
"zero_ideal_in_A = ideal(A, [A(0)])\n",
"K = ideal(A, [A(x)]) # x is an element in J\n",
"quotient(zero_ideal_in_A, K) # should return the zero ideal again!"
]
},
{
"cell_type": "markdown",
"id": "paperback-lyric",
"metadata": {},
"source": [
"Alternatively, we could work over the ring $R$ as follows:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "minimal-festival",
"metadata": {},
"outputs": [],
"source": [
"issubset(quotient(I, ideal(R, x)), I)"
]
},
{
"cell_type": "markdown",
"id": "impressive-chest",
"metadata": {},
"source": [
"Back to working over the quotient ring $A$. We can pass to the ideal of $A$ generated by $J$ and also set up the ideal generated by $x \\cdot J$. To shorten notation, we will in the following just speak of $J \\subset A$ whenever there is no risk of confusion. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "commercial-original",
"metadata": {},
"outputs": [],
"source": [
"JmodI = ideal(A, A.(gens(J)))\n",
"xJmodI = ideal(A, A.(x.*gens(J))) # f.(vec) applies the function f \n",
" # to each entry of a vector \n",
" # (broadcasting)"
]
},
{
"cell_type": "markdown",
"id": "ranking-commons",
"metadata": {},
"source": [
"Recall that to any $\\varphi \\in \\mathrm{Hom}_A(J, J)$ we \n",
"can assign a fraction $\\frac{\\varphi(x)}{x}$. Using \n",
"the $A$-linearity of $\\varphi$, it is easy to see that this \n",
"is independent of the choice of the non-zerodivisor $x\\in J$ on $A$. \n",
"\n",
"Then, according to the lectures, we need the quotient of these two ideals:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "durable-alias",
"metadata": {},
"outputs": [],
"source": [
"H = quotient(xJmodI, JmodI)"
]
},
{
"cell_type": "markdown",
"id": "utility-seattle",
"metadata": {},
"source": [
"We see that, besides the standard generator $\\frac{x}{x}=1$, there is \n",
"one other generator $\\frac{y^2}{x}$ in the automorphism ring \n",
"$\\mathrm{End}_A(J)$ of the ideal $J = \\langle x, y \\rangle\\subset A$. \n",
"\n",
"Indeed, we see that for both generators of $J$, $x \\cdot \\frac{y^2}{x} \\in J$ and $y \\cdot \\frac{y^2}{x} \\equiv \\frac{x^2}{x} = x \\in J$ \n",
"modulo $I$ and hence, multiplication with $\\frac{y^2}{x}$ gives a well defined endomorphism of $J$. \n",
"\n",
"If we were to use this as a step in the normalization algorithm, we would introduce an extra variable $t_1$, subject to the relation \n",
"$x \\cdot t_1 = y^2$. Moreover, as described in the lecture, we need to add further relations \n",
"for the products of the new variables, in case there are many, and for their syzygies. We leave this as an exercise."
]
},
{
"cell_type": "markdown",
"id": "alleged-berlin",
"metadata": {},
"source": [
"### Normalization using OSCAR's built-in routines\n",
"\n",
"Let us compute a normalization of $A$ directly; see the OSCAR documentation for details on the output."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "constitutional-soldier",
"metadata": {},
"outputs": [],
"source": [
"out = normalization(A)\n",
"(Aext, normalization_map, (a, K)) = out[1] # B is the quotient ring describing the first branch of the normalization."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "wicked-scheduling",
"metadata": {},
"outputs": [],
"source": [
"Aext\n",
"modulus(Aext)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "spectacular-cause",
"metadata": {},
"outputs": [],
"source": [
"normalization_map"
]
},
{
"cell_type": "markdown",
"id": "extraordinary-short",
"metadata": {},
"source": [
"The first element of the returned tuple is the quotient ring for the normalization. Instead of manually choosing an appropriate elimination ordering, we can make use of a heuristic that has been implemented in Singular (and wrapped for OSCAR): `elimpart`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "beginning-intro",
"metadata": {},
"outputs": [],
"source": [
"elimpart(modulus(Aext)) # This describes the parametrization of the branch for us"
]
},
{
"cell_type": "markdown",
"id": "happy-current",
"metadata": {},
"source": [
"We repeat the above with another curve which has more than one branch."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "unable-treat",
"metadata": {},
"outputs": [],
"source": [
"I2 = ideal(R, x^2 - y^4)\n",
"A2, _ = quo(R, I2)\n",
"out = normalization(A2)\n",
"(B, phi, (a, K)) = out[1]\n",
"elimpart(modulus(B))"
]
},
{
"cell_type": "markdown",
"id": "sunrise-armor",
"metadata": {},
"source": [
"### One more example of normalization\n",
"\n",
"The following example illustrates that one has to be careful when using primary decomposition. The ideal $I_3$ defines a space curve $(X,0) \\subset (\\mathbb C^3, 0)$ that seems to decompose into two components. \n",
"But do we really only have two branches? "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "anonymous-baptist",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y,z) = QQ[\"x\", \"y\", \"z\"]\n",
"I3 = ideal(R, [x^4-y*z^2,x*y-z^3,y^2-x^3*z])\n",
"@show pdec = primary_decomposition(I3)\n",
"[dim(a[1]) for a in pdec] # How many components do we have?"
]
},
{
"cell_type": "markdown",
"id": "radical-judgment",
"metadata": {},
"source": [
"Let us check the number of branches by computing a normalization."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "subsequent-bouquet",
"metadata": {},
"outputs": [],
"source": [
"A, _ = quo(R, I3)\n",
"out = normalization(A)"
]
},
{
"cell_type": "markdown",
"id": "alpine-fifth",
"metadata": {},
"source": [
"So we only get one quotient ring describing our normalization. But nevertheless the variety might have several components. We get more insight from `elimpart`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "spatial-methodology",
"metadata": {},
"outputs": [],
"source": [
"B = out[1][1]\n",
"Rsubst, Isubst, pb = elimpart(modulus(B))"
]
},
{
"cell_type": "markdown",
"id": "suited-breath",
"metadata": {},
"source": [
"What do we see from this output? In this case, we do not only have \n",
"two branches, but five! They are distinguished by $T_4$ which takes \n",
"the fifth roots of unity as constant values on each branch, respectively. The parameter for the branches is $z$."
]
},
{
"cell_type": "markdown",
"id": "improving-cathedral",
"metadata": {},
"source": [
"## The $\\delta$-invariant \n",
"\n",
"As an example, we consider the space curve singularity \n",
"parametrized by $t \\mapsto (t^4, t^5, t^6)$. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "permanent-monday",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y,z) = QQ[\"x\", \"y\", \"z\"]\n",
"# S, t = QQ[\"t\"] # DO NOT USE!!! This sets up S as a univariate \n",
" # polynomial ring which is another data structure\n",
" # There is no method for the computation of the \n",
" # kernel in this case!\n",
"S, (t,) = PolynomialRing(QQ, [\"t\"])\n",
"phi = hom(R, S, [t^4, t^5, t^6])\n",
"K = kernel(phi)\n",
"delta_invariant(K)"
]
},
{
"cell_type": "markdown",
"id": "neutral-pleasure",
"metadata": {},
"source": [
"Now an example of a non-complete intersection for $t \\mapsto (t^4, t^5, t^7)$. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "expired-zimbabwe",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y,z) = QQ[\"x\", \"y\", \"z\"]\n",
"# S, t = QQ[\"t\"] # DO NOT USE!!! This sets up S as a univariate \n",
" # polynomial ring which is another data structure\n",
" # There is no method for the computation of the \n",
" # kernel in this case!\n",
"S, (t,) = PolynomialRing(QQ, [\"t\"])\n",
"phi = hom(R, S, [t^4, t^5, t^7])\n",
"K = kernel(phi)\n",
"delta_invariant(K)"
]
},
{
"cell_type": "markdown",
"id": "professional-spoke",
"metadata": {},
"source": [
"## Normalization of higher dimensional varieties\n",
"\n",
"The following is an **I**solated **C**ohen-**M**acaulay **C**odimension $2$ surface singularity. Spoiler: These are known to be normal."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "hollywood-friend",
"metadata": {},
"outputs": [],
"source": [
"R, (x,y,z,w) = QQ[\"x\", \"y\", \"z\", \"w\"]\n",
"M = R[x y z; y z w]\n",
"I = ideal(R, minors(M, 2))\n",
"A, _ = quo(R, I)\n",
"out = normalization(A)\n",
"B = out[1][1]"
]
},
{
"cell_type": "markdown",
"id": "insured-witch",
"metadata": {},
"source": [
"We see that, indeed, normalization does nothing: No extra variables, no changes in the equations, nothing. Nevertheless, the space is singular:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "american-defensive",
"metadata": {},
"outputs": [],
"source": [
"radical(singular_slocus(I))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.7.3",
"language": "julia",
"name": "julia-1.7"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}