Об алгоритме факторизации полиномов многих переменных

УДК 519.688

ОБ АЛГОРИТМЕ ФАКТОРИЗАЦИИ ПОЛИНОМОВ МНОГИХ

ПЕРЕМЕННЫХ

© Д. С. Ивашов

Ключевые слова: факторизация полиномов, алгоритм освобождения от квадратов, система компьютерной алгебры МаШраг.

Предлагается последовательный алгоритм факторизации полиномов многих переменных, который входит в состав библиотеки алгоритмов системы компьютерной алгебры МаіЬраг.

1 Введение

Задача факторизации полиномов возникает во многих областях символьных вычислений. Исследования в области факторизации в основном сосредоточены над разложением полиномов на множители над поле(м целых и рациональных чисел. Разложение на множители играет важную роль в качестве подзадачи для многих других проблем, включая упрощение, символьные интеграции и решения полиномиальных уравнений. Полиномиальные разложения необходимы в таких областях, как алгебраическая теория кодирования, криптография, теория чисел.

До конца шестидесятых годов прошлого века факторизацию полиномов было принято считать «трудной» задачей, потому что не было быстрых алгоритмов для решения этой проблемы. Кроме того, были не ясны параллели между факторизацией полиномов и факторизацией целых чисел, что обе эти проблемы могут быть решены за полиномиальное время. В 1969 году Берлекэмп предложил первый алгоритм для факторизации полиномов над конечными полями. Время, требуемое для выполнения предложенного алгоритма, определялось как полиномиальная функция.

В настоящее время получены новые более быстрые алгоритмы факторизации полиномов. Марк Ван Хойя, основываясь на работах Калтофена и Шоупа, предложил систему оценок, следуя которой выбирается определенная стратегия факторизации полиномов. Сейчас появляются различные модификации известных алгоритмов, позволяющие ускорить процесс разложения на множители.

Настоящая работа продолжает исследования по факторизации полиномов многих переменных и предлагает программную реализацию алгоритмов факторизации в системе компьютерной алгебры Mathpar.

В параграфе 2 описан алгоритм факторизации полиномов многих переменных и приведена программная реализация алгоритма.

В параграфе 3 описан алгоритм выделения множителей, имеющих различные наборы переменных. Приведена программная реализация и найдены оценки стоимости этого алгоритма.

В параграфе 4 приведен пример решения задачи факторизации полинома многих переменных.

В параграфе 5 приведен пример факторизации полинома многих переменных в системе Mathpar.

2 Алгоритм факторизации полиномов многих переменных

Рассмотрим алгоритм факторизации полиномов многих переменных над рациональными числами. Пусть F(x\,... ,хп) — полином от п переменных, который требуется разложить на неприводимые сомножители. Полином неприводим, если его нельзя представить в виде произведения полиномов с рациональными коэффициентами. Пусть F(xi,..., хп) примитивен, т.е. его коэффициенты — целые числа, наибольший общий делитель (НОД) которых равен 1. Если F не является примитивным, то разделим его на НОД коэффициентов.

Алгоритм факторизации полиномов многих переменных состоит из четырех этапов.

Этап I. Разложение полиномов на множители, имеющие различные наборы переменных.

Пусть F(xi,..., хп) — полином п переменных xi,, хп. У такого полинома может быть не более 2П сомножителей, которые имеют различные наборы переменных. При этом

сомножителей, имеющих Р различных переменных, может быть не более ^ ^ • Процесс

представления полинома в виде произведения таких сомножителей описан в параграфе 3.

771

В результате F= П hk  к=1

В системе компьютерной алгебры Mathpar имеется процедура toFactorsOfCoejfs(), реализующая данный алгоритм.

Этап II. Выделение сомножителей имеющих различную кратность.

Найдём множители, которые входят в полином в разных степенях:

з=i

где Ski ф Skj при i ф j. Множители дkj имеют такой же набор переменных как и полином hk- Процесс отделения таких сомножителей описан в [ 1] . В системе Mathpar имеется процедура toFactorsWithDiffExps(), реализующая данный алгоритм. При этом, если заимеет сомножители, то каждый из них входит в gkj в первой степени.

Этап III. Получение унитарного полинома.

f

Если старший коэффициент при старшей переменной равен 1, то это значительно об-легчет дальнейшие поиски сомножителей. Процесс получения унитарного полинома подробно рассмотрен в [1]. В системе Mathpar имеется процедура UnitaryPolynom(), реализующая данный алгоритм.

Этап IV. Выделение множителей кратности единица с одинаковым набором переменных.

После первых двух этапов мы получим полиномы gkj , которые не имеют кратных сомножителей и которые могут раскладываться только на взаимно простые множители.

Pkj

Для каждого из этих полиномов найдем множители в разложении дkj = П fn-j • На этом

¿=1

этапе найдем взаимно простые сомножители, используя алгоритм описанный в [ 1].

В системе Mathpar имеется процедура toFactorsFromDiffExps (), реализующая данный алгоритм.

В итоге получим

то тп Тк m Гк Pkj

f(Xi, ..., *„) = п h = ШЫ?)= П<П<П /<«)**') fc=l fc=l j=l fc=l j=1 ¿=1

