From 11573800c0ac84fdb355b068dffe309569237b3b Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 28 Jan 2011 20:52:53 +0300 Subject: GNU MP --- gcd-gmp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 gcd-gmp.c (limited to 'gcd-gmp.c') diff --git a/gcd-gmp.c b/gcd-gmp.c new file mode 100644 index 0000000..3de49de --- /dev/null +++ b/gcd-gmp.c @@ -0,0 +1,62 @@ +/* + * 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); +} + +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 = malloc(sizeof(mpz_t) * n); + if (NULL != a) { + 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"); + + /* No need actually before exit */ + mpz_clear(g); + for (i = 1; i <= n; i++) + mpz_clear(a[i-1]); + free(a); + return EXIT_SUCCESS; + } + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + -- cgit v1.2.3