#!/usr/bin/env python # coding: utf-8 # ## Exercice 10.7 # In[1]: R. = PolynomialRing(QQ, order='lex') I = R.ideal(c*h - 2*A, (c-d)^2 + h^2 - a^2, d^2 + h^2 - b^2) G = I.groebner_basis() G # In[2]: G[-1] # On conclut que la surface d'un triangle de côtés $a,b,c$ est égale à # # $$\frac{\sqrt{(-a + b - c) (-a + b + c) (a + b - c) (a + b + c)}}{4}$$ # In[3]: (G[-1] - 16*A^2).factor() # ## Exercice 11.4 # In[4]: A. = PolynomialRing(QQ, order='lex') I = A.ideal(x - (2 + cosu)*cost, y - (2 + cosu) * sint, z - sinu, cosu^2 + sinu^2 - 1, cost^2 + sint^2 - 1) G = I.groebner_basis() G # In[5]: p = G[-1] p # Pour obtenir les relations algèbriques entre $\cos(2s), \sin(2s), \cos(3s), \sin(3s)$, on utilise le moteur symbolique de Sage: # In[7]: s = SR.var('s') cos(2*s).simplify_trig() # In[8]: for f in [sin, cos]: for n in [2,3]: print f(n*s), '=', f(n*s).simplify_trig() # In[10]: A. = PolynomialRing(QQ, order='lex') I = A.ideal(X - (2 + cos2s) * cos3s, Y - (2 + cos2s) * sin3s, Z - sin2s, sin2s - 2*coss*sins, sin3s - (4*coss^2 - 1)*sins, cos2s - (2*coss^2 - 1), cos3s - (4*coss^3 - 3*coss), sins^2 + coss^2 - 1) J = I.elimination_ideal([coss,sins,cos2s,sin2s,cos3s,sin3s]) J # 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. # # On convertit `p` en un polynôme du nouvel anneau en l'évaluant en `X,Y,Z`. # In[11]: p(x=X, y=Y, z=Z) in J # 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. # In[ ]: s, u, t = SR.var('s, u, t') ( parametric_plot3d([(2 + cos(u))*cos(t), (2 + cos(u))*sin(t), sin(u)], (u,-pi,pi), (t,-pi,pi)) + parametric_plot3d([(2 + cos(2*s))*cos(3*s), (2 + cos(2*s))*sin(3*s), sin(2*s)], (s,0,6*pi), color='red') ) # ## Exercice 12.5 # In[12]: A. = PolynomialRing(QQ, order='lex') f = x^4*y^2 + x^2*y^4 - x^2*y^2 I = A.ideal(f.derivative(x), f.derivative(y)) I # On voit clairement que l'idéal a dimension 1, et que donc le lieu critique est infini. # In[13]: I.groebner_basis() # In[14]: I = A.ideal(f - t, f.derivative(x), f.derivative(y)) I # 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. # In[15]: I.groebner_basis() # In[16]: I.dimension() # 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$. # In[17]: I = A.ideal(f, f.derivative(x), f.derivative(y)) I.groebner_basis() # 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. # In[18]: I = A.ideal(f*t - 1, f.derivative(x), f.derivative(y)) I.groebner_basis() # 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}$) # In[19]: I.variety() # In[20]: k. = QuadraticField(1/3) k # In[21]: I.variety(k) # In[22]: f(x=a, y=a), f.derivative(x)(x=a, y=a), f.derivative(y)(x=a, y=a) # ## Exercice 14.3 # In[23]: A. = QQ[] I = A.ideal(x^3*y, x*y^2) # In[24]: I.groebner_basis() # On affiche tous les monomes, de degrés jusqu'à 5 en $x$ ou $y$, qui **n'appartiennent pas** à $I$. # # Pour aider la lecture, on ordonne la liste (l'ordre par défaut est *degrevlex*, ce qui nous arrange bien) # In[25]: sorted([m for m in monomials([x,y], [6,6]) if m not in I ]) # On compte les monômes par **degré total**, et on lit bien les premières valeures de la fonction de Hilbert: # ``` # H(1) = 1, # H(2) = 3, # H(3) = 6, # H(4) = 9, # H(5) = 11 # H(6) = 13 # ``` # 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. # In[26]: I.dimension() # 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: # In[27]: I.hilbert_polynomial() # ## Exercice 14.4 # In[28]: A. = QQ[] I = A.ideal(x^3*y*z^5, x*y^3*z^2) # In[29]: sorted([m for m in monomials([x,y,z], [3,3,3]) if m not in I]) # Il y a ici trop de monomes pour compter à la main, il va falloir automatiser. # In[30]: HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in I]) # In[31]: for i in range(1,15): print("%d --> %d" % (i, HF(i))) # 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 # In[32]: B. = QQ[] # In[33]: B.lagrange_polynomial([(11, 247), (12, 299), (13, 355), (14, 415)]) # L'idéal est de dimension 2, comme attendu # In[34]: I.dimension() # ## Exercice 14.7 # # Il est important ici d'utiliser un ordre gradué (par ex., degrevlex) pour calculer la base de Gröbner # In[35]: A. = QQ[] I = A.ideal([x*z, x*y - 1]) # In[36]: G = I.groebner_basis() G # On construit l'idéal monomial de $I$ # In[37]: M = A.ideal([p.lm() for p in G]) M # Et on évalue la fonction d'Hilbert # In[38]: HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in M]) # In[39]: for i in range(1,8): print("%d --> %d" % (i, HF(i))) # 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. # # 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. # In[40]: I.hilbert_polynomial() # In[41]: I.dimension() == M.dimension() == 1 # ### 2) # In[42]: A. = QQ[] I = A.ideal(z*w-y^2, x*y-z^3) # In[43]: M = A.ideal([p.lm() for p in I.groebner_basis()]) M # 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. # In[44]: I.dimension() == M.dimension() == 2