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
[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]
G[-1]
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}$$(G[-1] - 16*A^2).factor()
(-a + b - c) * (-a + b + c) * (a + b - c) * (a + b + c)
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
[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]
p = G[-1]
p
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:
s = SR.var('s')
cos(2*s).simplify_trig()
2*cos(s)^2 - 1
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)
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
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
.
p(x=X, y=Y, z=Z) in J
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.
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')
)
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
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.
I.groebner_basis()
[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]
I = A.ideal(f - t, f.derivative(x), f.derivative(y))
I
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.
I.groebner_basis()
[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]
I.dimension()
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$.
I = A.ideal(f, f.derivative(x), f.derivative(y))
I.groebner_basis()
[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.
I = A.ideal(f*t - 1, f.derivative(x), f.derivative(y))
I.groebner_basis()
[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}$)
I.variety()
[]
k.<a> = QuadraticField(1/3)
k
Number Field in a with defining polynomial x^2 - 1/3
I.variety(k)
[{y: -a, t: -27, x: -a}, {y: -a, t: -27, x: a}, {y: a, t: -27, x: -a}, {y: a, t: -27, x: a}]
f(x=a, y=a), f.derivative(x)(x=a, y=a), f.derivative(y)(x=a, y=a)
(-1/27, 0, 0)
A.<x,y> = QQ[]
I = A.ideal(x^3*y, x*y^2)
I.groebner_basis()
[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)
sorted([m for m in monomials([x,y], [6,6]) if m not in I ])
[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.
I.dimension()
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:
I.hilbert_polynomial()
2
A.<x,y,z> = QQ[]
I = A.ideal(x^3*y*z^5, x*y^3*z^2)
sorted([m for m in monomials([x,y,z], [3,3,3]) if m not in I])
[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.
HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in I])
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
B.<s> = QQ[]
B.lagrange_polynomial([(11, 247), (12, 299), (13, 355), (14, 415)])
2*s^2 + 6*s - 61
L'idéal est de dimension 2, comme attendu
I.dimension()
2
Il est important ici d'utiliser un ordre gradué (par ex., degrevlex) pour calculer la base de Gröbner
A.<x,y,z> = QQ[]
I = A.ideal([x*z, x*y - 1])
G = I.groebner_basis()
G
[x*y - 1, z]
On construit l'idéal monomial de $I$
M = A.ideal([p.lm() for p in G])
M
Ideal (x*y, z) of Multivariate Polynomial Ring in x, y, z over Rational Field
Et on évalue la fonction d'Hilbert
HF = lambda s: len([m for m in monomials([x,y,z], [s,s,s]) if m.degree() < s and m not in M])
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.
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.
I.dimension() == M.dimension() == 1
True
A.<x,y,z,w> = QQ[]
I = A.ideal(z*w-y^2, x*y-z^3)
M = A.ideal([p.lm() for p in I.groebner_basis()])
M
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.
I.dimension() == M.dimension() == 2
True