# gmp_gcd

(PHP 4 >= 4.0.4, PHP 5)

gmp_gcdCalculate GCD

### Description

resource gmp_gcd ( resource \$a , resource \$b )

Calculate greatest common divisor of a and b. The result is always positive even if either of, or both, input operands are negative.

### Parameters

a

It can be either a GMP number resource, or a numeric string given that it is possible to convert the latter to a number.

b

It can be either a GMP number resource, or a numeric string given that it is possible to convert the latter to a number.

### Return Values

A positive GMP number that divides into both a and b.

### Examples

Example #1 gmp_gcd() example

``` <?php\$gcd = gmp_gcd("12", "21");echo gmp_strval(\$gcd) . "\n";?> ```

The above example will output:

```3
```

### User Contributed Notes 6 notes

bigkm1 at gmail dot com
7 years ago
``` here is an elegant recursive solution <?php    function gcd(\$a,\$b) {     return (\$a % \$b) ? gcd(\$b,\$a % \$b) : \$b; } ?> ```
sean__remove__ at eternalrise_r_emove__ dot com
5 years ago
``` Here's my solution for getting the GCD of several numbers. <?php /*  * function gcd()  *  * returns greatest common divisor  * between two numbers  * tested against gmp_gcd()  */ function gcd(\$a, \$b) {     if (\$a == 0 || \$b == 0)         return abs( max(abs(\$a), abs(\$b)) );             \$r = \$a % \$b;     return (\$r != 0) ?         gcd(\$b, \$r) :         abs(\$b); } /*  * function gcd_array()  *  * gets greatest common divisor among  * an array of numbers  */ function gcd_array(\$array, \$a = 0) {     \$b = array_pop(\$array);     return (\$b === null) ?         (int)\$a :         gcd_array(\$array, gcd(\$a, \$b)); } ?> ```
limas at kultur-online dot at
6 years ago
``` The previous function returns just 1 under php 5.2.4  but the following seems to work (m>0,n>0): function gcd(\$m,\$n) {     \$_m=\$m;\$r=1;     if(\$m<\$n){\$t=\$m;\$m=\$n;\$n=\$t;}        while(\$r)     {         \$r=(floor(\$m/\$n)*\$n)-\$m;              \$_n=\$n;\$n=\$r;\$m=\$_m;     }         return abs(\$_n); } ```
Ludwig Heymbeeck
11 years ago
``` The following function is more accurate: function GCD(\$num1, \$num2) { /* finds the greatest common factor between two numbers */    while (\$num2 != 0){      \$t = \$num1 % \$num2;      \$num1 = \$num2;      \$num2 = \$t;    }    return \$num1; } ```
x-empt-php dot net at ispep dot cx
11 years ago
``` No need to compile gmp functions in just for the GCD function...  use this one instead: function GCD(\$num1, \$num2) {  /* finds the greatest common factor between two numbers */     if (\$num1 < \$num2) {         \$t = \$num1;         \$num1 = \$num2;         \$num2 = \$t;     }     while (\$t = (\$num1 % \$num2) != 0) {         \$num1 = \$num2;         \$num2 = \$t;     }     return \$num2; } ```
-1
scr02001 at student dot mdh dot se
10 years ago
``` If you do not consier a or b as possible negative numbers, a GCD funktion may return a negative GCD, wich is NOT a greatest common divisor, therefore a funktion like this may be better. This considers the simplyfying of (-3)-(-6) where gcd on -3 and -6 would result in 3, not -3 as with the other function. (-3)-(-6) is (-1)-(-2) NOT (1)-(2) function eGCD(\$a,\$b){   if(\$a < 0)         \$a=0-\$a;   if(\$b < 0 )        \$b=0-\$b;   if(\$a == 0 || \$b == 0)    return 1;   if(\$a == \$b)              return a;   do{   \$rest=(int) \$a % \$b;  \$a=\$b; \$b=\$rest;   }while(\$rest >0); return \$a; } ```