From bbs@floyd.upol.czMon Jan 29 16:26:39 1996 Date: Mon, 29 Jan 1996 16:22:03 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: Skilicka #5-gmp (fwd) *** Forwarded file follows *** Posted By: kotelnik (kotelnik) on 'Linux' Title: Skilicka #5-gmp Date: Wed Dec 6 15:58:29 1995 No uz jsem tu napsal o par programcich a tak jsem se rozhodl prozmenu popsat nejakou tu knihovnu tak tedy: (stale jeste cekam ze se ke mne nekdo prida :) 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_ - 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 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: void mpz_set(MP_INT *cil,MP_INT zdroj); void mpz_set_ui(MP_INT *cil,unsigned long cislo); oba fungujou jako = ale prvni bere dlouhy cislo a druha fce bere normalniho long dale jsou *_si pro signed long *_str pro string to ma jeste jeden parametr navic pro soustavu tedy mpz_set_str(&blb,"123456789012345678901234567890",10); a je tam!a pak kombinace style:mpz_init_set,mpz_init_set_ui etc.. 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! a 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,atd proste se kouknete do infama i logicky funxe stylu add,xor atd.. ia inout/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 Kotelnik ......a ten nejkotlivejsi......