Univerzita Karlova v Praze Matematicko-fyzikální fakulta



Podobné dokumenty
1.5.7 Prvočísla a složená čísla

Metoda konjugovaných gradientů

a počtem sloupců druhé matice. Spočítejme součin A.B. Označme matici A.B = M, pro její prvky platí:

Cyklické kódy. Definujeme-li na F [x] n sčítání a násobení jako. a + b = π n (a + b) a b = π n (a b)

Polynomy. Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1.1 Teorie Zavedení polynomů Operace s polynomy...

Charakteristika tělesa

9 Stupně vrcholů, Věta Havla-Hakimiho

1 Gaussova kvadratura

Řetězové zlomky. již čtenář obeznámen. Důraz bude kladen na implementační stránku, protože ta je ve

Věta o dělení polynomů se zbytkem

1 Mnohočleny a algebraické rovnice

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Pomocný text. Polynomy

Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují

Geometrická zobrazení

Polynomy nad Z p Konstrukce faktorových okruhů modulo polynom. Alena Gollová, TIK Počítání modulo polynom 1/30

1 Linearní prostory nad komplexními čísly

MATEMATIKA II V PŘÍKLADECH

grupa těleso podgrupa konečné těleso polynomy komutativní generovaná prvkem, cyklická, řád prvku charakteristika tělesa

0.1 Úvod do lineární algebry

PRVOČÍSLA 1 Jan Malý UK v Praze a UJEP v Ústí n. L. Obsah

MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]

8 Kořeny cyklických kódů, BCH-kódy

1 Polynomiální interpolace

)(x 2 + 3x + 4),

4 všechny koeficienty jsou záporné, nedochází k žádné změně. Rovnice tedy záporné reálné kořeny nemá.

1 Mnohočleny a algebraické rovnice

[1] x (y z) = (x y) z... (asociativní zákon), x y = y x... (komutativní zákon).

Matice. a m1 a m2... a mn

f (k) (x 0 ) (x x 0 ) k, x (x 0 r, x 0 + r). k! f(x) = k=1 Řada se nazývá Taylorovou řadou funkce f v bodě x 0. Přehled některých Taylorových řad.

z = a bi. z + v = (a + bi) + (c + di) = (a + c) + (b + d)i. z v = (a + bi) (c + di) = (a c) + (b d)i. z v = (a + bi) (c + di) = (ac bd) + (bc + ad)i.

Greenova funkce pro dvoubodové okrajové úlohy pro obyčejné diferenciální rovnice

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Úlohy krajského kola kategorie A

Rozlišujeme dva základní typy šifrování a to symetrické a asymetrické. Symetrické

Učební texty k státní bakalářské zkoušce Matematika Algebra. študenti MFF 15. augusta 2008

0.1 Úvod do lineární algebry

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

Generující kořeny cyklických kódů. Generující kořeny. Alena Gollová, TIK Generující kořeny 1/30

7.3.9 Směrnicový tvar rovnice přímky

7.3.9 Směrnicový tvar rovnice přímky

BCH kódy. Alena Gollová, TIK BCH kódy 1/27

Obsah. Euler-Fermatova věta. Reziduální aritmetika. 3. a 4. přednáška z kryptografie

4 Počítání modulo polynom

Matice lineárních zobrazení

Kongruence na množině celých čísel

Buckinghamův Π-teorém (viz Barenblatt, Scaling, 2003)

Lineární algebra : Báze a dimenze

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

Příklady: - počet členů dané domácnosti - počet zákazníků ve frontě - počet pokusů do padnutí čísla šest - životnost televizoru - věk člověka

Zavedení a vlastnosti reálných čísel

2. Určete jádro KerL zobrazení L, tj. nalezněte alespoň jednu jeho bázi a určete jeho dimenzi.

5. Lokální, vázané a globální extrémy

Matematická analýza pro informatiky I. Limita funkce

Algebraické struktury s jednou binární operací

3. Mocninné a Taylorovy řady

Testování prvočíselnosti

Lineární algebra : Polynomy

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

ALGEBRA. 1. Pomocí Eukleidova algoritmu najděte největší společný dělitel čísel a a b. a) a = 204, b = 54, b) a = , b =

Lineární algebra : Násobení matic a inverzní matice

(iv) D - vybíráme 2 koule a ty mají různou barvu.

Binomická věta

Kongruence. 1. kapitola. Opakování základních pojmů o dělitelnosti

Uspořádanou n-tici reálných čísel nazveme aritmetický vektor (vektor), ā = (a 1, a 2,..., a n ). Čísla a 1, a 2,..., a n se nazývají složky vektoru

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Lineární algebra : Polynomy

Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru

7B. Výpočet limit L Hospitalovo pravidlo

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

1 Řešení soustav lineárních rovnic

Učební texty k státní bakalářské zkoušce Matematika Vlastní čísla a vlastní hodnoty. študenti MFF 15. augusta 2008

PŘEDNÁŠKA 2 POSLOUPNOSTI

Jak funguje asymetrické šifrování?

Lineární algebra : Lineární prostor

Operace s maticemi. 19. února 2018

Pravděpodobnost a statistika

Lineární algebra : Násobení matic a inverzní matice

Příklad. Řešte v : takže rovnice v zadání má v tomto případě jedno řešení. Pro má rovnice tvar

Lingebraické kapitolky - Počítání s maticemi

1 Seznamová barevnost úplných bipartitních

Nejdřív spočítáme jeden příklad na variaci konstant pro lineární diferenciální rovnici 2. řádu s kostantními koeficienty. y + y = 4 sin t.

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

maticeteorie 1. Matice A je typu 2 4, matice B je typu 4 3. Jakých rozměrů musí být matice X, aby se dala provést

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

19. Druhý rozklad lineární transformace

V této sekci zobecníme vnější kalkulus z kapitoly 4 operaci vnějšího. se sice na zde zavedené operace budeme odvolávat, vždy ale jen jako

příkladů do cvičení. V textu se objeví i pár detailů, které jsem nestihl (na které jsem zapomněl) a(b u) = (ab) u, u + ( u) = 0 = ( u) + u.

3 Lineární kombinace vektorů. Lineární závislost a nezávislost

Řešení. Hledaná dimenze je (podle definice) rovna hodnosti matice. a a 2 2 1

FREDHOLMOVA ALTERNATIVA

Matematika B101MA1, B101MA2

Skalární součin je nástroj, jak měřit velikost vektorů a úhly mezi vektory v reálných a komplexních vektorových prostorech.

VEKTORY. Obrázek 1: Jediný vektor. Souřadnice vektoru jsou jeho průměty do souřadných os x a y u dvojrozměrného vektoru, AB = B A

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n

Motivace. Náhodný pokus, náhodný n jev. pravděpodobnost. podobnostní charakteristiky diagnostických testů, Bayesův vzorec. Prof.RND. RND.

[1] Definice 1: Polynom je komplexní funkce p : C C, pro kterou. pro všechna x C. Čísla a 0, a 1,..., a n nazýváme koeficienty polynomu.

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Úlohy domácí části I. kola kategorie C

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Transkript:

Univerzita Karlova v Praze Matematico-fyziální faulta Milan Straa! #"$%'&)(*,+.-0/,1324/564,/&879/:01; <=8+#&8>?- Katedra algebry Vedoucí baalářsé práce: Mgr. Jan Žemliča, Ph.D. Studijní program: informatia, obecná informatia 2006

Rád bych poděoval vedoucímu své práce Mgr. Janu Žemličovi, Ph.D., za odborné vedení během mé práce a taé za svělé přednášy o algebře, teré mě tomuto tématu přivedly. Taé bych velmi rád poděoval Janě Kravalové a Petrovi Sušilovi za oretury textu a Mgr. Martinu Marešovi ja za oretury ta za podnětné připomíny implementaci programu. V neposlední řadě bych chtěl poděovat svým rodičům, bez jejichž ochoty a trpělivosti bych nemohl tuto práci doončit. Prohlašuji, že jsem svou baalářsou práci napsal samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce a s jejím zveřejňováním. V Praze dne 29. 5. 2006 Milan Straa 2

@BADCFEHG 1. Úvod.............................................................................5 Značení..................................................................... 6 Formulace problému.........................................................6 2. Záladní algoritmy............................................................. 7 Bezčtvercová fatorizace.................................................... 8 Berleampův algoritmus................................................... 12 Různostupňová fatorizace................................................. 15 Stejnostupňová fatorizace................................................. 16 3. Subvadraticý algoritmus................................................... 19 Bezčtvercová fatorizace................................................... 22 Různostupňová fatorizace................................................. 25 Stejnostupňová fatorizace................................................. 27 Kompletní algoritmus fatorizace...........................................31 4. Vlastní implementace......................................................... 32 5. Použitá literatura............................................................. 37 3

