aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/pgcd.c
blob: a72a8a75c140ef4ae7d4720b8faa415b5930f1a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "precision.h"

/*
 * Euclid's Algorithm
 *
 * Given u and v, calculated and return their greatest common divisor.
 */
precision pgcd(u, v)
   precision u, v;
{
   precision u3 = pnew(pabs(pparm(u))), v3 = pnew(pabs(pparm(v)));
   precision q  = pUndef, r  = pUndef;

   while (pnez(v3)) {
      pdivmod(u3, v3, &q, &r);
      pset(&u3, v3);
      pset(&v3, r);
   }

   pdestroy(v3);
   pdestroy(q);  pdestroy(r);  
   pdestroy(u);  pdestroy(v);
   return presult(u3);			/* result always positive */
}