/* * http://gmplib.org/ * * gcc gcd-gmp.c -o gcd-gmp -lgmp * */ #include #include #include void gcd2 (mpz_t r, mpz_t a1, mpz_t b1) { mpz_t a, b; mpz_init_set (a, a1); mpz_init_set (b, b1); while (mpz_sgn (b) != 0) { mpz_set (r, b); /* r = b; */ mpz_mod (b, a, b); /* b = a % b; */ mpz_set (a, r); /* a = r; */ } mpz_set (r, a); mpz_clear (a); mpz_clear (b); } void gcdn (mpz_t r, mpz_t a[], size_t n) { size_t i; mpz_set (r, a[0]); for (i = 1; i < n; i++) gcd2 (r, r, a[i]); /* mpz_gcd ;-) */ } int main (int argc, char *argv[]) { mpz_t *a, g; int i, n; if (argc > 1) { n = argc - 1; a = (mpz_t *) malloc (n * sizeof (mpz_t)); if (!a) return EXIT_FAILURE; for (i = 1; i <= n; i++) mpz_init_set_str (a[i - 1], argv[i], 10); mpz_init (g); gcdn (g, a, n); mpz_out_str (NULL, 10, g); printf ("\n"); mpz_clear (g); for (i = 1; i <= n; i++) mpz_clear (a[i - 1]); free (a); } return EXIT_SUCCESS; }