Název práce: Fatorizace polynomů nad onečnými tělesy Autor: Milan Straa Katedra (ústav): Katedra algebry Vedoucí baalářsé práce: Mgr. Jan Žemliča, Ph.D. E-mail vedoucího: Jan.Zemlica@mff.cuni.cz Abstrat: Cílem práce je prozoumat problém rozladu polynomu nad onečným tělesem na součin ireducibilních polynomů. Popsáním něolia algoritmů hledajících tento rozlad se uáže, že tento problém je vždy řešitelný v polynomiálním čase vzhledem e stupni polynomu a počtu prvů onečného tělesa. U jednoho z algoritmů je popsána implementace s velmi dobrou asymptoticou časovou složitostí I (n 1.815 log q), de n je stupeň rozládaného polynomu nad tělesem s q prvy. Program používající jednodušší, ale praticy rychlejší variantu tohoto algoritmu je součástí práce. Klíčová slova: fatorizace, onečná tělesa, polynomy, algoritmus Title: Factoring polynomials over finite fields Author: Milan Straa Department: Department of Algebra Supervisor: Mgr. Jan Žemliča, Ph.D. Supervisor s e-mail address: Jan.Zemlica@mff.cuni.cz Abstract: The goal of this wor is to present the problem of the decomposition of a polynomial over a finite field into a product of irreducible polynomials. By describing algorithms solving this problem, we show that the decomposition can always be found in polynomial time in both the degree of the polynomial and the number of elements of the underlying finite field. One algorithm is studied in detail and an implementation with good asymptotic time complexity I (n 1.815 log q) is described, where n is the degree of the polynomial over the field with q elements. A program using easier, but practically faster version of this algorithm is a part of this wor. Keywords: factorization, finite fields, polynomials, algorithm 4

JHKDLNMPORQ Prvočísla zaujímají mezi přirozenými čísly význačné postavení. Jednou z jejich nejdůležitější vlastností je to, že aždé přirozené číslo můžeme jednoznačně zapsat jao součin mocnin prvočísel. Tento tazvaný prvočíselný rozlad má navíc tu zajímavou vlastnost, že ho zatím nido neumí najít v polynomiálním čase vzhledem délce zápisu daného čísla, taže se stal záladem pro asymetricou šifru RSA. Přitom otestovat, zda je dané číslo prvočíslem, v polynomiálním čase lze (viz [1]). Podobnou analogii s prvočísly můžeme nalézt taé u polynomů. Něteré polynomy jsou podobně jao prvočísla už dále nerozložitelné a ostatní můžeme jednoznačně zapsat jao součin taových nerozložitelných polynomů. Problémy testování nerozložitelnosti a hledání rozladu polynomů mají ale trochu odlišné vlastnosti než jejich protějšy týající se prvočísel. Přesto jsou velmi zajímavé a právě pro jejich podobnosti a nepodobnosti se známými prvočíselnými úlohami jsem se rozhodl jimi zabývat. V této práci se věnuji hlavně hledání rozladu polynomů nad onečnými tělesy na součin polynomů nerozložitelných. Vzhledem tomu, že tento rozlad lze efetivně nalézt v polynomiálním čase, můžeme algoritmy na jeho nalezení použít i pro testování rozložitelnosti. Nezabýval jsem se ovšem tím, zda pro samotné testování rozložitelnosti neexistují efetivnější algoritmy. V následující apitole popíšu jeden deterministicý a jeden pravděpodobnostní algoritmus pro hledání rozladu polynomů nad onečnými tělesy a doážu jejich funčnost. Nebudu se ovšem moc snažit, aby byly tyto algoritmy rychlé, bude stačit jejich polynomialita. V další apitole se zaměřím jenom na popisovaný pravděpodobnostní algoritmus a navrhnu variantu, terá funguje rychleji než v vadraticém čase vzhledem e stupni zadaného polynomu, přesněji v čase I (n 1.815 log q), de n je stupeň zadaného polynomu nad onečným tělesem o q prvcích. Součástí této práce je i implementace jednodušší, ale praticy rychlejší varianty podrobně popisovaného algoritmu. Její tvorbu a vlastnosti popíšu v apitole poslední. Při studiu učebnic a článů pro tuto práci jsem byl převapen zvláštními vlastnostmi vědecých článů a odborných textů na Internetu. Jedna jsem nedoázal najít v eletronicé podobě popisy složitějších algoritmů, teré byly v textech poládány za všeobecně známé. Nyní mám na mysli napřílad násobení polynomů nad onečnými tělesy pomocí FFT, pseudoinverze polynomů, Eulidův algoritmus pro polynomy pracující rychleji než v vadraticém čase a jiné. Jediný zdroj, terý jsem naonec nalezl, byly papírové učebnice algebry (napřílad [5] a [7]). Taé mě převapilo, že v něolia případech byly různé speciální případy či důazy ponechány na čtenáři, přestože mi nepřišly nija jednoduché. Jednalo se napřílad o rychlou bezčtvercovou fatorizaci v případě nenulové charateristiy, otázu toho, zda v Berleampově algoritmu jedna báze úplně fatorizuje daný polynom, či důaz správnosti rychlé varianty stejnostupňové fatorizace. S pomocí učebnic a univerzitních přednáše se mi vša všechny tyto problémy povedlo vyřešit. 5

