Hosszú aritmetika

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2022. január 21-én felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

Hosszú aritmetikai - Számítógéppel  végrehajtott aritmetikai műveletek ( összeadás , kivonás , szorzás , osztás , hatványozás , elemi függvények ) olyan számokon, amelyek bitmélysége meghaladja a számítógép gépi szavának hosszát . Ezeket a műveleteket nem hardverben, hanem szoftverben valósítják meg, az alapvető hardvert felhasználva, hogy kisebb számú megrendeléssel dolgozhassanak. Egy speciális eset - tetszőleges precíziós aritmetika  - olyan aritmetikára vonatkozik, amelyben a számok hosszát csak a rendelkezésre álló memória mennyisége korlátozza.

Alkalmazás

A hosszú aritmetika a következő területeken használatos:

Szükséges hardver a hosszú aritmetikához

Szigorúan véve csak közvetett címzés szükséges a processzortól az önkényes pontosságú aritmetika megvalósításához ; fix pontosságú aritmetikában akár nélküle is megteheti. Bizonyos processzorfunkciók azonban felgyorsítják a hosszú aritmetikát, miközben leegyszerűsítik a programozást.

Megvalósítás programozási nyelveken

A programozási nyelvek beépített adattípusokkal rendelkeznek, amelyek általában nem haladják meg a 64 bitet (körülbelül 10 19 ). A tizedesjegyű hosszú aritmetika a szovjet ALMIR-65 programozási nyelveken valósult meg a MIR-1 számítógépen és az ANALYTIK a MIR-2 számítógépen . A nagy számokkal való munkavégzéshez a modern programozási nyelvekben jó néhány kész optimalizált könyvtár található a hosszú aritmetika számára.

A legtöbb funkcionális nyelv lehetővé teszi, hogy a normál aritmetikáról a hosszú aritmetikára váltson anélkül, hogy meg kellene változtatnia az aritmetikai kódot. Például az Erlang és a Scheme mindig pontos számokat jelent, amíg hosszú. A Standard ML -ben az egész számok összes változatának megvalósítását az aláírás alapján határozzák meg INTEGER, lehetővé téve a kívánt dimenzió kiválasztását, beleértve egy olyan modult is IntInf, amely tetszőleges pontosságú egész számokat valósít meg; a PolyML implementáció alapértelmezés szerint ezt a modult használja.

A PascalABC.NET, a Ruby , a Python és a Java beépített könyvtárai nagy számokkal dolgozhatnak .

Algoritmusok

Szorzóalgoritmusok

Az egész számok alábbi ábrázolását általában az algoritmusok leírására használják. Az alap ki van választva . Ekkor a hosszúságú egész szám a következőképpen ábrázolható: [1] :

ahol

Alap

Ez egy iskolai módszer szerinti algoritmus "oszlopban". Időbe telik, hol  vannak a szorzott számok mérete.

Az algoritmus a következőképpen ábrázolható: [1] [2] :

1. algoritmus BasecaseMultiply
Input: Output: for from to do




Karatsuba szorzása

A Karatsuba szorzási módszere az „ oszd meg és uralkodj ” paradigmához tartozik. Az algoritmus számítási összetettsége :

.

Ez az algoritmus a bemeneti adatok felosztásának ötletének egyszerű megvalósítása [3] , amely az alább felsorolt ​​algoritmusok alapja lett. Az ötlet az, hogy egy számjegyű számok szorzási műveletét három szorzási műveletre osztják fel olyan számokkal, amelyek hosszúsága plusz [1] .

Két, egy gépi szónál nagyobb szám szorzásához a Karatsuba algoritmusát rekurzív módon hívják meg, amíg a számok elég kicsik lesznek ahhoz, hogy közvetlenül megszorozzák. Példa egy ilyen algoritmusra:

2. algoritmus KaratsubaMultiply
Bemenet: Kimenet: KaratsubaMultiply KaratsubaMultiply KaratsubaMultiply







Számoljunk :

Három köztes együtthatót kell kiszámítani:

Eredmény:

Tooma algoritmusa