В системе Mathpar имеется процедура factorizationInZ(), реализующая данный алгоритм.

В данном алгоритме используется функция length(a). Она возвращает количество элементов массива а.

Алгоритм

Algorithm factorizationlnZ

Input: / G /?, R = Z[xi,..., xn]

Output: result[ ] = fi, result_powers[ ] — Si a[ ] := toFactorsOf Сoef f s{f); for г = 1 to length (a) do {

6[г] := toF actor sW ithDi f f Exps(a[i])\

}

Comment: массив b — это объект, который состоит из двух массивов: b[i\.multin[ ] — массива множителей и b[i\.powers [ ] — массива их кратностей к := 1;

for г = 1 to length (b) do {

for j = 1 to length(b[i].multin) {

g := toF actor sFromDif f Exps(b[i].multin[j]) 4

for и = 0 to length(g) do{ result[k] := g[u];

result_powers[k\ b[i].powers[j]',

к := к + 1;

}

}

}

return result[ ], result_powers[ ];

3 Разложение полиномов на множители, имеющие различные наборы переменных

Пусть ^(хх,..., хп) — полином от п переменных х\,..., хп . У такого полинома может быть не более 2П сомножителей, которые имеют различные наборы переменных. При этом

сомножителей, имеющих р различных переменных из п, может быть не более

Процедура выделения этих сомножителей состоит в следующем.

Предварительно можно найти числовой сомножитель. Для этого находится НОД всех числовых коэффициентов полинома. Если НОД отличен от единицы, то поделим каждый числовой коэффициент полинома на НОД.

Затем отделяется сомножитель, не содержащий переменную х\. Для этого нужно записать полином .Р по степеням переменной XI, т.е. представить в виде:

где к — старшая степень переменной х\, входящей в полином F(xi,..., xn). Найдем НОД полиномиальных коэффициентов, т.е. НОД( /i(x2,..., х„),..., Д(х2,..., хп)). Этот НОД не содержит переменную XI И будет ЯВЛЯТЬСЯ сомножителем полинома F(x 1, ..., хп). После деления исходного полинома F(xi,...,xn) на этот НОД, получим второй сомножитель, который будет содержать переменную х\. Таким образом получим два сомножителя исходного полинома F{x\,..., хп), один из которых не содержит переменную Х\ .

Для каждого из получившихся полиномов будем продолжать этот процесс по переменным Х2, хз,..., xs. На этом этапе мы можем получить не более 2s сомножителей. В каждом из этих полиномов попробуем выделить сомножитель, не содержащий переменную xs+i. Для этого в каждом из этих полиномов найдем НОД полиномиальных коэффициентов при неизвестной xs+i и разделим на него. Общее число полиномиальных сомножителей может при этом, в худшем случае, удвоиться.

Таким образом, завершив этот процесс на последней переменной хп, получим, в худшем случае, 2П сомножителей.

С помощью данного алгоритма мы выделим сомножители fi, имеющие различные наборы переменных, полинома /(хi,..., х„).

В данном алгоритме используются следующие функции.

Polynomial_GCD(f,i,R) возвращает полиномиальный НОД полинома / относительно г -ой переменной из кольца R.

isNotOne(f) возвращает true, если полином / отличен от единицы, иначе — false.

Рассмотрим алгоритм разложения полиномов на множители, имеющие различные наборы переменных.

к

Алгоритм

Algorithm toFactorsOfCoeffs (/, R) Input: / E R,R = Z[xi,..., xn]. Output: result[ ] = fi h — количество переменных

result[0]:=f;

п:=1;

number:=l;

for i := 0 to h do

for j := 0 to n do{ first:=Polinomial_GCD(result[ j ],i,R); if(isNotOne(first)) { rezult[number]:=divide(rezalt[ j ], first); rezult[j]:=first; number++;}

}

n:=number return result;

Определим количество операций данного алгоритма. Пусть G — операция вычисления НОД двух полиномов,

D — операция деления двух полиномов, п — количество переменных исходного полинома, т — количество мономов исходного полинома.

Для вычисления одного шага редукции требуется (т — 1)G + D операций. Тогда для того, чтобы разложить полином многих переменных на сомножители, имеющие разные наборы переменных, потребуется не более (2П — 2)((m — 1)G + D) операций.

4 Пример задачи факторизации полинома многих переменных

Постановка задачи.

Рассмотрим произведение полиномов F{x, у, z) = (х — у)(х + у)(х + 3у2)2(х — yz){xz + y)(y—z)2(y+2z2). После раскрытия всех скобок будет получен полином, который для своей записи на этой странице потребует 10 строчек. Требуется разложить его на множители и получить исходное выражение.

Покажем отдельные этапы решения и используемые процедуры.

1. Выделение сомножителей, имеющих различные наборы переменных. Выделим в полиноме F сомножители с различными наборами переменных. Для этого

применим процедуру toFactorsO f Coeff s(). В результате получим массив сомножителей полинома F:

h = —9у6 + 9х2у4 — 6ху4 + 6хУ — х2у2 + х4 ,

/2 = -xyz2 - у2z + x2z + ху,

/з = 2Z4 - 4yzz + 2y2z2 + yz2 - 2y2z + у3.

2. Выделение сомножителей, имеющих различную кратность.

В каждом из полиномов J\, /2, /з выделим сомножители, имеющие различные кратности. Для этого к /ъ/2,/з применим процедуру toF actor sW ithDi f f Exps(), реализующую данный алгоритм. Получим /и = — у2 + х2 кратности 1, f12 = х + 3у2 кратности 2,

/2 = -xyz2 - y2z 4- x2z + ху кратности 1,

/зд = У — z кратности 2,

/з,2 = У + 2z2 кратности 1.

3. Выделение сомножителей, имеющих кратность единица.

После первых двух этапов мы получили полиномы: /хд, /ii2, /2, /зд, /3,2 • Для каждого из этих полиномов найдем взаимно простые сомножители кратности 1 с помощью процедуры toFactorsFromDif fExpsQ. Получим следующие сомножители:

/1,1,1 =Х-у, /1,1,2 = X + у, /1,2 = X + 3у2, ¡2,1 = x-yz, /2,2 — xz + у, /зд = у — Z, /з,2 = У + 2z2.

Таким образом, полином F можно представить в виде: F(x, у, z) = /1 * /2 * /3 =

/1,1 * /1,2 * /2 * /3,1 * /з,2 = (/1,1,1 * /1,1,2)(/1,г)2(/2,1 * /2,2)(/зд)2(/3,2) = (х - у)(х + у)(х + Зу2)2(х - yz)(xz -I- у)(у - г)2(у + 2г2).

5 Факторизация полиномов многих переменных в системе Mathpar

Разработанные алгоритмы факторизации полиномов многих переменных над кольцом целых чисел применяются в системе компьютерной алгебры Mathpar [7], [8], [9].

Для того чтобы разложить полином многих переменных на множители в системе Mathpar необходимо:

1) задать пространство переменных (SPACE),

2) задать полином,

3) задать функцию факторизации (Factor).

