Как выполнить сложную замену переменных для многочлена (в Mathematica)

У меня есть целочисленный многочлен от четырех переменных (w, x, y и z), который, как я знаю, может быть записан как целочисленный многочлен от этих шести переменных:

  • a = w z
  • b = x y
  • c = w^3 + z^3
  • d = x + y
  • e = w^3 x + y z^3
  • f = w^3 y + x z^3

Как я могу использовать Mathematica (или, может быть, Java), чтобы легко сделать эту замену переменных?


person Tyson Williams    schedule 20.05.2011    source источник
comment
Тайсон Уильямс, добро пожаловать в StackOverflow.   -  person Mr.Wizard    schedule 21.05.2011
comment
@Mr.Wizard Спасибо. Мне особенно приятно, потому что я получил такой отличный ответ на свой вопрос.   -  person Tyson Williams    schedule 22.05.2011


Ответы (1)


Такое переписывание можно выполнить, сформировав базис Грёбнера из заменяющих полиномов относительно переменного порядка, который благоприятствует использованию a-f вместо w-z. Затем используйте PolynomialReduce в том же порядке, чтобы переписать полином.

Вот пример. Я начну с правил замены, чтобы построить полином так, чтобы мы знали ожидаемый результат.

reprules = {a -> w*z, b -> x*y, c -> (w^3 + z^3), 
 d -> (x + y), e -> (w^3*x + y*z^3), f -> (w^3*y + x*z^3)};

Теперь преобразуйте в полиномиальные отношения.

reppolys = Apply[Subtract, reprules, 1];

Здесь мы создаем пример.

poly = 
 a^2*b + 3*b^2*c^3 - 2*d*e*f + 11*b*f^2 - 5 a*d^2*e /. reprules // Expand

Out[11]= -2*w^6*x^2*y - 2*w^6*x*y^2 + 3*w^9*x^2*y^2 + 11*w^6*x*y^3 - 
  5*w^4*x^3*z - 10*w^4*x^2*y*z - 5*w^4*x*y^2*z + w^2*x*y*z^2 - 2*w^3*x^3*z^3 - 
  2*w^3*x^2*y*z^3 - 2*w^3*x*y^2*z^3 + 22*w^3*x^2*y^2*z^3 + 9*w^6*x^2*y^2*z^3 - 
  2*w^3*y^3*z^3 - 5*w*x^2*y*z^4 - 10*w*x*y^2*z^4 - 5*w*y^3*z^4 -
  2*x^2*y*z^6 + 11*x^3*y*z^6 - 2*x*y^2*z^6 + 9*w^3*x^2*y^2*z^6 + 3*x^2*y^2*z^9

Сформируйте упомянутый выше базис Гребнера.

gb = GroebnerBasis[reppolys, {w, x, y, z, a, b, c, d, e, f}];

Используйте его, чтобы уменьшить наши входные данные, чтобы восстановить ожидаемый результат.

PolynomialReduce[poly, 
  gb, {w, x, y, z, a, b, c, d, e, f}][[2]]

Out[12]= a^2*b + 3*b^2*c^3 - 5*a*d^2*e - 2*d*e*f + 11*b*f^2

---редактировать---

Комментарий спрашивает об описаниях баз Грёбнера. Для моего собственного взгляда на функциональность Mathematica есть старая статья TMJ. Можно найти в

http://library.wolfram.com/infocenter/Articles/2179/

Среди лучших книг, связанных с этой темой, есть текст серии UTM.

Идеалы, разновидности и алгоритмы Кокса, Лоттла и О'Ши.

«Введение в базы Грёбнера» Адамса и Лустаунау (AMS) также неплохо.

---конец редактирования---

Даниэль Лихтблау

person Daniel Lichtblau    schedule 20.05.2011
comment
@ Даниэль, я несколько раз пытался понять, что такое базис Гребнера, но пока безуспешно. Есть ли у вас ссылки на хорошие/понятные описания? Спасибо. - person rcollyer; 20.05.2011
comment
@Daniel Lichtblau Это выглядит великолепно, но не все примеры работают так же хорошо, как тот, который вы выбрали. Что, если poly = a b (a - b)^4? Ваше преобразование возвращает что-то гораздо более сложное, и Mathematica не может понять, совпадают ли исходный полигон и конечный результат (то есть, Reduce работает уже несколько минут, не возвращая ответа). - person Tyson Williams; 21.05.2011
comment
@ Тайсон Уильямс Может изменить порядок переменных на {w, x, y, z, c, d, e, f, a, b}. Но общего ответа нет в тех случаях, когда результат не будет уникальным. Возможно, вам потребуется уточнить, что вы хотите получить, например, многочлен с определенными переменными, предпочитаемыми другим, или с минимальной общей степенью, или, возможно, какой-то другой критерий. В зависимости от таких деталей может быть (или не быть) заказ на срок, который будет служить вашим целям. - person Daniel Lichtblau; 22.05.2011
comment
@Daniel Lichtblau Да, в моем приложении есть некоторая избыточность, которой нельзя избежать. В частности, e + f = c d. Поскольку я начинаю и заканчиваю целыми полиномами, использование CoefficientDomain -> Integers как в GroebnerBasis, так и в PolynomialReduce очень помогает (когда порядок переменных {w, x, y, z, a, b, c, d, e, f}), но не как так же, как изменить порядок, как вы предложили. Если я предпочитаю переменные (a, b, c, d, e, f) (и, конечно, я не хочу видеть ни одну из переменных w, x, y или z), в каком порядке я должен указывать переменные? {ш, х, у, г, е, е, г, в, б, а}? - person Tyson Williams; 22.05.2011
comment
Под предпочтением я предполагаю, что вы имеете в виду, что «а» наиболее благоприятна для появления, а «f» наименее благоприятна. В этом случае да, инвертируйте af в порядке следования переменных, так как последний в порядке является наиболее предпочтительным для появления в результате и т. д. Порядок означает предпочтение перезаписи выше, то есть ранее перечисленных, с точки зрения более поздних, поэтому это также объясняет, почему wz должны быть впереди, независимо от их относительного порядка друг относительно друга. Я также рассматривал этот параметр CoefficientDomain, но я не думаю, что он будет делать то, что вы хотите, по крайней мере, ненадежным способом. - person Daniel Lichtblau; 22.05.2011