Last active
November 16, 2017 18:51
-
-
Save defeo/134e8b3769fa273121c0407b094d5361 to your computer and use it in GitHub Desktop.
MA2-ace TD 7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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