## Exercice 10.7¶

In [1]:
R.<h,d,a,b,c,A> = 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

Out[1]:
[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]
In [2]:
G[-1]

Out[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

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()

Out[3]:
(-a + b - c) * (-a + b + c) * (a + b - c) * (a + b + c)

## Exercice 11.4¶

In [4]:
A.<cosu,sinu,cost,sint,x,y,z> = 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

Out[4]:
[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]
In [5]:
p = G[-1]
p

Out[5]:
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

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()

Out[7]:
2*cos(s)^2 - 1
In [8]:
for f in [sin, cos]:
for n in [2,3]:
print f(n*s), '=', f(n*s).simplify_trig()

sin(2*s) = 2*cos(s)*sin(s)
sin(3*s) = (4*cos(s)^2 - 1)*sin(s)
cos(2*s) = 2*cos(s)^2 - 1
cos(3*s) = 4*cos(s)^3 - 3*cos(s)

In [10]:
A.<coss,sins,cos2s,sin2s,cos3s,sin3s,X,Y,Z> = 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

Out[10]:
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

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

Out[11]:
True

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.<x,y,t> = 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

Out[12]:
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

On voit clairement que l'idéal a dimension 1, et que donc le lieu critique est infini.

In [13]:
I.groebner_basis()

Out[13]:
[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]
In [14]:
I = A.ideal(f - t, f.derivative(x), f.derivative(y))
I

Out[14]:
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

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()

Out[15]:
[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]
In [16]:
I.dimension()

Out[16]:
1

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()

Out[17]:
[x^4*y - x^2*y, x^2*y^2, x*y^4 - x*y^2]

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()

Out[18]:
[x^2 - 1/3, y^2 - 1/3, t + 27]

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()

Out[19]:
[]
In [20]:
k.<a> = QuadraticField(1/3)
k

Out[20]:
Number Field in a with defining polynomial x^2 - 1/3
In [21]:
I.variety(k)

Out[21]:
[{y: -a, t: -27, x: -a},
{y: -a, t: -27, x: a},
{y: a, t: -27, x: -a},
{y: a, t: -27, x: a}]
In [22]:
f(x=a, y=a), f.derivative(x)(x=a, y=a), f.derivative(y)(x=a, y=a)

Out[22]:
(-1/27, 0, 0)

## Exercice 14.3¶

In [23]:
A.<x,y> = QQ[]
I = A.ideal(x^3*y, x*y^2)

In [24]:
I.groebner_basis()

Out[24]:
[x^3*y, x*y^2]

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 ])

Out[25]:
[1, y, x, y^2, x*y, x^2, y^3, x^2*y, x^3, y^4, x^4, y^5, x^5]

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()

Out[26]:
1

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()

Out[27]:
2

## Exercice 14.4¶

In [28]:
A.<x,y,z> = 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])

Out[29]:
[1,
z,
y,
x,
z^2,
y*z,
x*z,
y^2,
x*y,
x^2,
y*z^2,
x*z^2,
y^2*z,
x*y*z,
x^2*z,
x*y^2,
x^2*y,
y^2*z^2,
x*y*z^2,
x^2*z^2,
x*y^2*z,
x^2*y*z,
x^2*y^2,
x*y^2*z^2,
x^2*y*z^2,
x^2*y^2*z,
x^2*y^2*z^2]

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)))

1 --> 1
2 --> 4
3 --> 10
4 --> 20
5 --> 35
6 --> 56
7 --> 83
8 --> 116
9 --> 155
10 --> 199
11 --> 247
12 --> 299
13 --> 355
14 --> 415


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.<s> = QQ[]

In [33]:
B.lagrange_polynomial([(11, 247), (12, 299), (13, 355), (14, 415)])

Out[33]:
2*s^2 + 6*s - 61

L'idéal est de dimension 2, comme attendu

In [34]:
I.dimension()

Out[34]:
2

## 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.<x,y,z> = QQ[]
I = A.ideal([x*z, x*y - 1])

In [36]:
G = I.groebner_basis()
G

Out[36]:
[x*y - 1, z]

On construit l'idéal monomial de $I$

In [37]:
M = A.ideal([p.lm() for p in G])
M

Out[37]:
Ideal (x*y, z) of Multivariate Polynomial Ring in x, y, z over Rational Field

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)))

1 --> 1
2 --> 3
3 --> 5
4 --> 7
5 --> 9
6 --> 11
7 --> 13


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()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-51a93ff31666> in <module>()
----> 1 I.hilbert_polynomial()

/local/SageMath-8.0/local/lib/python2.7/site-packages/sage/rings/polynomial/multi_polynomial_ideal.pyc in __call__(self, *args, **kwds)
294         if not R.base_ring().is_field():
295             raise ValueError("Coefficient ring must be a field for function '%s'."%(self.f.__name__))
--> 296         return self.f(self._instance, *args, **kwds)
297
298 require_field = RequireField

/local/SageMath-8.0/local/lib/python2.7/site-packages/sage/rings/polynomial/multi_polynomial_ideal.pyc in hilbert_polynomial(self)
2401         """
2402         if not self.is_homogeneous():
-> 2403             raise TypeError("Ideal must be homogeneous.")
2404
2405         import sage.libs.singular.function_factory

TypeError: Ideal must be homogeneous.
In [41]:
I.dimension() == M.dimension() == 1

Out[41]:
True

### 2)¶

In [42]:
A.<x,y,z,w> = 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

Out[43]:
Ideal (z^3, y^2) of Multivariate Polynomial Ring in x, y, z, w over Rational Field

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

Out[44]:
True