Ez az algoritmus a Karatsuba algoritmus általánosítása és gyorsabb. Adott két egész szám és , a Toom-algoritmus kisebb részekre osztja őket , amelyek mindegyike megegyezik egy gépszó hosszával, és ezeken a részeken műveleteket hajt végre. Az algoritmus számítási összetettsége:

Tooma-3 algoritmus

Az ötletet először A. L. Toom vetette fel 1963-ban [4] , és a bemeneti adatok (szorzók) 3 egyenlő részre osztásából áll (az egyszerűség kedvéért minden részt egyenlőnek tekintünk). A Toom-3 9-ről 5-re csökkenti az elemi szorzási műveletek számát. Algoritmus bonyolultsága

Tekintsük ezt az algoritmust a következő példában. Legyen két szám és . Legyenek műveletek olyan számokra, amelyek mérete megegyezik az eredeti számok méretének 1/3-ával (lásd az ábrát). Azt is feltételezzük, hogy a számok egyenlő memóriát foglalnak el, és pontosan 3 résszel oszthatók, ellenkező esetben mindkét számot nullákkal töltjük fel a kívánt méretre.

Ezután következik ezen részek leképezése (parametrizálása) a 2. fokú polinomokra.

Vezessünk be definíció szerint olyat, hogy a polinomok értéke rendre egyenlő legyen a bemeneti számokkal és . A számok bitenkénti ábrázolása esetén ez a szám kettő az egyes részek bitben kifejezett hosszának hatványa.

Bevezetünk egy polinomot is:

(egy)

Miután meghatároztuk az elemeket  - a polinom együtthatóit , akkor azokat felhasználjuk annak érdekében, hogy megkapjuk , mivel . Az együtthatók mérete 2-szer nagyobb (memóriából), mint a partíció vagy . A termékkel megegyező végső számot eltolással összeadva találhatjuk meg , ahogy az alábbi ábrán látható.

Az együtthatók a következőképpen számíthatók ki: és így tovább, de ehhez mind a 9 szorzásra lesz szükség: i esetén j=0,1,2, és egy egyszerű szorzással ekvivalens lesz.

Ehelyett más megközelítést alkalmaztak. az (1)-ben 5 pontban vannak kiszámítva különböző .

Az alábbi táblázat az (1) egyenletben szereplő polinomok értékeit mutatja.

A paraméter feltételes. Ez az együtthatók banális egyenlőségét jelenti -nél , így azonnal megkapjuk az értéket . Ez a rendszer 5 ismeretlenben lineáris. Amikor megoldódik, ismeretleneket kapunk . Ezután megkapjuk a polinom értékét a fent leírtak szerint.

Tooma-4 algoritmus

Az algoritmus összetettsége 7 elemi szorzási műveletet reprezentál. A Toom-4 a bemenetet 4 részre osztja.

Ugyanazzal az elvvel, mint a Toom-3-ban, két polinomot építünk:

és 7 különböző ponton számítják ki, az ezeken a pontokon lévő értékeket is kiszámítja.

ahonnan azonnal eljutunk
ahonnan azonnal eljutunk

Az összeadási és szorzási műveletek száma a Toom-4 esetében sokkal nagyobb, mint a Toom-3 esetében. De néhány kifejezés többször előfordul. Például az [5] -re és a következőre számítva .

Toom algoritmusa tetszőleges partícióhoz

Toom algoritmusa, amely a bemeneti számokat n operandusra osztja, megegyezik a fent leírt algoritmussal. Általában két egyforma hosszú operandus részekre osztása pontértékek kiszámítását eredményezi . A rendszer megoldásának pontjaként általában .

Fourier-szorzás

Ezt a szorzási algoritmust nagy és nagyon nagy számokhoz használják [6] .

Ez az algoritmus időben megszoroz két számot, ahol  a szorzott számok jelentős számjegyeinek száma (feltéve, hogy egyenlők). Az alkotás Cooley (Coolet) és Tyuki (Tukey) nevéhez fűződik – 1965. Arra is utalnak, hogy ez az algoritmus korábban is ismert volt, de nem volt nagy jelentősége az első számítógépek feltalálása előtt. Az algoritmus feltalálásának szerzőjének valószínű jelöltjei Runge (Runge) és Koenig (Konig) - 1924, valamint Gauss - 1805 is.

