Skip to content

Instantly share code, notes, and snippets.

@defeo
Last active November 16, 2017 18:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save defeo/134e8b3769fa273121c0407b094d5361 to your computer and use it in GitHub Desktop.
Save defeo/134e8b3769fa273121c0407b094d5361 to your computer and use it in GitHub Desktop.
MA2-ace TD 7
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 10.7"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[h^2 + d^2 - b^2, h*a^2 - h*b^2 + 4*d*A - 2*c*A, h*c - 2*A, h*A - 1/4*d*a^2 + 1/4*d*b^2 - 1/8*a^2*c - 3/8*b^2*c + 1/8*c^3, d*c + 1/2*a^2 - 1/2*b^2 - 1/2*c^2, a^4 - 2*a^2*b^2 - 2*a^2*c^2 + b^4 - 2*b^2*c^2 + c^4 + 16*A^2]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R.<h,d,a,b,c,A> = PolynomialRing(QQ, order='lex')\n",
"I = R.ideal(c*h - 2*A,\n",
" (c-d)^2 + h^2 - a^2,\n",
" d^2 + h^2 - b^2)\n",
"G = I.groebner_basis()\n",
"G"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"a^4 - 2*a^2*b^2 - 2*a^2*c^2 + b^4 - 2*b^2*c^2 + c^4 + 16*A^2"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On conclut que la surface d'un triangle de côtés $a,b,c$ est égale à\n",
"\n",
"$$\\frac{\\sqrt{(-a + b - c) (-a + b + c) (a + b - c) (a + b + c)}}{4}$$"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(-a + b - c) * (-a + b + c) * (a + b - c) * (a + b + c)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(G[-1] - 16*A^2).factor()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 11.4"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[cosu - 1/4*x^2 - 1/4*y^2 - 1/4*z^2 + 5/4, sinu - z, cost^2 + sint^2 - 1, cost*x + sint*y - 1/4*x^2 - 1/4*y^2 - 1/4*z^2 - 3/4, cost*y - sint*x, cost*z^2 + 3*cost + 1/4*x^3 + 1/4*x*y^2 + 1/4*x*z^2 - 13/4*x, sint*x^2 + sint*y^2 - 1/4*x^2*y - 1/4*y^3 - 1/4*y*z^2 - 3/4*y, sint*z^2 + 3*sint + 1/4*x^2*y + 1/4*y^3 + 1/4*y*z^2 - 13/4*y, x^4 + 2*x^2*y^2 + 2*x^2*z^2 - 10*x^2 + y^4 + 2*y^2*z^2 - 10*y^2 + z^4 + 6*z^2 + 9]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A.<cosu,sinu,cost,sint,x,y,z> = PolynomialRing(QQ, order='lex')\n",
"I = A.ideal(x - (2 + cosu)*cost,\n",
" y - (2 + cosu) * sint,\n",
" z - sinu,\n",
" cosu^2 + sinu^2 - 1,\n",
" cost^2 + sint^2 - 1)\n",
"G = I.groebner_basis()\n",
"G"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"x^4 + 2*x^2*y^2 + 2*x^2*z^2 - 10*x^2 + y^4 + 2*y^2*z^2 - 10*y^2 + z^4 + 6*z^2 + 9"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p = G[-1]\n",
"p"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour obtenir les relations algèbriques entre $\\cos(2s), \\sin(2s), \\cos(3s), \\sin(3s)$, on utilise le moteur symbolique de Sage:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2*cos(s)^2 - 1"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = SR.var('s')\n",
"cos(2*s).simplify_trig()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"sin(2*s) = 2*cos(s)*sin(s)\n",
"sin(3*s) = (4*cos(s)^2 - 1)*sin(s)\n",
"cos(2*s) = 2*cos(s)^2 - 1\n",
"cos(3*s) = 4*cos(s)^3 - 3*cos(s)\n"
]
}
],
"source": [
"for f in [sin, cos]:\n",
" for n in [2,3]:\n",
" print f(n*s), '=', f(n*s).simplify_trig()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Ideal (4*Y^4 + 64*Y^2*Z^4 - 76*Y^2*Z^2 - 4*Y^2 + 16*Z^10 + 72*Z^8 + 9*Z^6 - 162*Z^4 + 81*Z^2, 16*X*Z^7 - 96*X*Z^5 + 67*X*Z^3 - 3*X*Z + 8*Y^3*Z^2 - 2*Y^3 + 64*Y*Z^6 - 88*Y*Z^4 - 6*Y*Z^2 + 2*Y, 8*X*Y*Z^4 - 42*X*Y*Z^2 + 2*X*Y - 32*Y^2*Z^3 + 24*Y^2*Z - 16*Z^9 - 80*Z^7 - 51*Z^5 + 126*Z^3 - 27*Z, 2*X*Y^2 - 8*X*Z^6 + 62*X*Z^4 - 42*X*Z^2 - 4*Y^3*Z - 36*Y*Z^5 + 59*Y*Z^3 + Y*Z, 25*X^2 + 72*X*Y*Z^3 - 374*X*Y*Z - 288*Y^2*Z^2 + 225*Y^2 - 144*Z^8 - 728*Z^6 - 505*Z^4 + 1074*Z^2 - 225) of Multivariate Polynomial Ring in coss, sins, cos2s, sin2s, cos3s, sin3s, X, Y, Z over Rational Field"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A.<coss,sins,cos2s,sin2s,cos3s,sin3s,X,Y,Z> = PolynomialRing(QQ, order='lex')\n",
"I = A.ideal(X - (2 + cos2s) * cos3s,\n",
" Y - (2 + cos2s) * sin3s,\n",
" Z - sin2s,\n",
" sin2s - 2*coss*sins,\n",
" sin3s - (4*coss^2 - 1)*sins,\n",
" cos2s - (2*coss^2 - 1),\n",
" cos3s - (4*coss^3 - 3*coss),\n",
" sins^2 + coss^2 - 1)\n",
"J = I.elimination_ideal([coss,sins,cos2s,sin2s,cos3s,sin3s])\n",
"J"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"On vérifie que la courbe est bien contenue dans la surface, i.e. que l'ideal de la surface (engendré par `p`, calculé plus haut) est contenu dans l'idéal de la courbe.\n",
"\n",
"On convertit `p` en un polynôme du nouvel anneau en l'évaluant en `X,Y,Z`."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p(x=X, y=Y, z=Z) in J"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La surface paramétrèe est un tore. Le code ci-dessous permet de dessinner la surface et la courbe en 3 dimensions. À l'heure actuelle (versions de Sage jusqu'à 8.0), l'interface Jupyter de Sage ne supporte pas le dessin 3d. Cette instruction peut néanmoins être utilisée en ligne de commande."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"s, u, t = SR.var('s, u, t')\n",
"(\n",
" parametric_plot3d([(2 + cos(u))*cos(t), (2 + cos(u))*sin(t), sin(u)],\n",
" (u,-pi,pi), (t,-pi,pi))\n",
" + parametric_plot3d([(2 + cos(2*s))*cos(3*s), (2 + cos(2*s))*sin(3*s), sin(2*s)],\n",
" (s,0,6*pi), color='red')\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 12.5"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Ideal (4*x^3*y^2 + 2*x*y^4 - 2*x*y^2, 2*x^4*y + 4*x^2*y^3 - 2*x^2*y) of Multivariate Polynomial Ring in x, y, t over Rational Field"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A.<x,y,t> = PolynomialRing(QQ, order='lex')\n",
"f = x^4*y^2 + x^2*y^4 - x^2*y^2\n",
"I = A.ideal(f.derivative(x), f.derivative(y))\n",
"I"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On voit clairement que l'idéal a dimension 1, et que donc le lieu critique est infini."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x^4*y + 2*x^2*y^3 - x^2*y, x^3*y^2 + 1/2*x*y^4 - 1/2*x*y^2, x^2*y^4 - 1/3*x^2*y^2, x*y^6 - 4/3*x*y^4 + 1/3*x*y^2]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.groebner_basis()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Ideal (x^4*y^2 + x^2*y^4 - x^2*y^2 - t, 4*x^3*y^2 + 2*x*y^4 - 2*x*y^2, 2*x^4*y + 4*x^2*y^3 - 2*x^2*y) of Multivariate Polynomial Ring in x, y, t over Rational Field"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I = A.ideal(f - t, f.derivative(x), f.derivative(y))\n",
"I"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On voit qu'il y a uniquement deux valeurs critques: $0$ et $-1/27$. L'idéal est par contre toujours de dimension 1, car il y a une infinité de points associés à ces valeurs critiques."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x^4*y - x^2*y - 6*y*t, x^2*y^2 + 3*t, x^2*t - 1/3*t, x*y^4 - x*y^2 - 6*x*t, y^2*t - 1/3*t, t^2 + 1/27*t]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.groebner_basis()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.dimension()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On peut raffiner l'analyse en séparant les deux valeurs critiques. Pour la valeur critique $t=0$, il suffit de considérer l'idéal $〈f,f_x,f_y〉$. On voit qu'il s'agit d'un idéal de dimension 1, dont la variété correspond aux droites $x=0$ et $y=0$."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x^4*y - x^2*y, x^2*y^2, x*y^4 - x*y^2]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I = A.ideal(f, f.derivative(x), f.derivative(y))\n",
"I.groebner_basis()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour la valeur critique $-1/27$, nous utilisons ajoutons le polynôme $ft-1$, qui force $f$ et $t$ à être différents de $0$. Avec cette formulation, $t$ sera alors l'inverse de l'unique valeur critique non-nulle."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x^2 - 1/3, y^2 - 1/3, t + 27]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I = A.ideal(f*t - 1, f.derivative(x), f.derivative(y))\n",
"I.groebner_basis()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cette fois-ci, nous trouvons un idéal de dimension $0$, qui correspond à un nombre fini de points critiques. Ces points sont définis dans $ℚ[\\sqrt{1/3}]$, ce que nous vérifions (dans la suite $a=\\sqrt{1/3}$)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.variety()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Number Field in a with defining polynomial x^2 - 1/3"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k.<a> = QuadraticField(1/3)\n",
"k"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[{y: -a, t: -27, x: -a},\n",
" {y: -a, t: -27, x: a},\n",
" {y: a, t: -27, x: -a},\n",
" {y: a, t: -27, x: a}]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.variety(k)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(-1/27, 0, 0)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f(x=a, y=a), f.derivative(x)(x=a, y=a), f.derivative(y)(x=a, y=a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 14.3"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"A.<x,y> = QQ[]\n",
"I = A.ideal(x^3*y, x*y^2)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x^3*y, x*y^2]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.groebner_basis()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On affiche tous les monomes, de degrés jusqu'à 5 en $x$ ou $y$, qui **n'appartiennent pas** à $I$.\n",
"\n",
"Pour aider la lecture, on ordonne la liste (l'ordre par défaut est *degrevlex*, ce qui nous arrange bien)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[1, y, x, y^2, x*y, x^2, y^3, x^2*y, x^3, y^4, x^4, y^5, x^5]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted([m for m in monomials([x,y], [6,6]) if m not in I ])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On compte les monômes par **degré total**, et on lit bien les premières valeures de la fonction de Hilbert:\n",
"```\n",
"H(1) = 1,\n",
"H(2) = 3,\n",
"H(3) = 6,\n",
"H(4) = 9,\n",
"H(5) = 11\n",
"H(6) = 13\n",
"```\n",
"on voit bien que $H(i) = 2 + H(i-1)$ pour tout $i>4$. On en déduit que $H(s) = 2s+1$, et que la dimension de la variété est 1."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.dimension()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sage possède une méthode `hilbert_polynomial()`, mais attention: cette méthode calcule le polynôme d'Hilbert gradué d'un idéal homogène, ce qui ne correspond pas à notre définition:"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.hilbert_polynomial()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 14.4"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"A.<x,y,z> = QQ[]\n",
"I = A.ideal(x^3*y*z^5, x*y^3*z^2)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[1,\n",
" z,\n",
" y,\n",
" x,\n",
" z^2,\n",
" y*z,\n",
" x*z,\n",
" y^2,\n",
" x*y,\n",
" x^2,\n",
" y*z^2,\n",
" x*z^2,\n",
" y^2*z,\n",
" x*y*z,\n",
" x^2*z,\n",
" x*y^2,\n",
" x^2*y,\n",
" y^2*z^2,\n",
" x*y*z^2,\n",
" x^2*z^2,\n",
" x*y^2*z,\n",
" x^2*y*z,\n",
" x^2*y^2,\n",
" x*y^2*z^2,\n",
" x^2*y*z^2,\n",
" x^2*y^2*z,\n",
" x^2*y^2*z^2]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted([m for m in monomials([x,y,z], [3,3,3]) if m not in I])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il y a ici trop de monomes pour compter à la main, il va falloir automatiser."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in I])"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 --> 1\n",
"2 --> 4\n",
"3 --> 10\n",
"4 --> 20\n",
"5 --> 35\n",
"6 --> 56\n",
"7 --> 83\n",
"8 --> 116\n",
"9 --> 155\n",
"10 --> 199\n",
"11 --> 247\n",
"12 --> 299\n",
"13 --> 355\n",
"14 --> 415\n"
]
}
],
"source": [
"for i in range(1,15):\n",
" print(\"%d --> %d\" % (i, HF(i)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On sait que la dimension de l'idéal ne peut pas être plus que 3, en supposant qu'on a calculé asséz de valeurs de la fonction d'Hilbert (et c'est bien le cas : il suffit de regarder les générateurs de $I$), on peut obtenir le polynôme d'Hilbert en interpolant sur les quatre dernières valeurs"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"B.<s> = QQ[]"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2*s^2 + 6*s - 61"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"B.lagrange_polynomial([(11, 247), (12, 299), (13, 355), (14, 415)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'idéal est de dimension 2, comme attendu"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.dimension()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercice 14.7\n",
"\n",
"Il est important ici d'utiliser un ordre gradué (par ex., degrevlex) pour calculer la base de Gröbner"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A.<x,y,z> = QQ[]\n",
"I = A.ideal([x*z, x*y - 1])"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[x*y - 1, z]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G = I.groebner_basis()\n",
"G"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On construit l'idéal monomial de $I$"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Ideal (x*y, z) of Multivariate Polynomial Ring in x, y, z over Rational Field"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"M = A.ideal([p.lm() for p in G])\n",
"M"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Et on évalue la fonction d'Hilbert"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in M])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 --> 1\n",
"2 --> 3\n",
"3 --> 5\n",
"4 --> 7\n",
"5 --> 9\n",
"6 --> 11\n",
"7 --> 13\n"
]
}
],
"source": [
"for i in range(1,8):\n",
" print(\"%d --> %d\" % (i, HF(i)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"On voit immédiatement que le polynôme d'Hilbert vaut $2s-1$, ce qui nous confime que $I$ et $M$ sont de dimension 1.\n",
"\n",
"Encore une fois, la méthode `hilbert_polynomial()` de Sage ne calcule pas ce que l'on souhaite. En effet, elle n'est même pas conçue pour être utilisée avec des idéaux non-homogènes."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "TypeError",
"evalue": "Ideal must be homogeneous.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-40-51a93ff31666>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhilbert_polynomial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/local/SageMath-8.0/local/lib/python2.7/site-packages/sage/rings/polynomial/multi_polynomial_ideal.pyc\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase_ring\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_field\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Coefficient ring must be a field for function '%s'.\"\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_instance\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 297\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[0mrequire_field\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRequireField\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/local/SageMath-8.0/local/lib/python2.7/site-packages/sage/rings/polynomial/multi_polynomial_ideal.pyc\u001b[0m in \u001b[0;36mhilbert_polynomial\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2401\u001b[0m \"\"\"\n\u001b[1;32m 2402\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_homogeneous\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2403\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Ideal must be homogeneous.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2404\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2405\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlibs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msingular\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunction_factory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: Ideal must be homogeneous."
]
}
],
"source": [
"I.hilbert_polynomial()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.dimension() == M.dimension() == 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A.<x,y,z,w> = QQ[]\n",
"I = A.ideal(z*w-y^2, x*y-z^3)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Ideal (z^3, y^2) of Multivariate Polynomial Ring in x, y, z, w over Rational Field"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"M = A.ideal([p.lm() for p in I.groebner_basis()])\n",
"M"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ici, même pas la peine d'évaluer la fonction d'Hilbert : on voit immédiatement que la variété de $M$ est l'hyperplan $z=0,y=0$, la dimension de $I$ et de $M$ est donc 2."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"I.dimension() == M.dimension() == 2"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "SageMath 8.0",
"language": "",
"name": "sagemath"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment