GMP


gmp je knihovna na praci z velkejma cislama. Je dost rychla(presto ze neni v asembleru-je soucasti gnu projektu) a to hlavne proto ze ma nekolik algoritmu- na kratka cisla,trochu delsi atd...a vybere ten nejspravnejsi. Takze kdyz se to cislo vejde do integeru pocita z inegerem. Vsechny fce jsou rozdeleny do nekolika casti:
mpz_[nejaky pokracovani]
signed integer
mpq_
realna cisla
mult
pro kompatibility z bsd mp(itom,madd,mult)
mpn_
vlastne interni rutinky-daji se vyuzit kdyz chcete opravdu kodovat..
vsechno to ma vystupni pred vstupnima-jako memcpy atd proste cil,zdroj

taky nesmite zapomenout ze cisla v tyhle knihovne jsou ukazatele takze fungujou jako varovy promeny v pascalu.. jednou se mi to celkem vymstilo :)

pouziva naslodujicy type:
MP_INT - dlouhej integer
MP_RAT - dlouhy realny cislo
taky pozuiva limb coz je cast presnyho cisla co se vejde do wordu

Inicializace

nez jakoukoliv pramenou zacnete pouzivat je nutne ji nainicializovat. automaticky se alokuje potrebna pamet-to se da zmenit pomoci mpz_realloc inicializace vypada takto:
MP_INT blb;
mpz_init(& blb); samozdrejme je i mpq_init
a cistise:
mpz_clear(& blb);
taky je treba nezapomenout ze kdyz napisete blb1=blb2 tak se na sebe nasmerojou ukazatele a obe promene maji stejny misto v pameti..proste na jakoukoliv praci pouzivat mpcacky knihovny

taky na inicializaci je fce mpz_aray_init(aray[],pocet prvku pole,pocet limbu na cislo); to je na rychlou alokaci stejne dlouhych ciseldalsi fce jsou popsany v info/mpw zaklad:

Nastavovani

Pro nastavovani funkci slouzi cela skupina funkci:
void mpz_set(MP_INT *cil,MP_INT zdroj);
void mpz_set_ui(MP_INT *cil,unsigned long cislo);
void mpz_set_si(MP_INT *cil,signed long cislo);
void mpz_set_str(MP_INT *cil,char *cislo,int soustava);
(ATD..)
Fungujou jako = ale zalezi na tom, z jakeho typu chcete nastavovat(MP_INT, unsigned long nebo string)
mpz_set_str(& blb,"123456789012345678901234567890",10);
a je tam!

Existuji i kombinace jako:mpz_init_set,mpz_init_set_ui atd..

dal jsou mpz_get* fce ktery zase vracej hodnotu nebo ji uriznou kdyz se nevejde

mpz_get_str ma format(string,soutava,velky cislo); na to pozor!

Aritmetika

(vsechny berou v poradi product,prvni cinitel,druhej)
ne tedy += ale opravdovy +a maji samozdrejme zase verzi _ui pak to jinak formatovany je jako druhy..pokud vim nejsou tu *_str atd... proste pouze _ui a fce jsou mpz_add, sub, mul, div, mod, divmod, mdiv, mmod, mdivmod, sqrt... proste se kouknete do infa...Ma i logicky funxe stylu add,xor atd..

input/output

mpz_inp_raw(cislo,FILE *stream) nacteni byto ze vstupu
mpz_imp_str nacteni stringu mpz_out_raw(stream,cislo) pro vystup atd..

vsechny tyto fce jsou i pro mpq_ pak jsou taky ty low level ale ty tu popisovat nebudu

Je to fakt pekna knihovna..moc jsem se zni bavil je rychla a normalne velky cisla delaji velky problemy tady ne.. moc peknej program napsanej pomoci ni je bc je to skvela vec mozna o ni taky neco napisu


Tento soubor je soucasti rozsahle sbirky skolicek na http://www.ucw.cz/~hubicka/skolicky

Take si muzete prohlidnout jeji puvodni textovou podobu

Nebo mi mailnout na hubicka@ucw.cz

Copyright (C) Jan Hubicka 1995