Legyen szám, polinomként ábrázoljuk, ahogy korábban is tettük. Nevezzük ezt a polinomot Szintén bevezetjük a polinom diszkrét Fourier transzformációját, mint vektort , koordinátákkal . Ahol definíció szerint  - az 1-edik fok komplex gyöke , amely nem egyenlő 1-gyel. Az a tény, hogy 1 komplex gyöke egy fázistényezőig van definiálva, ezeknek a gyökereknek a száma . A Fourier-transzformációt alkalmazzuk a polinomok együtthatóinak konvolúciójának helyettesítésére és :  - Fourier-képeik szorzatára.

ahol a szorzás a vektorok skaláris szorzatát jelenti.

Tegyük fel, hogy van kettő hatványa.

A keresés rekurzív módon történik (oszd meg és uralkodj). Az ötlet az, hogy az eredeti polinomot két polinomra osztjuk,

Akkor .

Vegye figyelembe, hogy az összes szám közül csak különbözőek. Ezért a DFT -elem lesz . És mivel a DFT elemekből áll , akkor 1 komplex gyöke lesz a fok gyöke .

Eszközök,

hol és

A komplex számok tulajdonságait használtuk: minden fokának különböző gyökei . .

Kapunk egy rekurzív algoritmust: az
egyik elem DFT-je egyenlő ezzel az elemmel
, hogy megtaláljuk az A DFT-t, az A együtthatókat felosztjuk párosra és páratlanra, két polinomot kapunk , és megkeressük a DFT-t, megkeressük a DFT-t. : for . Bizonyíték van a következő állításra: Az inverz DFT-t a közvetlen DFT-hez hasonlóan találjuk meg, azzal a különbséggel, hogy a pontokat a valós tengelyre szimmetrikus pontoknak vesszük, nem pedig a közvetlen DFT-transzformációnál. Ezenkívül el kell osztani a polinom összes együtthatóját n-nel



Gyökérkivonási algoritmusok

Négyzetgyök

Az egyik négyzetgyök algoritmus a Karatsuba négyzetgyök algoritmus. Ez messze a legismertebb módszer egy n - jegyű szám négyzetgyökének kiszámítására. Ez az algoritmus a gyors Fourier-transzformációt és a Newton-módszert használja 5 M ( n ) bonyolultsággal [7] .

A bemutatott algoritmus Burnickel-Ziegler (Burnikel-Ziegler) Karatsuba felosztásán alapul. Adott egy n egész szám , az algoritmus egyidejűleg kiszámítja egész négyzetgyökét és a megfelelő maradékot, ami a Ez nem aszimptotikusan optimális, de a gyakorlatban nagyon hatékony a műveleti sorrend bonyolultsága mellett, ahol K ( n ) a szorzáshoz szükséges műveletek száma. két n bites szám a Karatsuba algoritmus segítségével. Ennek az alacsony bonyolultságnak az oka a Burnickel és Ziegler által nemrégiben felfedezett gyönyörű Karatsuba részleg, valamint a maradékok gondos kezelése, amely elkerüli a felesleges számításokat.

Tétel . Az SqrtRem algoritmus által 2n bites bemenettel végzett műveletek száma korlátozott

ahol K ( n ) a 2 n bites szám megszorzásához szükséges műveletek száma Karatsuba algoritmusával.

Algoritmus SqrtRem Bemenet: kimenettel: olyan , hogy ha majd visszatér

Algoritmusok a számrendszer átalakításához

Tegyük fel, hogy b bázisból B bázisba konvertál [8] .

Egész számok konvertálásának módjai


1. módszer (Osztás B-vel a számok b bázisábrázolásával). Adott u egész számra
az alak B bázisformátumú reprezentációját kaphatjuk meg , ha ezt csináljuk

, , , óráig .