Пространство переменных определяется типом числового множества и именами переменных. Пользователь может сменить пространство переменных, например, задав команду «SPACE=Z[x,y,z]».

Пример 1. Факторизовать полином / = — y4z2 -f x2y2z2 — 2xy3z + 2x3yz — x2y2 + x4 .

Ввод данных в системе Mathpar

SPA CE=Z[x, у, z];

f — —y4z2 + x2y2z2 — 2 xy3z + 2 x3yz — x2y2 + x4;

h-Factor(f);

print (h);

Система Mathpar выдаст ответ: (x + yz)2(x — y)(x + y).

ЛИТЕРАТУРА

1. Ivashov D.S. Factorization of polynomials of several variables // Tambov University Reports. Series: Natural and Technical Sciences. V. 16. Issue 1. 2011. P. 133-137.

2. Ivashov D.S. An algorithm of factorization of polynomials of several variables // Tambov University Reports. Series: Natural and Technical Sciences. V. 15. Issue 1. 2010. P. 331-334.

3. Shoup V. A new polynomial factorization algorithm and its implementation // Journal of Symbolic Computation V. 20. 1995. P. 363-397.

4. Shoup V., Kaltofen E. Subquadratic-time factoring of polynomials over finite fields // 27th Annual ACM Symposium on Theory of Computing 1995. P. 398-406.

5. Hoeij M.V. Factoring polynomials and the knapsack problem // Journal of Number Theory. V. 95. 2002. P. 167-189.

6. Kaltofen E. Polynomial factorization in comuter algebra // Springer-Verlag, 1982.

7. Malaschonok G.I. Project of Parallel Computer Algebra // Tambov University Reports. Series: Natural and Technical Sciences. V. 15. Issue 6. 2010. P. 1724-1729.

8. Малашонок Г.И. Компьютерная математика для вычислительной сети // Вестник Тамбовского университета. Сер.: Естественные и технические науки. Том 15. Вып. 1. 2010. С. 322-327.

9. Малашонок Г.И. О проекте параллельной компьютерной алгебры // Вестник Тамбовского университета. Сер. Естественные и технические науки. Том 14. Вып. 4. 2009. С. 744-748.

БЛАГОДАРНОСТИ: Работа выполнена при поддержке РФФИ (грант № 12-07-00755-а) и программы «Развитие потенциала высшей школы» (проект 2.1.1/10437).

Поступила в редакцию 20 февраля 2012 г.

AN ALGORITHM OF FACTORIZATION OF MULTIVARIATE

POLYNOMIALS

© Ivashov Dmitriy Sergeyevich

Tambov State University named after G.R. Derzhavin, Internatsionalnaya, 33, Tambov, 392000, Russia, Post-graduate Student of Mathematical Analysis Department, e-mail:

ivashovdmitry@gmail.com

Key words: factorization of polynomials, computer algebra, Mathpar computer algebra system.

We present and discuss a sequential algorithm for factorization of polynomial of several variables , which is a part of the library of Mathpar computer algebra system.