summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor <pashev.igor@gmail.com>2011-01-28 20:52:53 +0300
committerIgor <pashev.igor@gmail.com>2011-01-28 20:52:53 +0300
commit11573800c0ac84fdb355b068dffe309569237b3b (patch)
tree2218fc3e7346ef548ba18a731db54ca01646b65f
parent0d3412d3ef23c30d1212ef92b3cb7c1453236102 (diff)
downloadgcd-11573800c0ac84fdb355b068dffe309569237b3b.tar.gz
GNU MP
-rw-r--r--gcd-gmp.c62
1 files changed, 62 insertions, 0 deletions
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 <stdlib.h>
+#include <stdio.h>
+#include <gmp.h>
+
+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;
+}
+