2. módszer (Szorzás B-vel a b bázisábrázolás használatával). Ha az u szám b bázisbeli reprezentációja formájú , akkor olyan számokkal végzett aritmetikai műveletekkel, amelyek a B bázis formátumában vannak ábrázolva, egy polinomot kaphatunk a ( ( .


1. módszer (a) (Szorzás b-vel a számok B alapú reprezentációjával). Egy adott törtszámhoz és a B bázisban lévő reprezentáció számjegyeinek értékét a következőképpen számíthatja ki: , , ,… ahol {x} jelentése xmod1 = x- . Az eredmény M számjegyre kerekítéséhez a számítás megszakítható a vétel után , és ha {…{{uВ}В}...В} nagyobb, mint 1/2, akkor az értéket növelni kell eggyel. (Megjegyzendő azonban, hogy ez a művelet fordítások végrehajtását vonhatja maga után, amelyeket a B bázis aritmetikai műveleteivel kell az eredményben szerepeltetni. A számítások megkezdése előtt egyszerűbb lenne egy konstanst hozzáadni az eredeti u számhoz , de ez hibás eredményhez vezethet, ha számítógépen a szám nem ábrázolható pontosan b alapformátumban. Vegye figyelembe azt is, hogy az eredmény kerekíthető ha -ra ). 2. módszer (a) (Szorzás B-vel a b bázis reprezentációjával). Ha egy szám ábrázolása b bázisban alakja , akkor a B bázis formátumában megjelenő számokkal végzett aritmetikai műveletek segítségével egy polinomot kaphatunk ((… + …) + alakban .


A törtszámok átalakításának módjai


1. b) módszer (Szorzás b-vel a számok B alapú reprezentációjával). Egy adott u törtszámhoz a következőképpen számíthatja ki a reprezentációja bitjeinek értékét a B bázisban: , , ,… ahol {x} azt jelenti, hogy xmod1 = x- . Az eredmény M számjegyre kerekítéséhez a számítás megszakítható a vétel után , és ha {…{{uВ}В}...В} nagyobb, mint 1/2, akkor az értéket növelni kell eggyel. (Megjegyzendő azonban, hogy ez a művelet fordítások végrehajtását vonhatja maga után, amelyeket a B bázis aritmetikai műveleteivel kell az eredményben szerepeltetni. A számítások megkezdése előtt egyszerűbb lenne egy konstanst hozzáadni az eredeti u számhoz , de ez hibás eredményhez vezethet, ha számítógépen a szám nem ábrázolható pontosan b alapformátumban. Vegye figyelembe azt is, hogy az eredmény kerekíthető ha -ra ).


2. b) módszer (Osztás b-vel a számok B alapú reprezentációjával). Ha az u számot a b bázisban mint , akkor a B bázisban végrehajtott aritmetikai műveletek segítségével úgy számíthatjuk ki . Gondosan figyelemmel kell kísérni azokat a hibákat, amelyek a b-vel történő osztási művelet során csonkolva vagy kerekítve fordulnak elő; általában jelentéktelenek, de ez nem mindig van így.

Többszörös precíziós transzformáció


A legkényelmesebb a nagyon hosszú számok konvertálását bitblokkok átalakításával kezdeni, amelyeken a műveleteket egyetlen pontossággal lehet végrehajtani. Ezután kombinálja ezeket a blokkokat egyszerű módszerekkel, amelyek a többszörös pontosságra jellemzőek. Legyen például 10n a gépi szóméretnél kisebb 10-el kisebb hatvány. Ezután:
a) egy egész szám "szám többszörös pontosságú binárisról decimálisra konvertálásához meg kell szorozni 10n-nel (így binárisról decimálisra konvertálni 10n bázissal az 1. a módszerrel); egyetlen pontosságú műveletek segítségével, n tizedesjegyet kapunk minden egyes reprezentációs egységhez a 10n bázisban;
b) a többszörös pontosságú szám törtrészének binárisból decimálissá konvertálásához hasonló módon járjunk el úgy, hogy megszorozzuk a következővel: (azaz a 2. módszerrel, a, ahol B \u003d 10n); c) egy egész szám többszörös pontosságú decimálisról binárisra konvertálásához először n bites blokkokat konvertálunk; majd a 10n bázisból binárissá konvertálásához használja az 1. b módszert; d) Több pontosságú törtrész decimálisról binárisra konvertálásához először konvertálja át 10n bázisra a (c) eljárás szerint, majd használja a 2. b) módszert.

