как выглядит дискриминант многочлена a_0+a_1x+…+a_nx^n?
уже для n=4 ответ sage выглядит несколько устрашающе:
n = 4
R = PolynomialRing(QQ, 'a', n+1)
a = R.gens()
S.<x> = PolynomialRing(R)
f = sum(a[i]*x^i for i in range(n+1))
D = f.discriminant()
print(D)
a1^2*a2^2*a3^2 - 4*a0*a2^3*a3^2 - 4*a1^3*a3^3 + 18*a0*a1*a2*a3^3 - 27*a0^2*a3^4 - 4*a1^2*a2^3*a4 + 16*a0*a2^4*a4 + 18*a1^3*a2*a3*a4 - 80*a0*a1*a2^2*a3*a4 - 6*a0*a1^2*a3^2*a4 + 144*a0^2*a2*a3^2*a4 - 27*a1^4*a4^2 + 144*a0*a1^2*a2*a4^2 - 128*a0^2*a2^2*a4^2 - 192*a0^2*a1*a3*a4^2 + 256*a0^3*a4^3
но кое-что интересное можно увидеть, если этот многочлен нарисовать — а точнее нарисовать его многогранник Ньютона (для каждого входящего в дискриминант монома П a_i^{k_i} отмечаем точку с координатами (…,k_i,…) и берем выпуклую оболочку)
буквально как написано уже для n=4 будет что-то в 5-мерном пространстве, но это иллюзия: ∑ k_i = const и ∑ i k_i = const, то есть реально всё лежит в обычном 3-мерном пространстве
support = [m.exponents()[0] for m in D.monomials()]
M = matrix(QQ, n+1, n-1)
for i in range(n-1):
M[i,i], M[i+1,i], M[i+2,i] = 1, -2 ,1
def exponent_map(x):
v = vector(x) - vector([0]+[2]*(n - 1)+[0])
return tuple(M.solve_right(v))
projected_support_b = [exponent_map(x) for x in support]
poly_b = Polyhedron(vertices=projected_support_b)
poly_b.plot()
вот на картинке видно, что получается такой кубоид — и для любой степени, говорят, получается кубоид (соответствующей размерности)
на этом история не заканчивается — n! копий такого кубоида складываются в пермутаэдр; если брать сумму мономов, попавшие в одну грань кубоида, то получившийся многочлен хорошо раскладывается на множители… хотел бы это всё компьютерно увидеть
конспект первой лекции есть по ссылке mccme.ru/dubna/2025/notes/batyrev-notes.pdf
