TemidaLib sistem za rad sa velikim brojevima TemidaLib Multiprecision Arithmetic Library Jelena Tomašević i Milena Vujošević-Janičić Matematički fakultet, Univerzitet u Beogradu Studentski trg 16, 11000 Beograd, Srbija www.matf.bg.ac.yu/~jtomasevic, www.matf.bg.ac.yu/~milena July 15, 2006 Apstrakt Izračunavanja nad celim i realnim brojevima sa proizvoljnom tačnošću su vitalna u mnogim primenama računarstva. Postoji mnoštvo metoda i raspoloživih sistema koji se bave ovom problematikom. Naša biblioteka, TemidaLib, je implementirana u programskom jeziku C++. Ona obezbe uje izračunavanja proizvoljne tačnosti nad celim brojevima i razlomcima. Computations with arbitrary precision over integers and reals are often vital in many computer applications. There is a number of systems that address these problems. Our library, TemidaLib, is implemented in programming language C++. It provides support for arithmetic over integers and fractions with arbitrary precision. 1 Uvod Osnovni numerički tipovi podataka koji su dostupni u većini proceduralnih programskih jezika (C, C++, Fortran...) ograničeni su fiksnom veličinom i impliciranom preciznošću koja zavisi od tipa podatka i od procesora. Brojeve koji ne mogu da budu smešteni u osnovni tip podataka (na primer, celi brojevi koji imaju više od 10 cifara) zovemo veliki brojevi. Za ove brojeve, izvo enje čak i osnovnih računskih operacija, zbog svoje vremenske zahtevnosti, nameće razvijanje posebnih metoda. Ti metodi čine oblast koju zovemo računarska aritmetika proizvoljne tačnosti. Temida, u grčkoj mitologiji jedna od titanki, oličava večite zakone koji vladaju u kosmosu. U nastavku ovog teksta, ukratko ćemo opisati aritmetiku proizvoljne tačnosti (poglavlje 2): neke njene metode ( 2.1), njene primene ( 2.2) kao i neke postojeće sisteme koji imaju podršku za aritmetiku proizvoljne tačnosti ( 2.3). U drugom delu rada, prikazaćemo našu biblioteku, TemidaLib za rad sa velikim brojevima (poglavlje 3): motivaciju za njen razvoj ( 3.1), njene funkcionalnosti ( 3.2), interfejs( 3.3) i efikasnost ( 3.4). U poglavlju 4 navešćemo zaključke i moguće pravce za dalji rad. 2 Aritmetika proizvoljne tačnosti Aritmetika proizvoljne tačnosti je računarska tehnika koja omogućava izvršavanje izračunavanja nad celim i realnim brojevima sa proizvoljnom preciznošću. Polazna ideja je da se brojevi u odgovarajućoj osnovi čuvaju kao nizovi cifara promenljive dužine. Na taj način, broj cifara ograničen je samo raspoloživom memorijom sistema. 2.1 Primeri efikasnih operacija za rad sa velikim brojevima Veliki broj u osnovi B sa n cifara može se prikazati na sledeći način: = x 0 + x 1 B + x 2 B 2 +... + x n 1 B n 1 Koeficijenti x i (i = 0, 1,..., n 1) su cifre broja u osnovi B i zadovoljavaju uslov 0 x i < B. 1
Algoritmi za sabiranje i oduzimanje velikih brojeva veličine n, kao i za množenje i deljenje velikog broja veličine n sa brojem osnovnog tipa podatka je složenosti O(n). Množenje velikih brojeva Za množenje dva velika broja veličine n postoje algoritmi za množenje sa složenosti O(n log(n)) zasnovani na brzim Furijeovim transformacijama [12]. Karatsuba algoritam za množenje brojeva je složenosti O(n log(3) log2 ) = O(n 1.5849... ). Karatsuba [14] je prvi primetio da množenje dva velika broja veličine n može biti brže od O(n 2 ). Tehnika je rekurzivne prirode. Polazeći od velikih brojeva i Y veličine n, vrši se njihovo deljenje na dva dela: [ n ] = 0 + B m 1, Y = Y 0 + B m, m = 2 Proizvod brojeva i Y može se prikazati na sledeći način: Y = 0 Y 0 + B m ( 0 + 1 Y 0 ) + B 2m 1. To znači da je za odre ivanje proizvoda brojeva i Y potrebno izračunati sledeća četiri proizvoda: 0 Y 0, 0, 1 Y 0 i 1. Ideja algoritma je da se proizvod brojeva i Y prikaže na sledeći način: Y = P 0 + B m (P 1 P 2 P 0 ) + B 2m P 2 i da se umesto četiri proizvoda, izračunaju sledeća tri: P 0 = 0 Y 0, P 1 = ( 0 + 1 )(Y 0 + ), P 2 = 1. Osim ova tri proizvoda, izvršavaju se i dva puta operacije sabiranja i oduzimanja brojeva veličine n 2. Operacija množenja brojeva i Y se dalje nastavlja rekurzivno pa je složenost algoritma jednaka [2]: O(n log23 ) = O(n 1.5849... ) Deljenje velikih brojeva Deljenje dva velika broja i Y reprezentovana u osnovi B može se ostvariti sledećim postupkom 1, razlikovanjem dva slučaja: 1 Ovaj postupak razvijen je u toku rada na biblioteci Temidalib 1. Ukoliko je Y, broj Y se množi sa B sve dok je manji od (označimo ga sa ). Neka je u tom cilju izvršeno k množenja brojem B. Tada važi: Y = B k, = B k Y (1) Radi efikasnosti, množenje osnovom koja je stepen broja dva može se ostvariti šiftovanjem cifara velikog broja Y ulevo. Neka se n puta sadrži u od broja se oduzima sve dok je pozitivan broj. Novodobijeno je ostatak pri deljenju starog sa. Označimo sa 1 konačnu vrednost tog ostatka. Tada važi: = n + 1, 0 1 < (2) Izračunavanje broja nastavlja se rekurzivno. Na osnovu (1) i (2) dobija se: Y = (n + 1 ) B k 2. Ukoliko je < Y, broj se množi sa B sve dok je manji od Y. Neka je izvršeno l množenja. Tada važi: 1 Y = 1 Y 1 B l, 1 = B l (3) Neka se Y m puta sadrži u 1 od broja 1 se oduzima Y sve dok je 1 pozitivan broj. Novodobijeno 1 je ostatak pri deljenju starog 1 sa Y. Označimo sa 2 konačnu vrednost tog ostatka. Tada važi: 2 Y 1 Y = m + 2 Y, 0 2 < Y (4) se izračunava rekurzivno. Na osnovu (3) i (4), rešenje je Y = (m + 2 Y ) 1 B l Opisani postupak može se koristiti za odre ivanje proizvoljnog broja cifara količnika. 2
2.2 Primene Aritmetika proizvoljne tačnosti ima široku i značajnu primenu u računarstvu. Koristi se za izračunavanje matematičkih konstanti (na primer, broja π) na više miliona tačnih cifara, za izračunavanje velikih prostih brojeva itd. Aritmetika proizvoljne tačnosti koristi se i za rešavanje sistema jednačina u kojima vrednosti nepoznatih mogu da se razlikuju za mnogo redova veličina. Ipak, najznačajnije primene su u kriptografiji. Kriptografija Sa razvojem računarskih mreža kriptografija sve više dobija na značaju. Poruke koje se prenose su ranjive za prisluškivačke taktike i osnovni cilj kriptografije je očuvanje tajnosti poruke. Algoritmi za kriptovanje dele se na simetrične i asimetrične. Simetrični algoritmi ili algoritmi sa tajnim ključem su oni kod kojih se ključ za dešifrovanje može izvesti iz ključa za šifrovanje i obrnuto (ova dva ključa su često identična). Asimetrični algoritmi ili algoritmi sa javnim ključem koriste dva ključa: ključ za šifrovanje koji je javan (dostupan svima) i ključ za dešifrovanje koji je tajni ključ. Svako može šifrovati poruku, ali samo onaj ko ima odgovarajući tajni ključ može da je dešifruje. Asimetrični algoritmi obično se koriste za bezbednu razmenu ključa za neki simetrični algoritam. RSA algoritam je najšire korišćen asimetrični algoritam [2]. Procenjuje se da je više od 95% zaštićene komunikacije zasnivano na korišćenju RSA algoritma. Javni i tajni ključevi izvode se iz para velikih prostih brojeva (od 100 i više dekadnih cifara). Smatra se da je odre ivanje poruke na osnovu šifrovane poruke i ključa za šifrovanje ekvivalentno faktorisanju proizvoda dva velika prosta broja. Upotrebljivost RSA algoritma zasniva se na tome što je, uz korišćenje efikasnih biblioteka za rad sa velikim brojevima, moguće u deliću sekunde generisati ključeve, šifrovati i dešifrovati poruke dok razbijanje RSA algoritma putem faktorisanja velikog broja može, na današnjim računarima, da utroši hiljade godina. Iako su se poslednjih godina granice algoritama celobrojnog faktorisanja veoma proširile, što je delom prouzrokovano bržim računarima, a delom algoritamskim poboljšanjima, još uvek nije poznat nijedan polinomijalni algoritam za faktorisanje. Kriptovanje na bazi eliptičkih krivih je asimetrični sistem koji je najčešće efikasniji i koristi kraće ključeve, a pruža istu ili veću sigurnost u odnosu na RSA algoritam [11]. Zajedničko za RSA algoritam i algoritam kriptovanja eliptičkim krivama je da svoju sigurnost zasnivaju na težini problema koji nastaju pri računanju sa velikim brojevima (sa više stotina cifara). I jedan i drugi zahtevaju efikasne operacije nad velikim brojevima, uključujući izračunavanje diskretnog logaritma, i slične funkcije. 2.3 Postojeći sistemi za rad sa velikim brojevima Jedna od najranijih, široko rasprostranjenih, implementacija aritmetike proizvoljne tačnosti bila je u programskom jeziku MacLisp [10]. Kasnije, VA/VMS operativni sistem nudio je rad sa velikim brojevima kao deo kolekcije string funkcija. Danas su biblioteke za rad sa velikim brojevima dostupne u mnogim programskim jezicima. Matematički paketi (kao što su Mathematica, Maple computer algebra system i Macsyma computer algebra) direktno daju mogućnost rada sa neograničenom preciznošću. Me utim, oni su najčešće veoma neefikasni jer nisu namenjeni numeričkom izračunavanju. Za praktičnu upotrebu, biblioteke u nekim programskim jezicima (najčešće u jezicima C ili C++) su mnogo efikasnije. Neke od kvalitetnih raspoloživih biblioteka za rad sa velikim brojevima su: GNU Multi-Precision Library [15], napisana u programskom jeziku C, podržava rad sa celim, racionalnim i realnim brojevima. Ova biblioteka podržava različite implementacije za sve operacije, u zavisnosti od veličine operanada, u cilju postizanja dobre efikasnosti u svim slučajevima; SIMATH [7], biblioteka fokusirana na algebarsku teoriju brojeva. Podržava rad sa celim, racionalnim i realnim brojevima. MIRACL [8], biblioteka za rad sa celim i racionalnim brojevima napisana u programskom jeziku C++. Podržava sve osnovne aritmetičke operacije kao i sve operacije neophodne za implementiranje RSA algoritma i kriptovanja eliptičkim krivim; 3
CLN (Class Library for Numbers) [16], biblioteka u programskom jeziku C++, za rad sa celim, racionalnim, realnim i kompleksnim brojevima. Podržava sve elementarne operacije i relacije. Lako se integriše u veće softverske pakete; libg++ [9], biblioteka za GCC kompajler sa podrškom za aritmetiku proizvoljne tačnosti celih i racionalnih brojeva. Podržava sve elementarne operacije i relacije. 3 Opis sistema TemidaLib Naša biblioteka TemidaLib razvijena je za rešavanje jednog konkretnog problema ali je otvorena za dalja proširenja. 3.1 Početna motivacija Problem iskazne zadovoljivosti (sat) je tipičan npkompletan problem [5]. Za ovaj problem, kao i za mnoge druge np-kompletne probleme eksperimentalno je uočena tzv. fazna promena: u odnosu na parametar L/N (L je broj klauza, a N broj promenljivih u formuli koja je u konjunktivnonormalnoj formi), procenat zadovoljivih formula pada od 100% do 0%, pri čemu je taj pad nagao i dešava se u okolini tačke fazne promene. Na primer, za 3-sat problem (sve klauze su dužine tri), ta tačka je približno jednaka 4.25. U radu [3], predstavljena je nova klasa sat problema k-gd-sat, koji je generalizacija k-sat i gdsat [4] problema. U k-gd-sat problemu, dužina klauze ima geometrijsku raspodelu, kontrolisanu parametrom p koji predstavlja verovatnoću; za p = 1, k-gd-sat postaje k-sat problem. Razmatra se fazna promena izme u zadovoljivih i nezadovoljivih, slučajno generisanih instanci k-gd-sat formula. Eksperimentalni rezultati ukazuju na to da postoji veza (linearna po parametru 1/p) izme u tačaka fazne promene. Interesantna je i veza izme u tačaka fazne promene za k-sat i k-gd-sat probleme. U cilju dobijanja tačaka fazne promene c k za k-sat probleme ako su poznate tačke fazne promene c φ za k-gdsat probleme (k i p je fiksirano), javlja se potreba za rešavanjem u visokoj tačnosti sistema jednačina (po promenljivim c l ) zasnovanog na Gent-Walsh [6] hipotezi: l=k φ(l) c l = 1 c φ gde je φ(l) verovatnoća generisanja klauze dužine l u k-gd-sat modelu. Za k-gd-sat model sa parametrom p, dobijamo: l=k p(1 p) l k c l = 1 c(k, p) Za fiksirano k, za različite vrednosti p (p i ), ovaj sistem se aproksimira sistemom jednačina (po promenljivim x i ): x 1 + a 1 x 2 +... + a n 1 1 x n = b 1 x 1 + a 2 x 2 +... + a n 1 2 x n = b 2... (5) x 1 + a n x 2 +... + a n 1 n x n = b n pri čemu su a 1, a 2,..., a n parovi me u sobom različitih realnih brojeva i važi a i = 1 p i, b i = 1/(p i c(k, p i )) i x i = 1/(c k+i 1 ). Ovaj sistem ima sledeće (jedinstveno) rešenje [13]: n x j = ( 1) n+j b i f ij (a i=1 i a 1 )... (a i a i 1 )(a i a i+1 )... (a i a n ) (6) gde je f ij suma svih mogućih proizvoda po n j od n 1 brojeva a 1, a 2,..., a i 1, a i+1,..., a n. Za racionalne brojeve p i i racionalnu aproksimaciju vrednosti c(k, p i ), navedeni sistem može se (za proizvoljno veliko n) egzaktno rešiti predstavljanjem nepoznatih u vidu razlomaka i korišćenjem velikih celih brojeva. Sve operacije u toku izračunavanja rešenja sistema mogu se svesti na operacije nad celim brojevima; rešenja sistema, nepoznate x i mogu se izraziti u vidu razlomaka sa celobrojnim imeniocima i brojiocima i tek na kraju prikazati kao decimalni brojevi, aproksimirati na zadat broj tačnih cifara. U toku ovakvog rešavaja sistema dobijaju se brojevi sa stotinama cifara u dekadnom zapisu. 3.2 Funkcionalnosti sistema TemidaLib Naša biblioteka TemidaLib obezbe uje specifičnu podršku za rad sa velikim brojevima: sve osnovne 4
operacije se (efikasno) vrše nad celim brojevima, a na njima se zasniva i rad sa razlomcima. Sva izračunavanja nad razlomcima se vrše egzaktno, a njihova vrednost se može prikazati sa proizvoljnim brojem cifara. Radi efikasnosti, u biblioteci TemidaLib se brojevi ne reprezentuju u dekadnom sistemu. Izbor osnove B u kojoj se čuva valiki broj je važan i mora da zadovolji sledeće uslove: osnova B, s jedne strane, mora da bude što je moguće veća kako bi se smanjila veličina reprezentacije velikog broja i cena algoritama koji rade sa njima; sa druge strane, osnova B treba da bude dovoljno mala da staje u osnovni tip podataka. U sistemu TemidaLib, veliki brojevi su predstavljeni u osnovi 256 čime je omogućeno smeštanje cifara broja u tip koji zauzima samo jedan bajt. Ovim se mogu iskoristiti brzina rutina bitovske aritmetike. Brojevni podaci koje unosi korisnik, kao i svi rezultati, daju se u dekadnom sistemu, što iziskuje interne konverzije. Množenje i deljenje velikih brojeva u sistemu TemidaLib, implementirano je metodama opisanim u poglavlju 2.1. 3.3 Interfejs sistema Sistem TemidaLib je implementiran u programskom jeziku C++. Osnovna je klasa za rad sa velikim brojevima u osnovi 256. Podržane su operacije sabiranja, oduzimanja i množenja u punoj tačnosti, sve operacije pore enja, metode za čitanje brojeva iz ulazne datoteke i ispis brojeva u izlaznu datoteku. Postoji i klasa za rad sa razlomcima velikih brojeva. Za nju su tako e podržane operacije sabiranja, oduzimanja i množenja, sve operacije pore enja kao i čitanja razlomaka iz datoteke i njihov ispis u izlaznu datoteku. Podržana je i operacija konverzije razlomka u tip double što se svodi na deljenje brojioca i imenioca (koji su veliki brojevi). Ova operacija deljenja se vrši sa proizvoljnom tačnošću koja se prenosi kao parametar funkciji. Sistem TemidaLib ima podršku i za rešavanje sistema jednačina (6). Podržana je operacija učitavanja koeficijenata sistema iz ulazne datoteke, operacija konverzije ulaznih podataka koji su u osnovi 10 u razlomke velikih brojeva u osnovi 256. Slika 1: Vreme rešavanja sistema (6) korišćenjem biblioteke TemidaLib 3.4 Efikasnost sistema Na slici 1 prikazano je vreme rešavanja sistema (6) za različite dimenzije sistema (vrednosti n). 4 Zaključci i dalji rad U ovom radu ukratko je predstavljen značaj koji aritmetika proizvoljne tačnosti ima u računarstvu. Pored već postojećih sistema za aritmetiku proizvoljne tačnosti, predstavljen je naš sistem TemidaLib. Prikazane su mogućnosti sistema uz osvrt na već postojeće sisteme za aritmetiku proizvoljne tačnosti kao i na njihovu primenu. Ukratko su opisani osnovni principi na kojima je zasnovan sistem TemidaLib i problemi za koje je specijalizovan. Za dalji rad, planiramo dalje proširivanje i unapre ivanje biblioteke. Jedan od glavnih pravaca daljeg rada je njeno obogaćivanje funkcionalnostima potrebnim za primene u kriptografiji. Literatura [1] Cuyt Annie, Kuterna Peter, Verdonk Brigitte, Vervloet Johan. The class library for exact rational arithmetic in Arithmos.- In: Proceedings Real Numbers and Computers RNC4 / Kornerup P., 2000, p. 141-160 [2] Miodrag Živković. Algoritmi. Matematički fakultet, 2000. [3] Milena Vujošević-Janičić, Jelena Tomašević, and Predrag Janičcić. Random k-gd-sat Model and its Phase Transition. Faculty of Mathematics, University of Belgrade (submitted). [4] Predrag Janičić. GD-sat model and crossover line. Journal of Experimental and Theoretical Artificial Intelligence, 13(3):181198, 2001. [5] Stephen A. Cook. The complexity of theoremproving procedures. In STOC 71: Proceedings of the third annual ACM symposium on Theory of computing, pages 151158. ACM Press, 1971. 5
[6] Ian P. Gent and Toby Walsh. The SAT phase transition. In Proceedings of ECAI-94, pages 105109, 1994. [7] Horst Gunter Zimmer. SIMATH - a Computer Algebra System for Number Theoretic Applications. International Symposium on Symbolic and Algebraic Computation, 1997, p. 365-375. [8] Shamus Software Ltd. MIRACL, Multiprecision Integer and Rational Arithmetic C/C++ Library. [9] D. Lea. User s Guide to the GNU C++ Library. URL: http://www.math.utah.edu/docs/info/libg++ toc.html [10] Fast arithmetic in MacLISP. STEELE, G L, J R NASA. Langley Res. Center Proc. of the 1977 MACSYMA Users Conf. (NASA) p 215-224 (SEE N77-28750 19-59); United States; 1977 [11] Elliptic Curve Cryptography, http://world.std.com/dpj.elliptic.htm [12] FFT based multiplication of large numbers. http://numbers.computation.free.fr/constants/algorithms/fft.html [13] Proskuryakov I. V. Zbornik zadataka iz linearne algebre. Nauka, Moskva, 1966. [14] avier Gourdon and Pascal Sebah. Arbitary Precision Computation. http://numbers.computation.free.fr/constants/algorithms/reprezentation.html [15] T Grandlung. GNU multiple precision arithmetic library. Swox AB. September 2004. http://www.swox.com/gmp/ [16] Bruno Haible, CLN, a Class Library for Numbers. URL: http://www.ginac.de/cln/ 6