Osztási algoritmusok

Az n bites u számot egy v n bites számmal osztó algoritmusnak két n bites számot kell eredményeznie - u mod v és u div v. Az alábbiakban ismertetett algoritmusok a gyakorlatban nem alkalmazhatók, mivel nem két n bites számot, hanem valós számot találnak az osztás eredményeként.

Elméletileg egy n-bites u szám elosztása egy n-bites v számmal, először találhat egy n-bites közelítést az 1/v számhoz, majd megszorozhatja u-val, ami közelítést ad a -hoz , és végül hajtson végre egy másik szorzást, hogy egy kis korrekciót végezzen, hogy megbizonyosodjon az egyenlőtlenség érvényéről . A fentiek alapján elegendő egy hatékony algoritmus, amely egy adott n bites számból egy n bites szám inverzének közelítő értékét képezné. Ezután alkalmazza az n bites számok szorzására szolgáló algoritmust. [9]


R algoritmus (A reciprok nagy pontosságú megszerzése) Legyen a v számnak bináris reprezentációja , ahol . Ez az algoritmus kiszámítja a szám z közelítését úgy, hogy . R1 (kezdeti tipp) Rendelje hozzá és . R2 (Newton-iteráció) Itt van a z szám bináris formában , az osztópont és az előjelekkel . Számítsa ki pontosan a gyorsszorzó programmal . Ezek után számold ki, hogy pontosan hol . Ezután rendelje hozzá , ahol , amely kielégíti az egyenlőtlenséget , szükség szerint hozzáadódik a kerekítéshez , hogy többszöröse legyen . És végül kiosztani . R3 Ha , akkor térjen vissza az R2 lépéshez; ellenkező esetben az algoritmus végrehajtása véget ér.



Egyéb algoritmusok

Jegyzetek

  1. 1 2 3 Richard P. Brent és Paul Zimmermann, Modern számítógépes aritmetika
  2. Donald E. Knuth "A számítógépes programozás művészete", 4.3.1
  3. Donald E. Knuth "A számítógépes programozás művészete", 4.3.3. szakasz, A rész
  4. A Szovjetunió Tudományos Akadémia jelentései 150 (1963), 496-498
  5. Toom 4-utas szorzás - GNU MP 5.1.3 . Letöltve: 2013. december 13. Az eredetiből archiválva : 2013. március 14..
  6. Donald E. Knuth "A számítógépes programozás művészete", 4.3.3. szakasz, C rész
  7. Paul Zimmermann. Karatsuba négyzetgyökér. [Kutatási jelentés] RR-3805, 1999, 8. o. < inria-00072854 Archiválva : 2014. december 2. a Wayback Machine -nél >
  8. Donald E. Knuth "A számítógépes programozás művészete", 2. kötet, 4.4.
  9. Donald E. Knuth "A számítógépes programozás művészete", 2. kötet, 4.3.3.

Irodalom

  • Donald E. Knuth, " The Art of Computer Programming ", 2. kötet, "Seminumerical Algorithms", 3. kiadás, Addison-Wesley, 1998
  • Dan Zuras, "A nagy egészek négyzetesítéséről és szorzásáról", ARITH-11: IEEE szimpózium a számítógépes aritmetikáról, 1993, pp. 260-tól 271-ig.
  • DAN SSSR 150 (1963), 496-498
  • Richard P. Brent és Paul Zimmermann, Modern számítógépes aritmetika
  • Elektronikus eszközök és vezérlőrendszerek: Nemzetközi Tudományos és Gyakorlati Konferencia (2010. október 13-16.) beszámolóinak anyaga. - Tomszk: V-Spectrum, 2011: 2 óra - 2. rész  - 178 p. ISBN 978-5-91191-223-6 , 123-129.