Berlekampův algoritmus
Berlekampův algoritmus je algoritmus navržený k rozkladu unitárních polynomů přes konečné pole . Navrhl Alvin Berlekamp v roce 1967 . Lze jej také použít k testování neredukovatelnosti polynomů nad konečnými tělesy . Hlavní myšlenkou algoritmu je možnost reprezentovat původní polynom jako součin největších společných dělitelů samotného polynomu a některých polynomů, které se rozšiřují až na volný člen.
![F](https://wikimedia.org/api/rest_v1/media/math/render/svg/132e57acb643253e7810ee9702d9581f159a1c61)
Berlekampův algoritmus má vysokou výpočetní náročnost, proto byla vyvinuta řada dalších metod, které snižují počet nezbytných matematických operací. Navzdory své složitosti byl však Berlekampův algoritmus implementován v systémech počítačové algebry. Algoritmus našel široké uplatnění v teorii kódování a při studiu lineárních rekurentních vztahů v konečných polích. V algebře a teorii čísel existuje mnoho výpočetních problémů, které nějak souvisejí s rozkladem polynomů na konečných tělesech, například rozklad polynomů na kruh celých čísel , hledání rozkladu prvočíselného racionálního čísla v oboru algebraických čísel, výpočet Galoisova grupa nějaké rovnice nad oborem racionálních čísel a konstrukce rozšíření pole.
Historie vytvoření
Americký matematik, profesor na Kalifornské univerzitě v Berlekampu, studoval cyklické kódy detekce chyb a opravy , včetně kódu Bose-Chowdhury-Hockwingham , jehož vlastnosti závisí na dělitelích generujících polynomů. Berlekampovy technické pokroky v dekódování těchto kódů je učinily praktičtějšími [1] .
Algoritmus byl poprvé popsán v článku "Factoring Polynomials Over Finite Fields" [2] a později reprodukován v knize "Algebraic Coding Theory" [2] . V tomto článku z roku 1967 [3] Berlekamp píše, že problém faktorizace vyvstává ve spisech Golomba [4] . Možnost použít matici k určení počtu normalizovaných faktorů polynomu však byla poprvé zaznamenána v článku Karla Piotra![B](https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a)
[5] . Butlerův článek [6] zjistil, že hodnost maticeje, další důkaz této skutečnosti podal Schwartz [7] .
![BÝT](https://wikimedia.org/api/rest_v1/media/math/render/svg/0223c83bdafa7af0995854120c5d4cc8899011a9)
![nk](https://wikimedia.org/api/rest_v1/media/math/render/svg/b98e1d6a69bccd09a4b9b69bdf03a08c1706c8c1)
Algoritmus Berlekamp byl zmíněn v mnoha pracích [8] a byl hlavním algoritmem pro řešení problému faktorizace až do příchodu algoritmu Cantor-Zassenhaus v roce 1981.[9] . Byla vyvinuta technika [10] , která umožňuje faktorizovat polynom v tom, kde je indikátor při odhadu složitosti násobení čtvercových matic [11] .
![O(n^{{(\omega +1)/2+o(1)}}+n^{{1+o(1)}}\log q),](https://wikimedia.org/api/rest_v1/media/math/render/svg/a8944e63919234ae427ef8bc3e7b53666a8bc074)
![\omega](https://wikimedia.org/api/rest_v1/media/math/render/svg/48eff443f9de7a985bb94ca3bde20813ea737be8)
Prohlášení a definice
Je zvažován problém rozkladu polynomu stupně ( ) nad konečným tělesem ( , je prvočíslo ) [12] na různé ireducibilní unitární polynomy .
![n](https://wikimedia.org/api/rest_v1/media/math/render/svg/a601995d55609f2d9f5e233e36fbe9ea26011b3b)
![\mathbb {F} _{q}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dbb96e056c071d13fc7702013f9273e7f5cd88a7)
![q=p^{m}](https://wikimedia.org/api/rest_v1/media/math/render/svg/98c0db5db430c8b0a5ec6e6bd51b6a3a65678eb8)
![p](https://wikimedia.org/api/rest_v1/media/math/render/svg/81eac1e205430d1f40810df36a0edffdc367af36)
![f(x)=f_{1}(x)^{{e_{1}}}\cdots f_{k}(x)^{{e_{k}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5f7d12cae420b9157bfeb8a2d818a7bc9cf7b931)
Pro použití v algoritmu je matice vytvořena podle následujících podmínek:
![B=(b_{{ij}})_{{i=0,\;j=0}}^{{n-1,\;n-1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bd55bf645561ae7954b7ca9ad4cf9a6b416ce8a9)
![{\displaystyle {x^{iq}}\equiv \sum _{j=0}^{n-1}b_{ij}x^{j}{\pmod {f(x)))\quad i={ \overline {0,n-1}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5c03e625f42a14c1cbcafdfcef79a3c87eb9ad13)
.
Polynom takový, že , se nazývá -rozkládající polynom [13] .
![{\displaystyle h(x)\in \mathbb {F} _{q}[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/54713e10fd62d1a5adeac4e6d87fbb2c267eeae6)
![1\leqslant \deg {h(x)}<n,\quad {h(x)}^{q}\equiv h(x){\pmod {f(x)}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0d31a0a78a777d0319b048ae70619e945e1bebe1)
![F](https://wikimedia.org/api/rest_v1/media/math/render/svg/132e57acb643253e7810ee9702d9581f159a1c61)
Základní případ
Faktorizační algoritmus nad konečným tělesem polynomu ve tvaru:
![\mathbb {F} _{q}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dbb96e056c071d13fc7702013f9273e7f5cd88a7)
se skládá z následujících kroků:
- Maticový výpočet [14] .
![B](https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a)
- Hledání základu podprostoru řešení soustavy lineárních rovnic [15] :
![\overline {e_{1}},\tečky ,\overline {e_{k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7877c7b481e958d7634c57226c895cbc1632b56f)
,
v tomto případě je možné zvolit vektor , protože bude vždy přítomen [15] v základu prostoru řešení vzhledem k tomu, že při .![\overline {e_{1}}=(1,\;0,\;....\;,\;0)](https://wikimedia.org/api/rest_v1/media/math/render/svg/2bf0a1a6318588bd51c873d2f4bbc71e40fb114c)
![{\displaystyle x^{iq}\equiv 1{\pmod {f(x)))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/525c161fadcc06d5bd82a47cc9aeaf5458cc4e73)
![i=0](https://wikimedia.org/api/rest_v1/media/math/render/svg/31a682d568ee6a5fe51d76423186057f625ada5c)
- Nalezené číslo je počet ireducibilních dělitelů [14] .
![f(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/202945cce41ecebb6f643f31d119c514bec7a074)
- Jestliže , pak je polynom
ireducibilní .![k=1](https://wikimedia.org/api/rest_v1/media/math/render/svg/6c035ffa69b5bca8bf2d16c3da3aaad79a8bcbfa)
- Jestliže , pak vektory mají tvar . Tato čísla se používají ke konstrukci rozkládajících polynomů:
![k>1](https://wikimedia.org/api/rest_v1/media/math/render/svg/5cda43bd4034dc2d04cd562005d0af81d3d2dbc6)
![\overline {e_{l}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3bea1a3a539ac45de892d311954e311c61cbd947)
![(h_{{l,\;0}},\tečky ,h_{{l,\;n-1}})](https://wikimedia.org/api/rest_v1/media/math/render/svg/12c79b8e8cbed55bf4d693f3bc34cb364ebe2de5)
![F](https://wikimedia.org/api/rest_v1/media/math/render/svg/132e57acb643253e7810ee9702d9581f159a1c61)
.
- Dekompoziční vyhledávání [15] :
tak jako:
,
kde v obecném případě nejsou neredukovatelné. Funkce jsou faktorizovány stejným způsobem [15] , tj.
![g_{{m,\;s}}(x),\quad s=\overline {2,k}](https://wikimedia.org/api/rest_v1/media/math/render/svg/324cc40d9fe450998e5303412518262079e3489c)
![g_{{m,\;s}}(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/20eeebf041ec4e8a03ba351c0ec72f90041ec045)
.
Obecný případ
Problém faktorizace libovolného unitárního polynomu je redukován na zvážení hlavního případu. K tomu se vypočítá polynom
pomocí Euklidova algoritmu .
- Jestliže pak polynom neobsahuje více kořenů, protože násobný kořen je také kořenem derivace [16] .
![d(x)=1,](https://wikimedia.org/api/rest_v1/media/math/render/svg/bac98b3ef558ea183e69b28b5fce5dd958762ec2)
- If then znamená If then for je nutné provést popsaný postup, dokud nedosáhneme rozšíření Polynom splňuje požadavky hlavního případu [16] .
![d(x)=f(x),](https://wikimedia.org/api/rest_v1/media/math/render/svg/a513f53e27164a547df61954be61f1f30cbdcaf7)
![f^{{'}}(x)=0,](https://wikimedia.org/api/rest_v1/media/math/render/svg/179b2a2c3b48f2ae609981a727863f07680fc3b3)
![{\displaystyle f(x)=g(x)^{p},\quad g(x)\in \mathbb {F} _{q}[x].}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a8ba7e27e2c3fbd9b5111604ecafd78d64393c2d)
![g^{{'}}(x)=0,](https://wikimedia.org/api/rest_v1/media/math/render/svg/0e7e3f83a9ca4cfc6bff1a919a1b0415a509d57d)
![g(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/c6ca91363022bd5e4dcb17e5ef29f78b8ef00b59)
![f(x)=h(x)^{{p^{s}}},h{'}(x)\neq 0.](https://wikimedia.org/api/rest_v1/media/math/render/svg/612d8bb5111eab83caefb62b397c1ed6f9b5631f)
![h(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/02c07825dae28705df03d15daeb8844d49c4dbd4)
- Jinak je polynom netriviálním dělitelem polynomu . Na druhé straně polynom nemá žádné vícenásobné neredukovatelné faktory [16] . Pokud obsahuje více faktorů, pak se popsaný postup aplikuje i na něj. Se znalostí těchto rozšíření je snadné získat rozšíření .
![d(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/c74c31c749da4bca087f03265cda1e09b0f26cb7)
![f(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/202945cce41ecebb6f643f31d119c514bec7a074)
![{\frac {f(x)}{d(x)))](https://wikimedia.org/api/rest_v1/media/math/render/svg/af0f37217bd8781745dc2a4ddb002247659140c3)
![d(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/c74c31c749da4bca087f03265cda1e09b0f26cb7)
![f(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/202945cce41ecebb6f643f31d119c514bec7a074)
Problém faktorizace libovolného unitárního polynomu nad konečným tělesem je tedy redukován na faktorizaci konečného počtu polynomů, které nemají více neredukovatelných faktorů, tedy na hlavní případ [16] .
![{\displaystyle \mathbb {F} _{q}[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/96a8368212683a19801f24b4e864d8d2893d62c3)
Odůvodnění
Nechat:
![f(x)=f_{1}(x)^{{e_{1}}}\cdots f_{k}(x)^{{e_{k}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5f7d12cae420b9157bfeb8a2d818a7bc9cf7b931)
, kde .
Podle čínské věty o zbytku existuje pro jakoukoli sadu prvků pole jedinečný polynom [17] :
![(c_{1},\;...,\;c_{k})](https://wikimedia.org/api/rest_v1/media/math/render/svg/e9831558a3058ff8a48284e085ffc62f27ba3827)
![\mathbb {F} _{q}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dbb96e056c071d13fc7702013f9273e7f5cd88a7)
takové, že:
![h(x)\equiv c_{i}{\pmod {f_{i}(x))),\;i=\overline {1,\;k},\quad \deg {h(x)}<\ stupeň{f(x)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/656fbab5fe06b8ae92dc37b7d8092ed61f1c900e)
.
Polynom splňuje podmínku [17] :
![h(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/02c07825dae28705df03d15daeb8844d49c4dbd4)
![{h(x)}\equiv c_{i}\equiv c_{i}^{q}\equiv h(x)^{q}{\pmod {f_{i}(x)))),\quad i = \overline {1,\;k}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c9fdf64c9f18cb44d637b6da2e013fbb3d3edaaf)
,
a tak [18] :
![{\displaystyle h(x)^{q}\equiv h(x){\pmod {f(x)))),\quad \deg {h(x)}<deg{f(x))))](https://wikimedia.org/api/rest_v1/media/math/render/svg/fbb826d843505c02fe66db8743183bb59299087b)
.
Z podmínky:
![h(x)^{q}-h(x)=\prod _{{c\in {\mathbb {F}}_{q}}}(h(x)-c)\equiv 0{\pmod { f(x)}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/91df6f957c005b75ccdd6ae4827774cccf108809)
,
a ze skutečnosti, že faktory na pravé straně jsou koprimé, vyplývá, že každý ireducibilní dělitel polynomu dělí jeden a pouze jeden z polynomů . Platnost a jednoznačnost rozkladu [18] je tedy prokázána :
![f(x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/202945cce41ecebb6f643f31d119c514bec7a074)
![h(x)-c](https://wikimedia.org/api/rest_v1/media/math/render/svg/ea9b797bfa7ed3a32b9ec16fa5abd294c4e82e84)
Chcete-li najít polynom:
Podívejme se na srovnání:
![h(x)^{q}\equiv h(x){\pmod {f(x)))](https://wikimedia.org/api/rest_v1/media/math/render/svg/cffa9c64c68c89024e87b3a1b607d26280d032cc)
,
což je ekvivalentní podmínce [17] :
![\sum _{{i=0}}^{{n-1}}a_{i}x^{{iq}}\equiv \sum _{{i=0}}^{{n-1}}a_ {i}x^{i}{\pmod {f(x)))](https://wikimedia.org/api/rest_v1/media/math/render/svg/c4662168cf9b1f89fc67c3b7137061adb63bbced)
.
Definicí matice dostaneme:
![B](https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a)
![\součet _{{i=0}}^{{n-1}}a_{i}\součet _{{j=0}}^{{n-1}}b_{{ij}}x^{j }=\sum _{{i=0}}^{{n-1}}a_{i}x^{i}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9401055f65c9d0ea828d41f823839e9013fb9de5)
,
takže [17] :
![{\displaystyle \sum _{i=0}^{n-1}a_{i}b_{ij}=a_{j},\quad j={\overline {0,\;n-1))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8aef4bd946ec56b2cc6e9894fd7e6b4395f01aac)
.
Výsledný systém rovnic určuje koeficienty -rozkladných polynomů a lze jej zapsat jako:
![F](https://wikimedia.org/api/rest_v1/media/math/render/svg/132e57acb643253e7810ee9702d9581f159a1c61)
nebo:
[17] .
Složitost algoritmu
Složitost algoritmu jsou matematické operace [19] . Algoritmus bude účinný pouze pro malá pole. Je to kvůli potřebě vyjmenovat všechny .
![O(n^{3}+qkn)](https://wikimedia.org/api/rest_v1/media/math/render/svg/274646315edebf4c2a1f3cd41fe0ea13ce98fc1e)
![{\displaystyle c\in \mathbb {F} _{q))](https://wikimedia.org/api/rest_v1/media/math/render/svg/2daa132b680baafba2fdb6f760217aac2a09d635)
Vylepšení
- V případě jednoduchého pole, pokud je hodnota velká, bude iterace hodnot trvat dlouho. Je však možné definovat množinu sestávající z čehož je netriviální [20] . K tomu je nutné najít kořeny výslednice [21] , ze kterých se bude skládat množina .
![p](https://wikimedia.org/api/rest_v1/media/math/render/svg/81eac1e205430d1f40810df36a0edffdc367af36)
![{\displaystyle c\in {\mathbb {Z} /p\mathbb {Z} }}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a8b941542f12fd25bb1e238abecc24eeb4583814)
![M](https://wikimedia.org/api/rest_v1/media/math/render/svg/f82cade9898ced02fdd08712e5f0c0151758a0dd)
![C](https://wikimedia.org/api/rest_v1/media/math/render/svg/86a67b81c2de995bd608d5b2df50cd8cd7d92455)
![R(c)](https://wikimedia.org/api/rest_v1/media/math/render/svg/79ca99db8cc671e09f25f0ba07ec63b803c47a17)
![M](https://wikimedia.org/api/rest_v1/media/math/render/svg/f82cade9898ced02fdd08712e5f0c0151758a0dd)
- Další způsob rozkladu unitárního polynomu , který nemá více ireducibilních faktorů, je založen na redukci nějaké matice A, která je efektivně vyčíslitelná pomocí Berlekampova algoritmu, na diagonální tvar [22] . Samotný proces diagonalizace je však poměrně komplikovaný.
![f(x)\in GF(q)[x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d67c47b0e3ad31755bc4b09ade3d49aa8a5f3b1c)
- Kaltofen a Lobo [23] navrhli pravděpodobnostní verzi Berlekampova algoritmu, která umožňuje faktorizovat polynom stupně v aritmetických operacích. Algoritmus Kaltofen-Lobo byl implementován na počítači a ukázal se být účinný pro polynomy vysokého stupně, například pro polynomy stupně 10001 pracuje na poli asi 102,5 hodiny na počítači Sun-4 .
![f(x)\in GF(q)[x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d67c47b0e3ad31755bc4b09ade3d49aa8a5f3b1c)
![n](https://wikimedia.org/api/rest_v1/media/math/render/svg/a601995d55609f2d9f5e233e36fbe9ea26011b3b)
![O((n\log n+\log q)\cdot n(\log n)\log(\log n))](https://wikimedia.org/api/rest_v1/media/math/render/svg/9575eb2303a510ac56fb6487a2885c03cf67e804)
![{\displaystyle \mathbb {Z} /127\mathbb {Z} }](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a10c43cf876f0b43456b827bdcea097a0fc35d9)
Aplikace
Polynomiální faktorizační algoritmy jsou důležité pro teorii kódování a pro studium lineárních rekurentních vztahů v konečných polích. Algoritmus Berlekamp se také používá k výpočtu Galoisovy grupy rovnice nad polem racionálních čísel a konstrukci řešení polí, rozšíření polynomů v kruhu celých čísel, k nalezení rozkladu jednoduchého racionálního čísla v oboru algebraických čísel, a pro některé další výpočetní problémy [24] .
Algoritmy s faktorovými bázemipoužijte polynomiální faktorizační algoritmy k řešení problému nalezení diskrétního logaritmu [25] , na jehož výpočetní složitosti je schéma ElGamal postaveno .
Implementace v systémech počítačové algebry
V systému počítačové algebry PARI/GP lze Berlekampův algoritmus použít s příkazem factormod[26] .
Poznámky
- ↑ Berlekamp, 1967 , str. 1854: „O cyklických kódech“.
- ↑ 12 Berlekamp , 1967 .
- ↑ Berlekamp, 1967 , str. 1853.
- ↑ Golomb, Solomon Wolf. Sekvence posuvného registru . — Egejský park Pr; Upravené vydání, 1981. - 274 s. — ISBN 978-0894120480 .
- ↑ PETR K. Uber die Reduzibilitat eines Polynoms mit ganzzahligen Koeffi-zienten nach einem Primzahlmodul. — Casopis Pest Mat. Fys, 1937, str. 85-94 .
- ↑ Butler, MCR O redukovatelnosti polynomů v konečném poli. - The Quarterly Journal of Mathematics Oxford Second Series 5, 1954. - S. 102-107 .
- ↑ Schwarz, St. O redukovatelnosti polynomů nad konečným tělesem. — Quart. J Math. Oxford Ser. (2) 7, 1956. - str. 110-124 .
- ↑ Lidl, 1988 , Historický komentář, str. 223-224.
- ↑ Cantor DG, Zassenhaus H. Nový algoritmus pro faktorování polynomů nad konečnými tělesy. — Matematika. Comp., 1981. Vol. 36. - S. 587-592.
- ↑ von zur Gathen J., Shoup V. Počítání Frobeniových map a faktoringové polynomy. — Počítač. Complexity, 1992. - svazek 2 . - S. 187-224 .
- ↑ Vasilenko, 2003 , s. 185: "Složitost algoritmu Cantor-Zassenhaus".
- ↑ Lidl, 1988 , Vyjádření k problému, str. 187.
- ↑ Vasilenko, 2003 , Definice, str. 172.
- ↑ 1 2 Vasilenko, 2003 , Popis algoritmu, str. 173.
- ↑ 1 2 3 4 Lidl, 1988 , Popis algoritmu.
- ↑ 1 2 3 4 Lidl, 1988 , Redukce na hlavní věc, str. 188.
- ↑ 1 2 3 4 5 Lidl, 1988 , Zdůvodnění správnosti algoritmu, str. 189-190.
- ↑ 1 2 Vasilenko, 2003 , s. 174.
- ↑ Vasilenko, 2003 , s. 174: "Složitost algoritmu."
- ↑ Lidl, 1988 , Více o metodě, str. 201.
- ↑ Van der Waerden, 1976 , O výsledku, s. 124.
- ↑ Lidl, 1988 , Více o metodě, str. 206.
- ↑ Kaltofen E, Lobo A. Factoring high-degree polynomials by the black box Berlekamp algorithm // Sborník z mezinárodního sympozia o symbolických a algebraických výpočtech (ISSAC '94). - N. Y .: ACM Press, 1994. - S. 90-98 . — ISBN 0-89791-638-7 . - doi : 10.1145/190347.190371 .
- ↑ Lidl, 1988 , Aplikace algoritmu, str. 187.
- ↑ Vasilenko, 2003 , O použití algoritmů s faktorovými bázemi pro řešení problému diskrétního logaritmu, str. 137.
- ↑ Katalog funkcí GP/PARI: Aritmetické funkce Archivováno 11. března 2007.
Literatura
- Berlekamp, Elwyn R. Faktorování polynomů nad konečnými poli // Bell System Technical Journal. - 1967. - Sv. 46 . - S. 1853-1859 . BSTJ později znovu publikováno v: Berlekamp, Elwyn R. Algebraic Coding Theory . - McGraw-Hill Education , 1968. - ISBN 0-89412-063-8 .
- Vasilenko O. N. Číselné teoretické algoritmy v kryptografii . - M. : MTSNMO, 2003. - 328 s. — ISBN 5-94057-103-4 .
- Lidl R. , Niederreiter G. Konečná pole = Konečná pole / Ed. V. I. Něčajev. - 1. vyd. - M .: Mir, 1988. - T. 1. - 430 s. — ISBN 5-03-000065-8 .
- Van der Waerden B.L. Algebra . — M.: Nauka, 1976. — 646 s. Archivováno2. listopadu 2013 naWayback Machine