STVUXWZY?TV[ Konečné těleso o q prvcích budeme značit \ q. Polynomem nad onečným tělesem myslíme posloupnost (a 0, a 1,..., a n,...) oeficientů z tělesa taovou, že jenom onečně jejích prvů má nenulovou hodnotu. Symbolicy zapisujeme polynom jao ] i 0 a ix i. Stupeň polynomu f, deg f, je největší index i taový, že a i je nenulový. Poud jsou všechny oeficienty polynomu rovny nule, jeho stupeň definujme jao nulu, ačoliv se častěji používá stupeň minus jedna nebo minus neonečno. My použijeme stupeň nula, aby polynomy stupně nula byly právě všechny prvy tělesa, teré používáme. Poud definujeme nad polynomy operace plus a minus jao ] i 0 a ix i ^ ] i 0 b ix i = ] i 0 (a i ^ b i )x i a operaci rát ta, že ] i 0 a ix i _ ] i 0 b ix i = ] i 0 ] i =0 (a _ b i )x i, tvoří polynomy nad onečným tělesem T oruh T [x], přičemž nulový prve je polynom ] i 0 0xi a jednotový prve je polynom 1x 0 + ] i 1 0xi. Polynom f dělí polynom g, f ` g, poud g = f _ h pro nějaý polynom h. Všimněme si, že poud f ` g a t je nenulový prve tělesa, taé t _ f ` g, protože t je určitě invertibilní. To nás přivádí následující definici: Nenulový polynom f nazveme monicý, poud je jeho oeficient a deg f jedničový prve tělesa. Největším společným dělitelem polynomů f a g, NSD(f, g), nazveme aždý polynom c, terý dělí f i g, a žádný polynom stupně většího než c už nedělí f a g zároveň. Vzhledem tomu, že jsme v definici použili dělitelnost, je největší společný dělitel přenásobený nenulovým prvem tělesa taé největším společným dělitelem. Poud bychom chtěli, aby byl největší společný dělitel jednoznačný, můžeme vzít ze všech největších společných dělitelů ten monicý. V následujícím textu budeme NSD(f, g) používat jao označení jediného monicého největšího společného dělitele. V něterých místech textu je výhodné dívat se na polynom ] n 1 a ix i nad tělesem \ q jao na n-složový vetor (a 0,..., a n 1 ) nad tělesem \ q. Protože jsou si oba tyto pohledy velmi blízé, budeme je v textu bez zvláštního upozornění zaměňovat. Poud máme polynom f z oruhu \ q[x], můžeme jím tento oruh fatorizovat. Tuto fatorizaci budeme značit jao \ q[x]/f a myslíme jí fatorizaci oruhu podle ongruence, terá odpovídá hlavnímu ideálu určenému polynomem f. Pozor na to, že tento pojem fatorizace oruhu nemá nic společného s popisovanou fatorizací polynomů. Ostatní použité značení je ve shodě s běžně používaným značením a je možné ho nalézt napřílad v nize [5] či [7]. acbxdfedgvh UXiZYj dlbnmfhpoqedg Polynom nazveme ireducibilní, poud ho nemůžeme zapsat jao součin dvou netriviálních polynomů. Přesněji řečeno, poud ho zapíšeme jao součin dvou libovolných polynomů, stupeň jednoho z nich musí být nula. Můžeme taé říci, že polynom f je ireducibilní, poud ho nedělí žádný polynom, jehož stupeň by byl větší než nula a menší než deg f. Poud polynom ireducibilní není, jedná se o polynom složený a aždý polynom menšího stupně, terý ho dělí, je jeho dělitel neboli fator. Fatorizací polynomu myslíme jeho rozlad na součin ireducibilních polynomů. Tento rozlad vždy existuje a poud jsou všechny fatory monicé, je až na pořadí jednoznačný. V textu budeme fatorizací značit nejenom rozlad na součin ireducibilních polynomů, ale taé obecný rozlad na součin polynomů daných vlastností. Je dobré si uvědomit, že i taový obecný rozlad vždy existuje (stačí sdružit ireducibilní fatory původního polynomu do supin stejných vlastností) a poud můžeme u všech fatorů chtěnou vlastnost jednoznačně určit, je tento obecný rozlad taé jednoznačný až na pořadí. Poud budeme fatorizací mínit výslovně rozlad na součin ireducibilních polynomů, můžeme ji nazvat úplnou fatorizací. Cílem algoritmů fatorizace je tedy pro zadaný polynom f nalézt jeho (jednoznačný) rozlad na součin monicých ireducibilních polynomů. 6

rrktstu<vxw E Qyz E w {HOH}~ ƒ V celém textu budeme předpoládat znalost toho, ja se provádí záladní aritmeticé operace nad \ q a \ q[x]. Taé použijeme něoli záladních vět týajících se onečných těles, teré nebudeme doazovat. Zájemci mohou najít jejich důazy v [5] nebo [7]. Jedná se především o tato tvrzení: Tvrzení 2.1: Mějme těleso T, vzájemně nesoudělné polynomy m 1,..., m z oruhu T [x] a položme m = m 1 _#_#_ m. Potom je zobrazení ϕ : T [x]/m definované jao ϕ(a) = (a mod m 1,..., a mod m ) isomorfismus oruhů. Toto tvrzení je známé jao Čínsá věta o zbytcích. Tvrzení 2.2: Buď m prve \ q[x]. Pa \ q[x]/m je těleso ˆ T [x]/m 1... T [x]/m m je ireducibilní. Tvrzení 2.3: V oruhu polynomů nad \ q platí x q x = Š s F q (x s). Tvrzení 2.4: Polynom x qd x nad \ q je součin všech monicých ireducibilních polynomů, jejichž stupeň dělí d. Tvrzení 2.5: Multipliativní grupa nenulových prvů onečného tělesa je cylicá. Cílem této apitoly je popsat dva záladní algoritmy fatorizace. Ve sutečnosti popíšeme čtyři částečné fatorizace, teré se dají pospojovat do dvou odlišných algoritmů úplné fatorizace podle následujícího vzoru: Berleampova fatorizace Bezčtvercová fatorizace Různostupňová fatorizace Stejnostupňová fatorizace Graf 2.6: Závislosti částečných fatorizací Nyní začneme popisovat jednotlivé částečné fatorizace. 7

d i b HY?ŒZWŽ Y UX ' bxdl ŒZUXiZY O polynomu f řeneme, že je bez čtverců, poud neexistuje žádný polynom g stupně alespoň jedna taový, že g 2 dělí f. Cílem bezčtvercové fatorizace je zadaný polynom f rozložit do tvaru f = i=1 ta, aby všechny polynomy f i byly bez čtverců a aždé dva f i a f j byly nesoudělné. Bezčtvercová fatorizace je samozřejmě slabší než fatorizace jao taová, jednotlivé polynomy f i mohou být ještě složené. Nicméně o nich víme, že nemají opaující se dělitele, což zjednoduší naše algoritmy fatorizace. Než popíšeme algoritmus bezčtvercové fatorizace, připomeňme si, co je to derivace n polynomu. Máme-li f polynom stupně n, f = ] a ix i, jeho derivace f je definována jao Navíc platí, že (1) (f + g) = f + g, (2) (f _ g) = f _ g + f _ g, (3) (f n ) = n _ f n 1 _ f. f = n 1 f i i (i + 1) _ a i+1 x i. Nejdříve si předvedeme užitečnou charaterizaci bezčtvercových polynomů. Tvrzení 2.7: Polynom f je bez čtverců ˆ NSD(f, f ) = 1. Důaz: Nejprve předpoládejme, že polynom f není bez čtverců. V tom případě ho můžeme zapsat jao f = g 2 h, přičemž stupeň g je alespoň jedna. Rozepišme si f = 2gg h + g 2 h = g(2g h + gh ). Pa ale g ` f a tedy g ` NSD(f, f ). Stupeň NSD(f, f ) je proto alespoň jedna, taže NSD(f, f ) š= 1. Naopa předpoládejme, že NSD(f, f ) š= 1, a označme g = NSD(f, f ). Stupeň g musí být alespoň jedna. Vezměme ireducibilní rozlad (fatorizaci) polynomu g a označme h libovolný ireducibilní polynom stupně alespoň jedna, terý dělí g. Pa platí, že f = ha a f = hb. Uvažujme nyní hb = f = (ha) = h a + ha, z čehož plyne, že h ` h a. Protože je h ireducibilní a stupeň h je menší než stupeň h, musí platit, že h` a. Tedy a = hâ, f = hhâ a polynom f ta není bez čtverců, protože ho dělí h 2. Nyní mějme polynom f s bezčtvercovým rozladem f = Š i=1 f i i a předpoládejme, že jsme nad tělesem charateristiy nula. Derivace polynomu f je Označme f = i=1 Poud nyní f a c 1 vydělíme, dostaneme f 1 _#_#_ f _ i 1 i 1 i _ f _ i i 1 f _ i f _#_#_ i+1 i+1 f. c 1 = NSD(f, f ) = g 1 = f/c 1 = i=1 i=2 f i. f i 1 i. 8

Nyní stačí položit a vidíme, že platí h 1 = NSD(c 1, g 1 ) = f 1 = g 1 /h 1. Poud bychom chtěli dále zísat f 2, můžeme apliovat stejný postup na c 1 = Š i=2 f i i 1 místo na f, a ta poračovat ve výpočtu všech dalších f i. Poud si ovšem uvědomíme, že c 1 = Š i=2 f i i 1, h 1 = Š i=2 f i a že pro výpočet f 2 potřebujeme polynomy c 2 = Š i=3 f i i 2 a g 2 = Š i=2 f i, vidíme, že doážeme spočítat c 2 a g 2 jednodušeji: c 2 = c 1 /h 1 g 2 = h 1 Nyní už můžeme vytvořit jednoduchý iterativní algoritmus bezčtvercové fatorizace pro tělesa charateristiy nula. procedure BezčtvercováF(f) : spočte bezčtvercový rozlad polynomu f nad tělesem charateristiy 0 if deg f = 0 then return f c NSD(f, f ); g f/c; i 0 while deg g > 0 do i i + 1 h NSD(c, g); f i g/h g h; c c/h return (f 1,..., f i ) Algoritmus 2.8: Bezčtvercová fatorizace pro tělesa charateristiy 0 Tělesa charateristiy nula jsme sice vyřešili, ale všechna onečná tělesa mají charateristiu nenulovou. Předpoládejme odteď, že máme těleso s prvočíselnou charateristiou p. Právě popsaný algoritmus bezčtvercové fatorizace nebude nyní bohužel správně fungovat. Problém je v tom, že œ x tp = tp _ x tp 1 = 0 _ t _ x tp 1 = 0. Zusme vysledovat, co přesně právě popsaný algoritmus vypočte, dyž ho použijeme na těleso charateristiy p. Mějme polynom f s bezčtvercovým rozladem Š i=1 f i i. Označme si ty fatory, teré umocňujeme na nějaý násobe p, jao F j. Polynom f můžeme tedy zapsat jao Š i tp f _ i i Š j=tp F j j. Nyní budeme postupovat podle algoritmu a dostaneme, že = ž f = ž i tp f i iÿ i tp _ f i i _ j=tp j=tp F j j Ÿ F j j + i tp = ž i tp f i i _ 0 = f i iÿ _ i tp j=tp i=2 f i F j j + i tp f 1 _#_#_ i _ f i 1 i f i i _ ž j=tp F j j Ÿ _ f i _#_#_ f _ = j=tp F j j. Dále tedy c 1 = NSD(f, f ) = i tp f i 1 i _ i=tp F j j, 9

g 1 = f/c 1 = h 1 = NSD(c 1, g 1 ) = i tp f 1 = g 1 /h 1. f i, i tp,i 2 Zatím všecho funguje. Když budeme poračovat dál, dostaneme c 2 = c 1 /h 1 = g 2 = h 1 = i tp,i 2 f i 1 i i tp,i 2 _ f i, i=tp f i, F j j, a obecně c j = c j 1 /h j 1 = g j = h j 1 = i tp,i j f i 1 i i tp,i j f i. _ i=tp F j j, Algoritmus bude tím pádem fungovat jenom částečně určí všechny fatory bezčtvercového rozladu, jejichž mocnina není dělena charateristiou tělesa. Po sončení algoritmu se nám tedy může stát, že g = 1 a c = Š j=tp F j j š= 1. Uážeme, že v tomto případě musí být polynom c p-tá mocnina nějaého polynomu. Nejdříve si všimneme, že c = 0, protože mocniny všech fatorů F j jsou děleny charateristiou p. Polynom c si zapišme jao ] i a ix i. Jeho derivace je nulová, taže nenulové oeficienty mohou být jenom ty a i, pro teré je i násobe charateristiy tělesa, čili jenom oeficienty a jp. Polynom c lze tedy zapsat jao ] i a ipx ip. Nyní už stačí jenom jednoduchý výpočet c = i a ip x ip = ž i a ip x i Ÿ Polynom c je tedy mocninou nějaého polynomu, doonce víme, ja tento polynom zonstruovat. Označme ho c 1/p. Zbývá tedy vyřešit, ja zísat bezčtvercové fatory polynomu c. Protože je to p-tá mocnina polynomu c 1/p, můžeme použít reurzi stačí algoritmus spustit na polynom c1/p a mocninu všech vrácených fatorů pa vynásobit charateristiou p. Tím vzniá následující algoritmus. procedure BezčtvercováF(q = p m,f) : spočte bezčtvercový rozlad polynomu f nad \ q if deg f = 0 then return f c NSD(f, f ); g f/c; i 0 while deg g > 0 do i i + 1 h NSD(c, g); f i g/h g h; c c/h if deg c > 0 then (f p, f 2p,..., f tp ) BezčtvercováF(p m, c 1/p ) return (f 1,..., f max(i,tp) ) Algoritmus 2.9: Bezčtvercová fatorizace pro onečná tělesa p. 10

Tvrzení 2.9: Algoritmus pracuje správně a v polynomiálním čase vzhledem n. Důaz: Správnost algoritmu plyne z popisu. Co se týče polynomiality, jeden průchod while cylem spočítá NSD a dvarát vydělí polynomy stupně nejvýš n. Těchto průchodů může být nejvýš n, taže celý algoritmus romě reurzivního volání použije n + 1 NSD a 2n + 1 dělení polynomů, vše pro polynomy stupně nejvýš n. To je jistě jen polynomiálně mnoho operací nad tělesem \ q. Označme tento počet C(n). Co se týče reurzivního volání, důležité je si všimnout, že reurzivně voláme algoritmus na polynom, jehož stupeň je nejvýš n/p. Označme T (n) počet operací nad \ q pro doončení algoritmu pro polynom stupně n. Pa T (n) C(n) + T (n/p) C n p i C(n) n 1 p i _ C (n) = p p 1 _ C(n) p 2 2C(n). Taže reurzivní volání na složitosti nepřidá a složitost algoritmu odpovídá složitosti n výpočtů NSD a n dělení polynomů. 11

e HY dlh Y? XU j 8 U hp XbXdl edgv Nyní popíšeme deterministicý algoritmus pro fatorizaci bezčtvercového polynomu. Jedná se o jeden z prvních a nejznámějších algoritmů fatorizace, terý byl poprvé popsán v [2]. Mějme bezčtvercový polynom f stupně n nad \ q, terý chceme rozložit. Označme si V = \ q[x]/f, což je romě oruhu taé vetorový prostor nad \ q dimenze n. Položme W = v ª V : v q = v«. Poud ztotožníme prvy V s jejich reprezentanty stupně menšího než n, můžeme se na W dívat jao na množinu W = v ª \ q[x] : deg v < n v q = v (mod f). Tato množina, známá jao Berleampova podalgebra, hraje hlavní roli v celém algoritmu. Tvrzení 2.10: W je podprostor vetorového prostoru V. Důaz: Potřebujeme doázat uzavřenost na sčítání a salární násobení. Ať jsou tedy f, g ª W. Pa (f + g) q = f q + g q, protože ombinační čísla ( q i ) jsou pro všechna i ª* 1,..., q 1«dělitelná charateristiou tělesa. Máme tedy (f + g) q = f q + g q = f + g, což doazuje uzavřenost na sčítání. Nyní mějme f ª W a c ª \ q uzavřenost na salární násobení. a počítejme: (c _ f) q = c q _ f q = c _ f, což doazuje Předpoládejme teď na chvíli, že zadaný polynom f je ireducibilní. V je potom dle (2.2) taé těleso. Polynom y q y ª V [y] tedy může mít nejvýš q ořenů, přičemž aždý prve tělesa \ q dle tvrzení (2.3) ořenem je. Kořenů polynomu y p y je tím pádem právě q a množinu W můžeme ztotožnit s \ q, tj. s množinou všech polynomů z V stupně nula. Proto je v tomto případě dimenze W rovna jedné. Už víme, jaou má W dimenzi, dyž je zadané f ireducibilní. Ale co dyž není? Tvrzení 2.11: Buď bezčtvercový polynom f součin ireducibilních polynomů f 1 _#_#_ f. Pa má W dimenzi. Důaz: Protože je f bezčtvercový, jsou jeho fatory navzájem nesoudělné. Označíme si V i = \ p[x]/f i a W i = v ª V i : v q = v«. Podle Čínsé věty o zbytcích (2.1) je zobrazení ϕ : V V 1... V definované jao ϕ(a) = (a mod f 1,..., a mod f ) isomorfismus oruhů. Uvažujme zobrazení ψ definované jao ϕ, teré ale omezíme na W. Pa 1. ψ : W W 1... W, protože dyž v q = v (mod f), taé v q = v (mod f i ). 2. ψ je isomorfismus. Protože je ψ definováno pomocí ϕ, je to prostý homomorfismus. Musíme uázat, že je ψ na. Buď (w 1,..., w ) ª W 1... W. Protože ϕ je na, existuje v, že ϕ(v) = (w 1,..., w ). My chceme uázat, že v je prve W. Protože ϕ(v q ) = (w q 1,..., w q ) = (w 1,..., w ) = ϕ(v) a protože je ϕ isomorfismus, v q = v, a tedy v ª W. W je tím pádem isomorfní s W 1... W. Protože je ale aždý polynom f i ireducibilní, je aždé V i těleso, a tedy aždé W i je ztotožnitelné s \ q. Tedy W je vetorový prostor nad \ q dimenze. Teď tedy víme, ja pomocí W poznat počet ireducibilních fatorů zadaného polynomu. Co dybychom ale chtěli jednotlivé fatory taé najít? K tomu nám bude Tvrzení 2.12: Buď f monicý bezčtvercový polynom nad \ q a w libovolný polynom z W stupně alespoň 1. Pa platí f = s F q NSD(w s, f). 12

` Důaz: Předpoládejme, že f = f 1 _#_#_ f. Z tvrzení (2.3) víme, že v \ q[x] platí x q x = Š s F q (x s). Proto platí w q w = s F q (w s). Protože w q = w (mod f), pro aždé f i platí, že f i ` w q w = Š s F q (w s). Jeliož jsou všechny polynomy (w s) navzájem nesoudělné, existuje pro aždý fator f i právě jedno s i, že f i ` w s i. Proto ` NSD(w s i, f), a tím pádem f i=1 f i NSD(w s i, f) ` s F q NSD(w s, f). Naopa aždý člen NSD(w s, f) dělí f, taže máme, že s F q NSD(w s, f) ` f. Proto se polynomy f a Š s F q NSD(w s, f) navzájem dělí, z čehož plyne, že jeden je onstantní násobe druhého. Oba jsou ovšem monicé, proto musí být shodné. Toto tvrzení nám dává návod, ja lze polynom f fatorizovat. Vezmeme-li w ª W, aždý výraz (w s) má stupeň menší než f a fatorizace f = Š s F q NSD(w s, f) proto obsahuje alespoň dva netriviální fatory polynomu f. Ty pa můžeme dále fatorizovat použitím jiných vetorů z W. Zoušet všechny vetory ve W ale není dobrý nápad, protože jich je q. Jenomže W je vetorový prostor, a proto nám stačí použít lineárně nezávislých vetorů pro úplnou fatorizaci polynomu f. Rádi bychom tedy zísali bázi W, terá nám poslouží ja pro stanovení počtu fatorů zadaného polynomu f, ta pro jejich zísání. Mějme polynom f stupně n. Víme, že W = v ª \ q[x] : deg v < n v q = v (mod f). To můžeme zapsat jao W = ± v = (v 0,..., v n 1 ) : ž = ± v = (v 0,..., v n 1 ) : = ± v = (v 0,..., v n 1 ) : = ± v = (v 0,..., v n 1 ) : n 1 n 1 n 1 n 1 v i x i Ÿ q v i x iq = = n 1 n 1 v i (x iq mod f) = v i x i (mod f)² = v i x i (mod f)² = n 1 v i (x iq mod f) n 1 v i x i ² = v i x i = 0². Poud označíme I jao jednotovou matici veliosti n n a Q jao matici n n, jejíž sloupce tvoří oeficienty vetorů x 0 mod f, x q mod f,..., x (n 1)q mod f, můžeme přepsat definici W na W = v = (v 0,..., v n 1 ) : 0 = Qv Iv = (Q I)v. Odtud vidíme, že W je nulový prostor matice Q I, jehož bázi můžeme jednoduše spočítat pomocí Gaussovy eliminace. Shrňme všechny zísané informace do následujícího 13

