Фактор GCD, который возводится в степень - PullRequest
4 голосов
/ 02 января 2011

В основном используя Mathematica (v.7), я хочу привести выражение вроде этого

(x + x^2 + x^3)^4

до

x^4 (1 + x + x^2)^4

Что было бы лучшим способом вывести термин, подобный GCD, из выражения, возводимого в степень и имеющего факторизованную форму; затем поместите этот термин за скобки и сохраните значение экспоненты, до которого он был повышен. Нужно знать, что ценность повышается до силы, прежде чем ее убрать. Вот моя попытка.

In[28]:= example = (x + x^2 + x^3)^4

Out[28]= (x + x^2 + x^3)^4

In[37]:= gcdVar = PolynomialGCD[Sequence @@ Level[example, {2}]]

Out[37]= x

In[40]:= step1 = Map[Divide[#, gcdVar] &, example, {2}]

Out[40]= (1 + x + x^2)^4

In[55]:= step2 = Times[step1, Power[gcdVar, Last[Level[example, {1}]]]]

Out[55]= x^4 (1 + x + x^2)^4

Я смотрел на все различные функции, связанные с этой областью, как; Собирать, Фактор, Развернуть, Упростить, Решить. Я не думаю, что кто-либо из них может произвести вывод, который я хотел. Существует ли встроенный, более эффективный, масштабируемый и более короткий способ сделать это, возможно, с помощью сопоставления шаблонов и форм?

Ответы [ 2 ]

4 голосов
/ 03 января 2011

Factor @ Expand, кажется, делает то, что вы хотите для данного примера. Вам требуется более общее решение?

 Factor@Expand[(x + x^2 + x^3)^4]

    Out[8]= x^4 (1 + x + x^2)^4

(я использую Mathematica 7)

3 голосов
/ 02 января 2011

Это делает то, что вы делаете быстро и грязно, но в одной строке:

example /. Power_[Plus_[f__], k_] :> 
           (PolynomialGCD@f)^k Simplify@(Plus@f/PolynomialGCD@f)^k

Это не очень надежно, и вам лучше будет создать свой собственный маленький Модуль, который проверяет, есть ли на самом деле самый большой общий делитель.

РЕДАКТИРОВАТЬ: Вы можете добавить некоторые встроенные проверки, например, так:

example /. Power_[Plus_[f__], k_] /; !(PolynomialGCD@f === 1) :> 
           (PolynomialGCD@f)^k Simplify@(Plus@f/PolynomialGCD@f)^k
...