# gmp (thing)

See all of gmp, no other writeups in this node.

Return to gmp (thing)

- From the documentation:
*[GNU MP] is a [library] for [arbitrary precision] arithmetic, operating on signed [integers], [rational] numbers, and [floating point] numbers. It has a rich set of [functions], and the functions have a regular interface.*
So, anyway, it does [bignum]s. I felt like learning the [API] to this library, so I wrote this fun little program for [factoring] arbitrary integers today: #include <stdio.h> #include <gmp.h> void factors(mpz_t); void firstfactor(mpz_t, mpz_t, mpz_t); int main(int argc, char **argv) { mpz_t x; mpz_init(x); while(!feof(stdin)) { mpz_inp_str(x, stdin, 10); factors(x); } return 0; } void firstfactor(mpz_t x, mpz_t left, mpz_t fact) { mpz_t n, quot, rem; mpz_init(quot); mpz_init(rem); mpz_init_set_si(n, 2); while(mpz_cmp(n, x) < 0) { mpz_tdiv_qr(quot, rem, x, n); if(mpz_cmp_si(rem, 0)==0) { mpz_set(left, quot); mpz_set(fact, n); return; } mpz_add_ui(n, n, 1); } mpz_set_si(left, -1); mpz_set(fact, x); return; } void factors(mpz_t x) { mpz_t fact, left; mpz_init(fact); mpz_init(left); while(1){ firstfactor(x, left, fact); mpz_out_str(stdout, 10, fact); printf(" "); if(mpz_cmp_si(left, -1)==0) break; mpz_set(x, left); } printf("\n"); return; } | Existing:Non-Existing: |