Tvrzení 2.13: Buď f bezčtvercový polynom stupně n nad \ q, I n n jednotová matice a Q n n matice, jejíž sloupce tvoří oeficienty polynomů x 0 mod f, x q mod f, x 2q mod f,......, x (n 1)q mod f. Označme bázi nulového prostoru matice Q I jao w 1,..., w «. Pa 1. počet prvů báze,, odpovídá počtu ireducibilních fatorů v rozladu f, 2. protože 1 q = 1, je (1, 0,..., 0) ª W, a tedy BÚNO w 1 = (1, 0,..., 0), 3. pochopíme-li vetory w 2,..., w jao polynomy, platí f = Š s F q NSD(w i s, f). procedure BerleampovaF(q,f) : fatorizuje bezčtvercový f ª \ q[x] Q matice n n se sloupci x 0 mod f, x q mod f,..., x (n 1)q mod f ((1, 0,..., 0), w 2,..., w ) báze nulového prostoru matice Q I i 2 fatory ³ f«while fatory < do foreach g ª fatory do foreach s ª \ q do c NSD(w i s, g) i i + 1 return fatory if deg c > 0 deg c < deg g then fatory g g/c fatory `V g«µ c, g/c«algoritmus 2.14: Berleampova fatorizace bezčtvercového polynomu Tvrzení 2.14: Algoritmus pracuje správně a v polynomiálním čase vzhledem n a q. Důaz: Časová složitost nejvnitřnějšího cylu je stejná jao jeden NSD a jedno dělení. Počet opaování cylů v pořadí od nejvnitřnějšího je q-rát pro s ª \ q, dále n-rát pro g ª fatory a n-rát pro vnější cylus. Časová složitost všech cylů algoritmu je tedy v nejhorším qn 2 -rát složitost nalezení NSD a dělení. Co se týče efetivního vytvoření matice Q, nejprve spočteme x q mod f a aždý další řáde x iq mod f zísáme jao x (i 1) q _ x q mod f, protože oba tyto polynomy už známe. To vše zvládneme pomocí q + n násobení polynomů. Ještě chybí složitost nalezení báze nulového prostoru, což zvládneme Gaussovou eliminací v čase n 3. Nepříjemná je závislost na q, tj. na počtu prvů použitého tělesa. Popsaný algoritmus je sice možné modifiovat na pravděpodobnostní, terý je v průměru polynomiální vzhledem n a log q (je popsán napřílad v [3]), ale potřeba hledání báze nulového prostoru celý algoritmus velmi brzdí. Proto dále popíšeme jiný pravděpodobnostní algoritmus, jehož průměrný čas bude taé polynomiální vzhledem n a log q a terý Gaussovu eliminaci nebude muset provádět. Pro úplnou oretnost bychom ještě měli doázat, že aždá báze W úplně fatorizuje polynom f, tj. že oddělí aždé dva jeho fatory. Mějme tedy BÚNO f 1 a f 2 fatory f. Nejprve nahlédneme, že vůbec existuje polynom w ª W, terý je oddělí: podle Čínsé věty o zbytcích (2.1) existuje právě jeden polynom w taový, že w mod f 1 = 1 a pro ostatní f i je w mod f i = 0. Protože w q = w (mod f i ) pro aždé f i, dle stejné věty je w ª W. Tento polynom oddělí f 1 a f 2, jeliož f 1 ` w 1 a f 2 ` w, a můžeme ho zapsat jao w = ] i=1 a iw i. Nyní pro spor předpoládejme, že žádný prve w 1,..., w fatory f 1 a f 2 neoddělil, taže e aždému w i existuje onstanta s i, že f 1 f 2` w i s i. Pa ale f 1 f 2`9] i=1 a i(w i s i ) = w ] i=1 a is i, což je ve sporu s tím, že polynom w oddělí f 1 a f 2. 14

g b VŒZT bx jf¹ º UX ' bxdl ŒZUXiZY Nyní popíšeme další algoritmus fatorizace bezčtvercového polynomu. Tento algoritmus má dvě části. První je různostupňová fatorizace, jejímž cílem je rozložit bezčtvercový polynom f na Š i f i, de aždý polynom f i je součin všech ireducibilních fatorů polynomu f, jejichž stupeň je i. Druhá fáze, stejnostupňová fatorizace, má za úol rozládat bezčtvercový polynom, jehož fatory mají stejný stupeň. Tuto fatorizaci použijeme na aždé netriviální f i, teré vznine při různostupňové fatorizaci. Nejprve si popíšeme různostupňovou fatorizaci. Tato fatorizace, terá je popsaná napřílad v [9], je ještě deterministicá. Náhodu budeme muset použít až při stejnostupňové fatorizaci. Připomeňme si tvrzení (2.4). To tvrdí, že x qd x je součinem všech monicých ireducibilních polynomů nad \ q, jejichž stupeň dělí d. Toto tvrzení nám dává jasný návod, ja můžeme různostupňovou fatorizaci provést. Protože x q x je součin všech ireducibilních polynomů stupně jedna, určitě je f 1 = NSD(x q x, f). Navíc v rozladu polynomu f/f 1 už žádné polynomy stupně jedna nejsou, taže f 2 = NSD(x q2 x, f/f 1 ) a stejnou úvahou dostaneme, že f i = NSD x qi x, f i 1 Š j=1 f. j Protože ale NSD(a, b) = NSD(a b, b), můžeme tuto rovnost přepsat na použitelnější f i = NSD x qi x mod f, f i 1 Š j=1 f. j procedure RůznostupňováF(q,f) : různostupňově fatorizuje bezčtvercový polynom f nad tělesem \ q i 0; w x; while deg f > 0 do i i + 1; w w q mod f f i NSD(w x, f) f f/f i return (f 1, f 2,..., f i ) Algoritmus 2.15: Různostupňová fatorizace Tvrzení 2.15: Algoritmus pracuje správně a v polynomiálním čase vzhledem n a log q. Důaz: Jediná změna algoritmu od popsaného postupu je postupné počítání polynomu x qi x. Algoritmus využívá toho, že x qi = (x qi 1 ) q. V i-tém průchodu cylem je tedy w = x qi, w x je požadovaný polynom a algoritmus proto pracuje správně. Co se časové složitosti týče, jeden průchod cylem vyžaduje spočítání jednoho NSD, dále log q násobení polynomů pro vypočítání w q a jedno dělení, teré můžeme zanedbat, protože výpočet NSD je náročnější. Celý cylus se může provádět až n-rát, taže celová složitost je omezena složitostí n NSD a n log q násobení. 15

g b» ¼Y ½ T bx jf¹ ¾ UX ' bxdl ŒZUXiZY Úolem stejnostupňové fatorizace je rozložit zadaný bezčtvercový polynom, jehož ireducibilní fatory mají všechny stupeň d, přičemž d známe. Jedna z variant této fatorizace je popsána v [3]. Nejprve potřebujeme trochu teorie o odmocninách. Tvrzení 2.16: Buď T onečné těleso o lichém počtu prvů a S cylicá multipliativní grupa nenulových prvů tělesa T, přičemž S je sudého řádu a má generátor g. Pa (1) polovina prvů S nemá druhou odmocninu a druhá polovina má přesně dvě, (2) jedniča druhé odmocniny má a jsou to jedniča a minus jedniča, (3) má-li a druhé odmocniny, je a /2 = 1, poud nemá, je a /2 = 1. Důaz: Vezměme sudou mocninu generátoru g 2i. Určitě platí (g i ) 2 = g 2i a taé (g i _ g /2 ) 2 = g 2i _ g = g 2i. Taže aždá sudá mocnina generátoru, čili polovina prvů, má alespoň dvě odmocniny a všechny tyto odmocniny jsou navzájem různé. Žádné další odmocniny ale nejsou, dyž už jsme jich našli, taže bod (1) platí. Co se týče odmocniny z jedničy, určitě platí, že 1 2 = 1 a ( 1) 2 = 1, taže jsme našli dvě odmocniny z jedničy. Žádné další už být nemohou. Pro důaz posledního bodu si nejprve uvědomíme, že ja g 0 = 1, ta g /2 jsou odmocniny z jedničy. Tedy g /2 = 1. Nyní vezměme prve a, terý má druhé odmocniny. Pa je to sudá mocnina generátoru, čili a = g 2i. Proto a /2 = (g 2i ) /2 = g i = (g ) i = (g 0 ) i = 1. Naopa je-li a prve, terý nemá druhé odmocniny, je to lichá mocnina generátoru. Taže a /2 = (g 2i+1 ) /2 = g i+/2 = (g ) i _ g /2 = 1 _ ( 1) = 1. Ještě poznamenejme, že celý důaz jsme mohli provést pro libovolnou cylicou multipliativní grupu sudého řádu, jenom bychom místo nedefinované 1 museli psát g /2. Mějme bezčtvercový polynom f stupně _ d, terý se sládá z ireducibilních polynomů stupně d, f = f 1 _#_#_ f r. Poud je = 1, je fatorizace f triviální, taže předpoládejme, že 2. Podle Čínsé věty o zbytcích (2.1) je zobrazení ϕ : \ q[x]/f À\ q[x]/f 1... \ q[x]/f ϕ(a) = (a mod f 1,..., a mod f ) = (ϕ 1 (a),..., ϕ (a)) izomorfismus oruhů. Platí, že f i dělí a právě tehdy, dyž 0 = a mod f i = ϕ i (a). Poud tedy doážeme najít polynom a, pro terý bude nějaé ϕ i (a) = 0 a nějaé ϕ j (a) š= 0, bude NSD(a, f) netriviální dělitel f. Pomocí něho můžeme f rozdělit na dva fatory a poud jsou tyto netriviální, použít na ně jiný vhodný polynom a. Ja ale najdeme polynom a, terý bude splňovat popsané podmíny? Zde přichází na řadu náhoda. Poud zvolíme a jao náhodný polynom stupně menšího než f, budou všechny ϕ i (a) podle Čínsé věty o zbytcích taé náhodné prvy těles \ q[x]/f i. Chtěli bychom, aby nějaé ϕ i (a) = 0 a nějaé ϕ j (a) š= 0. Na chvíli předpoládejme, že jsme nad onečným tělesem, jehož charateristia je liché prvočíslo (není to tedy 2). Každé těleso \ q[x]/f i má pa lichý počet prvů a multipliativní grupa prvů tohoto tělesa bez nuly má sudý počet prvů a je dle (2.5) cylicá. Splňuje tedy předpolady posledního tvrzení (2.16), taže ϕ i (a) (qd 1)/2 je buď jedna nebo minus jedna a obě tyto možnosti jsou stejně pravděpodobné. Zvolme tedy náhodný polynom a stupně menšího než f. Polynomy ϕ i (a) jsou pa náhodné a ϕ i (a) (qd 1)/2 1 = ϕ i (a (qd 1)/2 1) je buď 0 nebo 2, přičemž obě tyto možnosti jsou stejně pravděpodobné. Polynom a nám nevyhovuje, dyž jsou všechny ϕ i = 0 nebo dyž jsou všechny ϕ i = 2. To lze zapsat ta, že nám nevyhovuje, dyž ϕ 1 (a (qd 1)/2 1) =... = ϕ (a (qd 1)/2 1), což nastává s pravděpodobností 2 _ (1/2) = 2 1 1/2. 16

Algoritmus bude následovný: vygeneruj náhodný polynom a stupně menšího než f a spočítej b = a (qd 1)/2 a c = NSD(b 1, f). Poud c není netriviální dělitel f (což nastane s pravděpodobností 2 1 1/2), zvol jiný polynom a. V opačném případě reurzivně zpracuj polynomy c a f/c. Ještě než algoritmus zapíšeme formálně a rozebereme jeho složitost, musíme vyřešit poslední problém, a to tělesa s charateristiou 2, na terá se tvrzení (2.16) nevztahuje. Toto tvrzení nám pro tělesa s lichou charateristiou dává do ruy zobrazení, teré pro všechny prvy nabývá pouze dvou hodnot, a aždá tato hodnota je stejně pravděpodobná. Rádi bychom něco podobného našli taé pro tělesa charateristiy 2. Poslouží nám Tvrzení 2.17: Mějme onečné těleso \ 2 a definujme T = ] 1 x2i. Pa (1) x 2 x = T (T + 1), (2) přesně pro polovinu prvů a ª \ 2 je T (a) = 0, pro druhou polovinu je T (a) = 1. Důaz: Začněme bodem (1): T (T + 1) = T 2 + T = ž = 1 x 2i+1 + 1 1 x 2i Ÿ 2 + 1 x 2i charateristia 2 = x 2i = i=1 1 Á 1 x 2i x 2i 2 1 + x 2i = x 2i = x 2 x. Polynom x 2 x = T (T + 1) se ale nad \ 2 [x] dle (2.3) rozládá jao Š s F 2 (x s), což znamená, že hodnota x 2 x je po dosazení libovolného prvu s ª\ 2 nulová. Taže součin T (T + 1) musí být po dosazení prvu s taé nulový. To je ale možné jenom v případě, že T (s) = 0 nebo T (s) = 1. Ještě potřebujeme uázat, že obě možnosti jsou stejně pravděpodobné. Uvažujme znovu rozlad x 2 x = T (T + 1). Poud je T (a) = 0, je a ořenem polynomu T. V opačném případě je a ořenem polynomu T 1. Oba tyto polynomy mají stupeň 2 1, aždý z nich může mít tedy nejvýš 2 1 ořenů. Prvů a, se terými pracujeme, je ale 2, což znamená, že přesně polovina z nich musí být ořeny polynomu T a druhá polovina ořeny polynomu T 1. Teď už víme, ja se postarat i o tělesa s charateristiou 2, taže se můžeme pustit do algoritmu. procedure StejnostupňováF(q = p m,f,d) : stejnostupňově fatorizuje bezčtvercový polynom f nad \ q if deg f d then return f«do a náhodný polynom nad \ q stupně menšího než deg f if p = 2 then b ] md 1 a 2i mod f else b a (qd 1)/2 1 mod f c NSD(b, f) while c = 1 à c = f return StejnostupňováF(p m, c, d) µ StejnostupňováF(p m, f/c, d) Algoritmus 2.18: Stejnostupňová fatorizace Tvrzení 2.18: Algoritmus pracuje správně a v polynomiálním čase vzhledem n a log q. Důaz: Tentorát je algoritmus přímočarou implementací popsaného postupu, jehož správnost už máme doázanou. 17

Nejprve si spočítejme, oli polynomů a musíme v průměru otestovat, než najdeme nějaý užitečný. Šance, že jeden polynom a není užitečný, je nejhůř 1/2. Očeávaný počet polynomů, teré musíme vyzoušet, než najdeme jeden úspěšný, je z = 1/2 _ 1+1/2 _ (1+z), z čehož dostaneme z = 2. Zjištění, zda je polynom a pro fatorizaci užitečný, zvládneme jedním NSD a n log q násobeními. V průměru to musíme udělat dvarát, což náš odhad nija nezazí. Známe složitost algoritmu bez reurzivního volání. Ja se nám na složitosti podepíše reurze? Nechť T (n) je složitost algoritmu pro polynom stupně n a C(n) je složitost algoritmu bez reurzivního volání, tedy složitost nalezení užitečného polynomu a. V nejhorším případě platí, že T (n) = C(n) + T (n 1) + T (1) = C(n) + C(n 1) +... + C(1) + n _ T (1) n _ C(n) + n. Složitost celého algoritmu tedy můžeme odhadnout jao spočtení n NSD a n 2 log q násobení. Poznamenejme jenom, že tato analýza reurze je velmi hrubá, dá se doázat, že v průměru je T (n) 2 log n _ C(n), což doážeme při analýze algoritmu stejnostupňové fatorizace v další apitole. Můžeme tím zpřesnit náš odhad složitosti na složitost provedení 2 log n NSD a 2n log n log q násobení. 18

ÄxKtÅxÆ A v M E QÇ} E ~ Èv É E w {HOH}~ Æ C Cílem této apitoly je popsat implementace bezčtvercové, různostupňové a stejnostupňové fatorizace, teré mají co nejmenší časovou složitost. Abychom vůbec mohli o časové složitosti mluvit, musíme říct, co jí budeme mínit. Pro naše potřeby použijeme zjednodušenou definici. Časovou složitostí algoritmu, terý pracuje s polynomy nad tělesem \ q, budeme rozumět počet elementárních operací s prvy tělesa \ q, teré musí algoritmus vyonat. Budeme ji vyjadřovat jao funci veliosti vstupu, nejčastěji budeme používat n, stupeň zpracovávaného polynomu, a q, počet prvů tělesa, nad terým pracujeme. Budeme používat složitost v nejhorším případě, taže časová složitost udává největší použitý počet operací, terý je třeba pro zpracování libovolného oretního vstupu dané dély. Určit přesnou časovou složitost je ale docela náročné, taže budeme pro jednoduchost pracovat pouze s asymptoticou časovou složitostí. Řeneme, že funce f : ÊË NÊ je I (g), poud existují ladné onstanty c a n 0 taové, že Ì n n 0 : f(n) c _ g(n). Časovou složitost pa budeme vyjadřovat pomocí zavedeného symbolu I. Naše definice bere v úvahu jenom operace prováděné nad tělesem, ale nepočítá cyly, testování podmíne, volání procedur ani jinou režii programu. U všech popsaných algoritmů lze vša jednoduše nahlédnout, že je tato režie vzhledem počtu operací nad tělesem zanedbatelná. Nyní si popíšeme úpravy, teré budeme s asymptoticými složitostmi často provádět. Nejprve si uvědomíme, že poud používáme v asymptoticé složitosti logaritmus, nezáleží na jeho záladu. Protože log a b = log c b log c a, všechny logaritmy se liší jenom o onstantu a ta se do I -ča schová. Dále si uvědomíme, že I (log n) je I (n ε ) pro libovolné ladné ɛ. To bude platit, poud log n n ε. To ale můžeme pro dostatečně velá n přepsat na log log n ε _ log n. Poud by vpravo nebyla onstanta ε, daná nerovnost pro dostatečně velá n jistě platí. Konstantu ε ale můžeme schovat do I -ča, taže opravdu I (log n) je I (n ε ). Tuto sutečnost budeme zapisovat jao I (log n) je I (n σ(1) ), de σ(1) značí libovolně malé ladné číslo. Abychom mohli určovat časovou složitost co nejpřesněji, musíme si říci, ja rychle doážeme provádět aritmeticé operace s polynomy nad \ q. Uvedené algoritmy lze najít napřílad v nize [5]. Budou nás zajímat následující operace: sčítání a odčítání polynomů stupně nejvýše n doážeme pomocí I (n) operací nad \ q. Stačí nám tomu lasicý šolní algoritmus. násobení dvou polynomů stupně nejvýše n doážeme provést pomocí I (n 2 ) operací nad \ q použitím lasicého šolního algoritmu, I (n log 2 3 ) operací nad \ q pomocí algoritmu Karatsuba & Ofman, I (n log n log log n) operací nad \ q užitím algoritmů založených na FFT. Jde upříladu o algoritmy Schönhage & Strassen nebo Cantor & Kaltofen. Protože budeme asymptoticou složitost násobení potřebovat často, položíme M(n) = n log n log log n. Též mnohorát využijeme fatu ] i M(n i) M(] i n i), terý plyne z M(n) n. dělení se zbytem dvou polynomů stupně nejvýš n můžeme provést v čase odpovídajícím času čtyř násobení (použitím Newtonovy iterace). Dostáváme se tedy taé na čas I (M(n)). umocnění polynomu stupně n na d ªÍÊ doážeme provést binárním umocňováním pomocí I (log d) násobení, tedy v čase I (M(n) log d). 19

Ü _ Ü největší společný dělitel polynomů stupně nanejvýš n můžeme hledat modulárním Eulidovým algoritmem, z čehož vyjde složitost I (n 2 ), složitým reurzivním postupem, jehož složitost je I (M(n) log n). vyhodnocení polynomu stupně n v jednom bodě doážeme pomocí tzv. Hornerova schématu pomocí I (n) operací. Stačí si všimnout, že hledaná hodnota je rovna n a i _ x i = n Î Ï#Ð Ñ ( _#_#_ ((( a n )x + a n 1 )x + a n 2 ) _#_#_ )x + a 0, což už doážeme spočítat pomocí n násobení a n sčítání prvů tělesa \ q. vyhodnocení polynomu stupně n v m bodech bychom doázali vyřešit opaováním Hornerova schématu v čase I (nm), nicméně jde vymyslet efetivnější reurzivní algoritmus se složitostí I (M(m) log m + M(n)). zísat zbyty po dělení jednoho polynomu stupně n něolia polynomy doážeme pomocí opaovaného dělení. Poud je ale stupeň součinu polynomů, terými chceme dělit, roven m, stejně jao v minulé operaci můžeme použít (doonce velmi podobný) reurzivní algoritmus se složitostí I (M(m) log m + M(n)). Mimo polynomů budeme muset násobit taé matice, proto následuje Tvrzení 3.1: Buď A a B matice o veliostech n n. Označme ω nejmenší exponent taový, že doážeme zadané matice vynásobit v čase I (n ω ). Tvrdíme, že ω < 2.376, a předpoládáme ω > 2. Důaz tohoto tvrzení je velice ompliovaný a lze ho nalézt v Coppersmith & Winograd [4]. Kromě již popsaných operací budeme používat ještě sládání polynomů, g(h) mod f, jehož výsledem je ] i g ih i mod f. Pomocí Hornerova schématu ho doážeme provést pomocí I (n _ M(n)) operací nad \ q. Nicméně pomocí rychlého násobení matic ho doážeme provést ještě rychleji. procedure SládáníPolynomů(q,f,g,h) : spočte g(h) mod f n deg f; m ÓÒÕÔ n Ö m 1 Najdi g 0,..., g m 1 stupně nejvýš m, aby g = ] g ix mi h 0 1; for 1 i m do h i h i 1 _ h mod f Vytvoř matici G veliosti m m, jejíž řády jsou g 0,..., g m 1 Vytvoř matici H veliosti m n, jejíž řády jsou h 0,..., h m 1 B G _ H, řády této matice označ jao b 0,..., b m 1 return ] m 1 b i _ (h m ) i mod f Algoritmus 3.2: Sládání polynomů pomocí maticového násobení Tvrzení 3.2: Jsou-li stupně f, g, h nejvýš n, vydá algoritmus správný výslede v čase I (n (ω+1)/2 ). Použitím odhadu pro ω dostaneme I (n 1.688 ). Důaz: Činnost algoritmu můžeme rozepsat jao následující maticové násobení. Ø ØÙg 0 g 1. g m 1 Ú.Û Û Ø ØÙ1 h mod f. h m 1 mod f Ú.Û Û Ü = Ø ØÙb 0 b 1. b m 1 Vzhledem vlastnostem maticového násobení určitě platí, že b i Ú.Û Û = g i (h) mod f. Celý výslede algoritmu je tedy ] m 1 b i _ (h m ) i mod f = ] m 1 g i(h) _ h mi mod f = g(h) mod f. 20

Nyní určíme složitost. Nalezení polynomů g i zvládneme v lineárním čase, h i doážeme spočítat pomocí m násobení, čili v čase I (Ô nm(n)). Poté musíme vynásobit matice o rozměrech m m a m n. To můžeme udělat ta, že provedeme m násobení matic o rozměrech m m, čili v čase I (mm ω ) = I (n (ω+1)/2 ). Závěrečnou sumu můžeme vyhodnotit Hornerovým schématem, což nás stojí opět I (Ô nm(n)) operací nad \ q. Poud předpoládáme ω > 2, nejnáročnější je právě maticové násobení, taže složitost celého algoritmu je slibovaných I (n (ω+1)/2 ). Ještě popíšeme vylepšení právě popsaného sládání, teré bude efetivnější, budeme-li sládat víc než jeden polynom. procedure SládáníMnoha(q, f, g 1,..., g, h) : spočte všechna g i (h) mod f n deg f; m ÓÒ Ô nö n/m 1 Pro aždý g i najdi g i,0,..., g i,n/m 1 stupně nejvýš m, aby g i = ] j=0 g i,j x mj h 0 1; for 1 i m do h i h i 1 _ h mod f Vytvoř matici G veliosti m m s řády g 1,0,..., g 1,n/m 1, g 2,0,..., g,n/m 1 Vytvoř matici H veliosti m n s řády h 0,..., h m 1 B G _ H, řády této matice označ jao b 1,0,..., b 1,n/m 1, b 2,0,..., b,n/m 1 return (] n/m 1 j=0 b 1,j _ (h m ) j mod f,..., ] n/m 1 j=0 b,j _ (h m ) j mod f) Algoritmus 3.3: Sládání mnoha polynomů pomocí maticového násobení Tvrzení 3.3: Jsou-li všechny polynomy stupně nejvýš n a je-li n, funguje algoritmus v čase I (n (ω+1)/2 (ω 1)/2 ). Po dosazení za ω dostaneme I (n 1.688 0.688 ). Důaz: Co se týče správnosti, algoritmus funguje stejně jao předchozí, jenom funguje pro víc polynomů najednou, taže správnost plyne ze správnosti jednoduché verze sládání. Časová složitost počítání h i je I (Ô nm(n)), násobení matic stojí I ( n m mω ) = I (n (ω+1)/2 (ω 1)/2 ) a závěrečné ombinování výsledů trvá opět I (Ô nm(n)). Stejně jao předtím je násobení matic časově nejnáročnější. 21

d i b HY?ŒZWŽ Y UX ' bxdl ŒZUXiZY Naším cílem je zrychlit algoritmus bezčtvercové fatorizace. V minulé apitole jsme popsali algoritmus, jehož složitost byla v nejhorším případě rovna složitosti n NSD. Nyní algoritmus vylepšíme o celý řád, jeho složitost bude asymptoticy odpovídat složitosti NSD. Tuto vylepšenou verzi algoritmu pro tělesa charateristiy nula jsme převzali z [11]. Opět tedy začněme s tělesem charateristiy nula a mějme nad ním polynom f, jehož bezčtvercová fatorizace je Š i=1 f i i, de všechny f i jsou bezčtvercové. Hlavní roli ve výpočtu budou hrát polynomy v i = j=i f j a w i = j=i (j i + 1) _ f j f j _ v i. Výhoda těchto polynomů je v tom, že mají malé stupně, aždé f j se v nich nachází pouze v první mocnině. K tomu, abychom jednotlivé f j doázali odlišit, nepoužíváme tedy stupeň jejich výsytu, ale oeficient u příslušné části polynomu w i. Nejprve si uažme, ja můžeme tyto polynomy indutivně počítat. Na začátu stačí položit c = NSD(f, f ) = Š, a pa dopočítat hledané polynomy jao i=2 f i i 1 v 1 = f/c a w 1 = f /c. Nyní předpoládejme, že známe v i, w i a f i. Chtěli bychom pomocí nich spočítat hodnoty v i+1 a w i+1. Nejprve si označme d i = w i v i = j=i (j i + 1) _ f j f j _ v i z čehož už pa jednoduše dostaneme, že j=i f j f j _ v i = j=i+1 v i+1 = v i /f i a w i+1 = d i /f i = (w i v i)/f i. (j i) _ f j f j _ v i, Zbývá vyřešit poslední a nejtěžší úol, a to ja z hodnot v i a w i určit f i. Uvažujme, ja vypadá NSD(v i, d i ) = NSD(v i, w i v i). Fatory (ne nutně ireducibilní) polynomu v i jsou f i, f i+1,..., f. _ v i a f i se vysytuje v aždém Polynom f i dělí d i, protože d i = ] j=i+1 (j i) _ f j f j členu sumy. Pro aždý polynom f j, j š= i, je NSD(f j, d i ) = 1. To proto, že f j je bezčtvercový, tím pádem je dle (2.7) NSD(f j, f j) = 1, a tedy taé NSD(f j, (j i) _ f j/f j _ v i ) = 1. Hledané f i je tedy rovno NSD(v i, d i ). Z popsaných rovností vznine následující algoritmus. procedure BezčtvercováF(f) : f polynom nad tělesem charateristiy 0 if deg f = 0 then return f c NSD(f, f ); v f/c; w f /c; i 0 while deg v > 0 do i i + 1 d w v ; f i NSD(v, d) v v/f i ; w d/f i return (f 1,..., f i ) Algoritmus 3.4: Rychlá bezčtvercová fatorizace pro tělesa charateristiy 0 Tvrzení 3.4: Algoritmus pracuje oretně v čase asymptoticy rovném času spočítání jednoho NSD polynomů stupně nejvýš n, tedy v čase I (n 1+σ(1) ). 22

Důaz: Zbývá doázat složitost algoritmu. V i-tém průchodu cylem musíme spočítat nad polynomy stupně deg v i a deg w i dvě dělení, jedno odečítání, derivaci a jeden NSD. Nejsložitější z nich je právě NSD, taže budeme uvažovat jenom spočítání jednoho největšího společného dělitele polynomů v i a d i. Označme N(m) složitost nalezení NSD polynomů stupně nejvýš m a uvědomme si, že deg v i > deg d i. Složitost celého algoritmu je pa ] i=1 N(deg v i). Víme, že v i = Š j=i f j, z toho dostaneme rovnost deg v i = ] j=i deg f j, a tedy složitost celého algoritmu je i=1 N(deg v i ) N(n) n N = N i=1 i _ deg f i i=1 deg v i = N i=1 j=i f=š i f i i = N(deg f) = N(n). deg f j = Nyní zoumejme, ja bude tento algoritmus fungovat na tělesech prvočíselné charateristiy p. Nejprve si uvědomíme, že pro aždé f j je f j š= 0. Poud by totiž byla derivace f j nulová, f j = ] i a ix pi = (] i a ix i ) p a f j by nebyl beze čtverců. Polynom w 1 = ] j=1 j _ f j/f j _ v 1 je nad \ p m roven ] j=1 j mod p _ f j/f j _ v 1, taže algoritmus nám mocninu aždého bezčtvercového fatoru f i určí jao i mod p. Je-li mocnina nějaého f i je větší nebo rovna p, musíme tuto situaci ošetřit. Až algoritmus doběhne a vydá g 1,..., g i, můžeme spočítat zbyte z = f/(g 1 g _#_#_ 2 2 gi). i Poud byly mocniny všech fatorů menší než p, je stupeň polynomu z nula a hledané f j jsou rovny nalezeným g j. Když je ale stupeň polynomu z alespoň jedna, musíme dopočítat správné mocniny bezčtvercových fatorů. Hodnota polynomu z je rovna Š i f p i/p i, taže je to (stejně jao v apitole jedna) p-tá mocnina polynomu z 1/p = Š i f i/p i. Tento polynom můžeme zpracovat reurzivně a zísáme ta fatory (z 1,..., z t ), přičemž z j je součin všech bezčtvercových fatorů f, pro teré je Ý /pþ = j. Máme tedy fatory g 1,..., g i, přičemž g j je součin bezčtvercových fatorů f pro mod p = j, a fatory z 1,..., z t, de z j je součin bezčtvercových fatorů f pro Ý /pþ = j. Dopočítat hledané f j je teď už jednoduché: f jp+ pro 1 j a 1 < p je NSD(g, z j ), f jp je to, co zbylo ze z j, a f j pro 1 j < p je to, co zbylo z g j. Výrazem zbylo myslíme taové fatory, teré jsme zatím nepoužili v žádném polynomu f j. Tím vzniá algoritmus bezčtvercové fatorizace pro onečná tělesa. procedure BezčtvercováF(q = p m, f) : f polynom nad tělesem \ q if deg f = 0 then return f c NSD(f, f ); v f/c; w f /c; i 0 while deg v > 0 do i i + 1 d w v ; g i NSD(v, d) v v/g i ; w d/g i z f/(g 1 g 2 2 _#_#_ g i i) if deg z = 0 then return (g 1,..., g i ) (z 1,..., z t ) BezčtvercováF(p m, z 1/p ) for i + 1 j p 1 do g j 1 for 1 j p 1, 1 t do f p+j NSD(g j, z ) for 1 t do f p z /(f p+1 f p+2 _#_#_ f p+p 1 ) for 1 j p 1 do f j g j /(f p+j f 2p+j _#_#_ f tp+j ) return (f 1,..., f ), de tp < (t + 1)p je největší taové, že deg f > 0 Algoritmus 3.5: Rychlá bezčtvercová fatorizace pro onečná tělesa 23

Tvrzení 3.5: Algoritmus pracuje správně a v čase I (N(n)), tedy v čase I (n 1+σ(1) ). Důaz: Na správnosti není co doazovat, algoritmus je přímou implementací popsaného postupu. Zato doázat časovou složitost nám dá dost práce. Nejdříve si uvědomíme, za ja dlouho doážeme spočítat součin Š i=1 h i, poud je ] i deg h i = m. Budeme to dělat po rocích. V aždém rou spočítáme součin dvou sousedních polynomů. V prvním rou spočítáme součiny h 1 _ h 2, h 3 _ h 4,..., h 1 _ h, v druhém rou spočítáme součiny h 1 h 2 _ h 3 h 4,..., h 3 h 2 _ h 1 h atd. Těchto roů bude log 2, protože na začátu je polynomů a v aždém rou jejich počet lesne na polovinu. V jednom rou se s aždým polynomem h i pracuje právě jednou, taže složitost jednoho rou můžeme omezit složitostí I (M(] i=1 deg h i)) = I (M(m)). Celová složitost je tedy I (M(m) log ). Nyní provedeme analýzu časové složitosti algoritmu bez reurzivního volání. Algoritmus musí ve svém běhu romě reurzivního volání spočítat (g 1,..., g i ): z předchozího algoritmu již víme, že to zvládneme v čase I (N(n)). z = f/(g 1 g _#_#_ 2 2 gi): i součin polynomů g j j doážeme dle výše uvedeného pozorování spočítat v čase I (M(n) log n) = I (N(n)). Pa už jen vydělíme v čase I (M(n)). NSD(g j, z ) pro 1 j p 1 a 1 t: abychom dosáhli dobré složitosti, budeme muset udělat předvýpočet spočítat si g j mod z pro aždé j a. Poté budeme místo NSD(g j, z ) počítat NSD(g j mod z, z ), což je jistě evivalentní. Nejdříve určíme složitost předvýpočtu. Víme, že pro pevné j doážeme spočítat všechny g j mod z v čase I (M(l) log l), de l = max(deg g j, ] deg z ). Toto můžeme odhadnout jao l max(deg g j, n/p) deg g j + n/p. Poud sečteme složitost roů pro všechna j, dostaneme j I (M(deg g j + n/p) log(deg g j + n/p)) I (M( j j I (M(deg g j + n/p) log n) deg g j + p _ n/p) log n) I (M(n + n) log n) = O(M(n) log n). Nyní odhadneme složitost výpočtu všech NSD(g j mod z, z ). Spočítání jednoho taového největšího společného dělitele zabere čas I (N(deg z )). Poud vezmeme pevné g j, na spočtení všech NSD(g j mod z, z ) potřebujeme ] I (N(deg z )) I (N(] deg z ) I (N(n/p)) operací. Možných g j je nejvýš p, čímž se dostaneme na I (p _ N(n/p)) I (N(n)). z /(f p+1 f p+2 _#_#_ f p+p 1 ) pro 1 t: buď pevné. Součin polynomů f j dělí z. Proto je stupeň tohoto součinu nejvýš roven stupni z, taže spočítat ho doážeme v čase I (M(deg z ) log n/p). Pa jenom z vydělíme v čase I (M(deg z )). Sečteme-li tyto složitosti pro všechna z, dostaneme I (M(] deg z ) log n/p), což je určitě omezené složitostí I (M(n/p) log n/p) = I (N(n/p)). g j /(f p+j f 2p+j _#_#_ f tp+j ) pro 1 j p 1: stejnou úvahou jao v minulém případě zjistíme, že pro pevné j potřebujeme I (M(deg g j ) log n) operací. Sečtením přes všechna g j dostaneme I (M(] j deg g j) log n), což je určitě omezené složitostí I (M(n) log n) = I (N(n)). Tím dostáváme složitost I (N(n)) bez reurzivního volání. Vyřešit reurzivní volání je jednoduché. Poud označíme T (n) složitost algoritmu spuštěného na polynom stupně n, dostaneme T (n) N(n) + T n p N n p i N(n) n 1 p i _ N(n) = p p 1 _ N(n) p 2 2N(n). Složitost algoritmu je tím pádem opravdu rovna slíbené složitosti I (N(n)) = I (n 1+σ(1) ). 24