Greatest common divisor: Difference between revisions

Add bruijn
(Add bruijn)
 
(219 intermediate revisions by 89 users not shown)
Line 1:
{{task|Arithmetic operations}}[[Category:Recursion]]
 
{{task|Arithmetic operations}}
 
;Task:
Find the greatest common divisor   ('''GCD''')   of two integers.
 
 
''Greatest common divisor''   is also known as   ''greatest common factor'' '''(gcf)'''   and   ''greatest common measure''.
 
 
 
;Related task:
:*   [https://rosettacode.org/wiki/Least_common_multiple least common multiple].
 
 
;See also:
:*   MathWorld entry:   [http://mathworld.wolfram.com/GreatestCommonDivisor.html greatest common divisor].
:*   Wikipedia entry:     [[wp:Greatest_common_divisor|greatest common divisor]].
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F gcd(=u, =v)
L v != 0
(u, v) = (v, u % v)
R abs(u)
 
print(gcd(0, 0))
print(gcd(0, 10))
print(gcd(0, -10))
print(gcd(9, 6))
print(gcd(6, 9))
print(gcd(-6, 9))
print(gcd(8, 45))
print(gcd(40902, 24140))</syntaxhighlight>
 
{{out}}
<pre>
0
10
10
3
3
3
1
34
</pre>
 
=={{header|360 Assembly}}==
Line 9 ⟶ 53:
For maximum compatibility, this program uses only the basic instruction set (S/360)
with 2 ASSIST macros (XDECO,XPRNT).
<langsyntaxhighlight lang="360asm">* Greatest common divisor 04/05/2016
GCD CSECT
USING GCD,R15 use calling register
Line 40 ⟶ 84:
XDEC DS CL12 temp for edit
YREGS
END GCD</langsyntaxhighlight>
{{out}}
<pre>
gcd( 1071, 1029)= 21
</pre>
 
=={{header|PowerPC Assembly}}==
Compile with:
<pre>
gcc -mbig -mregnames -nostartfiles -nodefaultlibs -o gcd gcd.S
</pre>
 
<syntaxhighlight lang="asm" line="1">
#include <syscall.h>
_gcd_string:
.ascii "gcd("
_gcd_string_len = . - _gcd_string
_gcd_close_string:
.ascii ") = "
_gcd_close_string_len = . - _gcd_close_string
 
.equiv STDIN, 0
.equiv STDOUT, 1
 
.align 4
.section ".text"
.global _start
.section ".opd","aw"
.align 3
_start:
.quad ._start,.TOC.@tocbase,0
.previous
.global ._start
._start:
li r30, 1071
li r31, 1029
# move the loaded values into the argument registers
mr r3, r30
mr r4, r31
bl gcd
# save the result for printing later
mr r29, r3
addis r4, r2, _gcd_string@toc@ha
addi r4, r4, _gcd_string@toc@l
li r5, _gcd_string_len
bl print_string
mr r3, r30
bl print_integer
li r3, ','
bl print_char
mr r3, r31
bl print_integer
addis r4, r2, _gcd_close_string@toc@ha
addi r4, r4, _gcd_close_string@toc@l
li r5, _gcd_close_string_len
bl print_string
mr r3, r29
bl print_integer
li r3, '\n'
bl print_char
li r0,SYS_exit # syscall number (sys_exit)
li r3,0 # first argument: exit code
sc # call kernel
 
gcd:
cmpd r3, r4
bge _gcd
mr r5, r3
mr r3, r4
mr r4, r5
_gcd:
cmpdi r4, 0
beqlr
mr r5, r3
mr r3, r4
modud r4, r5, r4
b _gcd
 
# r4 is the address of the string
# r5 is the length of the string
print_string:
li r0, SYS_write
li r3, STDOUT
sc
blr
 
print_char:
mr r4, r3
li r0, SYS_write
li r3, STDOUT
stb r4, -1(sp)
addi r4, sp, -1
li r5, 1
sc
blr
 
print_integer:
# r3 is the integer to print
# r4 is the working register
# r5 holds the current address to write to the string
# r6 is 10 for division operations
# r7 is working storage
mr r5, sp
li r6, 10
neg r4, r3
cmpdi r3, 0
bne 1f
li r7, '0'
stbu r7, -1(r5)
b 3f
1:
isellt r4, r4, r3 # r4 = abs(r3)
1:
modsd r7, r4, r6
divd r4, r4, r6
addi r7, r7, '0'
stbu r7, -1(r5)
cmpdi r4, 0
beq 1f
b 1b
 
1:
cmpdi r3, 0
blt 2f
3:
mr r4, r5
subf r5, r5, sp
mflr r14
bl print_string
mtlr r14
blr
 
2:
li r7, '-'
stbu r7, -1(r5)
b 3b
</syntaxhighlight>
 
{{out}}
<pre>
gcd(1071,1029) = 21
</pre>
 
=={{header|8th}}==
<langsyntaxhighlight lang="forth">: gcd \ a b -- gcd
dup 0 n:= if drop ;; then
tuck \ b a b
Line 61 ⟶ 242:
 
bye
</syntaxhighlight>
</lang>
{{out}}
<pre>GCD of 5 and 100 = 5
Line 67 ⟶ 248:
GCD of 23 and 7 = 1
</pre>
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program calPgcd64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
sMessResult: .asciz "Number 1 : @ number 2 : @ PGCD : @ \n"
szCarriageReturn: .asciz "\n"
szMessError: .asciz "Error PGCD !!\n"
 
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
 
mov x20,36
mov x21,18
mov x0,x20
mov x1,x21
bl calPGCDmod
bcs 99f // error ?
mov x2,x0 // pgcd
mov x0,x20
mov x1,x21
bl displayResult
mov x20,37
mov x21,15
mov x0,x20
mov x1,x21
bl calPGCDmod
bcs 99f // error ?
mov x2,x0 // pgcd
mov x0,x20
mov x1,x21
bl displayResult
b 100f
99: // display error
ldr x0,qAdrszMessError
bl affichageMess
100: // standard end of the program
mov x0, #0 // return code
mov x8, #EXIT // request to exit program
svc #0 // perform the system call
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrszMessError: .quad szMessError
 
/***************************************************/
/* Compute pgcd modulo use */
/***************************************************/
/* x0 contains first number */
/* x1 contains second number */
/* x0 return PGCD */
/* if error carry set to 1 */
calPGCDmod:
stp x1,lr,[sp,-16]! // save registres
stp x2,x3,[sp,-16]! // save registres
cbz x0,99f // if = 0 error
cbz x1,99f
cmp x0,0
bgt 1f
neg x0,x0 // if negative inversion number 1
1:
cmp x1,0
bgt 2f
neg x1,x1 // if negative inversion number 2
2:
cmp x0,x1 // compare two numbers
bgt 3f
mov x2,x0 // inversion
mov x0,x1
mov x1,x2
3:
udiv x2,x0,x1 // division
msub x0,x2,x1,x0 // compute remainder
cmp x0,0
bgt 2b // loop
mov x0,x1
cmn x0,0 // clear carry
b 100f
99: // error
mov x0,0
cmp x0,0 // set carry
100:
ldp x2,x3,[sp],16 // restaur des 2 registres
ldp x1,lr,[sp],16 // restaur des 2 registres
ret // retour adresse lr x30
/***************************************************/
/* display result */
/***************************************************/
/* x0 contains first number */
/* x1 contains second number */
/* x2 contains PGCD */
displayResult:
stp x1,lr,[sp,-16]! // save registres
mov x3,x1 // save x1
ldr x1,qAdrsZoneConv
bl conversion10 // décimal conversion
ldr x0,qAdrsMessResult
ldr x1,qAdrsZoneConv // insert conversion
bl strInsertAtCharInc
mov x4,x0 // save message address
mov x0,x3 // conversion second number
ldr x1,qAdrsZoneConv
bl conversion10 // décimal conversion
mov x0,x4 // move message address
ldr x1,qAdrsZoneConv // insert conversion
bl strInsertAtCharInc
mov x4,x0 // save message address
mov x0,x2 // conversion pgcd
ldr x1,qAdrsZoneConv
bl conversion10 // décimal conversion
mov x0,x4 // move message address
ldr x1,qAdrsZoneConv // insert conversion
bl strInsertAtCharInc
bl affichageMess // display message
ldp x1,lr,[sp],16 // restaur des 2 registres
ret // retour adresse lr x30
qAdrsMessResult: .quad sMessResult
qAdrsZoneConv: .quad sZoneConv
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
=={{header|ACL2}}==
<langsyntaxhighlight Lisplang="lisp">(include-book "arithmetic-3/floor-mod/floor-mod" :dir :system)
 
(defun gcd$ (x y)
Line 76 ⟶ 402:
nil)
((zp y) x)
(t (gcd$ y (mod x y)))))</langsyntaxhighlight>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">CARD FUNC Gcd(CARD a,b)
CARD tmp
 
IF a<b THEN
tmp=a a=b b=tmp
FI
 
WHILE b#0
DO
tmp=a MOD b
a=b
b=tmp
OD
RETURN(a)
 
PROC Test(CARD a,b)
CARD res
 
res=Gcd(a,b)
PrintF("GCD of %I and %I is %I%E",a,b,res)
RETURN
 
PROC Main()
Test(48,18)
Test(9360,12240)
Test(17,19)
Test(123,1)
Test(0,0)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Greatest_common_divisor.png Screenshot from Atari 8-bit computer]
<pre>
GCD of 48 and 18 is 6
GCD of 9360 and 12240 is 720
GCD of 17 and 19 is 1
GCD of 123 and 1 is 1
GCD of 0 and 0 is 0
</pre>
 
=={{header|ActionScript}}==
<langsyntaxhighlight ActionScriptlang="actionscript">//Euclidean algorithm
function gcd(a:int,b:int):int
{
Line 98 ⟶ 464:
}
return a;
}</langsyntaxhighlight>
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
 
procedure Gcd_Test is
Line 120 ⟶ 487:
Put_Line("GCD of 5, 100 is" & Integer'Image(Gcd(5, 100)));
Put_Line("GCD of 7, 23 is" & Integer'Image(Gcd(7, 23)));
end Gcd_Test;</langsyntaxhighlight>
 
Output:
Line 130 ⟶ 497:
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">o_integer(gcd(33, 77));
o_byte('\n');
o_integer(gcd(49865, 69811));
o_byte('\n');</langsyntaxhighlight>
 
=={{header|ALGOL 60}}==
<syntaxhighlight lang="algol60">begin
comment Greatest common divisor - algol 60;
integer procedure gcd(m,n);
value m,n;
integer m,n;
begin
integer a,b;
a:=abs(m);
b:=abs(n);
if a=0 then gcd:=b
else begin
integer c,i;
for i:=a while b notequal 0 do begin
c:=b;
b:=a-(a div b)*b;
a:=c
end;
gcd:=a
end
end gcd;
outinteger(1,gcd(21,35))
end
</syntaxhighlight>
{{Out}}
<pre>
7
</pre>
 
 
=={{header|ALGOL 68}}==
Line 140 ⟶ 539:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
<langsyntaxhighlight lang="algol68">PROC gcd = (INT a, b) INT: (
IF a = 0 THEN
b
Line 156 ⟶ 555:
INT c = 49865, d = 69811;
printf(($x"The gcd of"g" and "g" is "gl$,c,d,gcd(c,d)))
)</langsyntaxhighlight>
Output:
<pre>
The gcd of +33 and +77 is +11
The gcd of +49865 and +69811 is +9973
</pre>
 
=={{header|ALGOL-M}}==
<syntaxhighlight lang="algol">BEGIN
 
% RETURN P MOD Q %
INTEGER FUNCTION MOD (P, Q);
INTEGER P, Q;
BEGIN
MOD := P - Q * (P / Q);
END;
 
% RETURN GREATEST COMMON DIVISOR OF X AND Y %
INTEGER FUNCTION GCD (X, Y);
INTEGER X, Y;
BEGIN
INTEGER R;
IF X < Y THEN
BEGIN
INTEGER TEMP;
TEMP := X;
X := Y;
Y := TEMP;
END;
WHILE (R := MOD(X, Y)) <> 0 DO
BEGIN
X := Y;
Y := R;
END;
GCD := Y;
END;
 
COMMENT - EXERCISE THE FUNCTION;
 
WRITE("THE GCD OF 21 AND 35 IS", GCD(21,35));
WRITE("THE GCD OF 23 AND 35 IS", GCD(23,35));
WRITE("THE GCD OF 1071 AND 1029 IS", GCD(1071,1029));
WRITE("THE GCD OF 3528 AND 3780 IS", GCD(3528,252));
 
END</syntaxhighlight>
{{out}}
<pre>THE GCD OF 21 AND 35 IS 7
THE GCD OF 23 AND 35 IS 1
THE GCD OF 1071 AND 1029 IS 21
THE GCD OF 3528 AND 3780 IS 252
</pre>
 
=={{header|ALGOL W}}==
<langsyntaxhighlight lang="algolw">begin
% iterative Greatest Common Divisor routine %
integer procedure gcd ( integer value m, n ) ;
Line 171 ⟶ 615:
a := abs( m );
b := abs( n );
ifwhile ab not = 0 thendo begin
newA := b;
endb := a rem b;
else begin a := newA;
while b not = 0 do beginend;
newA := b;a
b := a rem b;
a := newA;
end;
a
end
end gcd ;
 
write( gcd( -21, 35 ) );
end.</lang>
</syntaxhighlight>
 
=={{header|Alore}}==
 
<langsyntaxhighlight Alorelang="alore">def gcd(a as Int, b as Int) as Int
while b != 0
a,b = b, a mod b
end
return Abs(a)
end</langsyntaxhighlight>
 
=={{header|AntLang}}==
AntLang has a built-in gcd function.
<syntaxhighlight lang AntLang="antlang">gcd[33; 77]</langsyntaxhighlight>
 
It is not recommended, but possible to implement it on your own.
<langsyntaxhighlight AntLanglang="antlang">/Unoptimized version
gcd':{a:x;b:y;last[{(0 eq a mod x) min (0 eq b mod x)} hfilter {1 + x} map range[a max b]]}</langsyntaxhighlight>
 
== {{header|APL}} ==
{{works with|Dyalog APL}}
33 49865 ∨ 77 69811
Line 216 ⟶ 656:
 
 
== {{header|ArendelleAppleScript}} ==
 
 
By recursion:
 
<syntaxhighlight lang="applescript">-- gcd :: Int -> Int -> Int
on gcd(a, b)
if b ≠ 0 then
gcd(b, a mod b)
else
if a < 0 then
-a
else
a
end if
end if
end gcd
</syntaxhighlight>
 
And just for the sake of it, the same thing iteratively:
 
<syntaxhighlight lang="applescript">on hcf(a, b)
repeat until (b = 0)
set x to a
set a to b
set b to x mod b
end repeat
if (a < 0) then return -a
return a
end hcf</syntaxhighlight>
 
=={{header|Arendelle}}==
<pre>&lt; a , b &gt;
 
Line 234 ⟶ 706:
 
( return , @b )</pre>
 
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">print gcd [10 15]</syntaxhighlight>
 
{{out}}
 
<pre>5</pre>
 
=={{header|ATS}}==
{{works with|ATS|Postiats 0.4.1}}
 
 
===Stein’s algorithm, without proofs===
 
 
Here is an implementation of Stein’s algorithm, without proofs of termination or correctness.
 
<syntaxhighlight lang="ats">(********************************************************************)
(*
 
GCD of two integers, by Stein’s algorithm:
https://en.wikipedia.org/w/index.php?title=Binary_GCD_algorithm&oldid=1072393147
 
This is an implementation without proofs of anything.
 
The implementations shown here require the GCC builtin functions
for ‘count trailing zeros’. If your C compiler is GCC or another
that supports those functions, you are fine. Otherwise, one could
easily substitute other C code.
 
Compile with ‘patscc -o gcd gcd.dats’.
 
*)
 
#define ATS_EXTERN_PREFIX "rosettacode_gcd_"
#define ATS_DYNLOADFLAG 0 (* No initialization is needed. *)
 
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
 
(********************************************************************)
(* *)
(* Declarations of the functions. *)
(* *)
 
(* g0uint_gcd_stein will be the generic template function for
unsigned integers. *)
extern fun {tk : tkind}
g0uint_gcd_stein :
(g0uint tk, g0uint tk) -<> g0uint tk
 
(* g0int_gcd_stein will be the generic template function for
signed integers, giving an unsigned result. *)
extern fun {tk_signed, tk_unsigned : tkind}
g0int_gcd_stein :
(g0int tk_signed, g0int tk_signed) -<> g0uint tk_unsigned
 
(* Let us call these functions ‘gcd_stein’ or just ‘gcd’. *)
overload gcd_stein with g0uint_gcd_stein
overload gcd_stein with g0int_gcd_stein
overload gcd with gcd_stein
 
(********************************************************************)
(* *)
(* The implementations. *)
(* *)
 
%{^
 
/*
 
We will need a ‘count trailing zeros of a positive number’ function,
but this is not provided in the ATS prelude. Here are
implementations using GCC builtin functions. For fast alternatives
in standard C, see
https://www.chessprogramming.org/index.php?title=BitScan&oldid=22495#Trailing_Zero_Count
 
*/
 
ATSinline() atstype_uint
rosettacode_gcd_g0uint_ctz_uint (atstype_uint x)
{
return __builtin_ctz (x);
}
 
ATSinline() atstype_ulint
rosettacode_gcd_g0uint_ctz_ulint (atstype_ulint x)
{
return __builtin_ctzl (x);
}
 
ATSinline() atstype_ullint
rosettacode_gcd_g0uint_ctz_ullint (atstype_ullint x)
{
return __builtin_ctzll (x);
}
 
%}
 
extern fun g0uint_ctz_uint : uint -<> int = "mac#%"
extern fun g0uint_ctz_ulint : ulint -<> int = "mac#%"
extern fun g0uint_ctz_ullint : ullint -<> int = "mac#%"
 
(* A generic template function for ‘count trailing zeros’ of
non-dependent unsigned integers. *)
extern fun {tk : tkind} g0uint_ctz : g0uint tk -<> int
 
(* Link the implementations to the template function. *)
implement g0uint_ctz<uint_kind> (x) = g0uint_ctz_uint x
implement g0uint_ctz<ulint_kind> (x) = g0uint_ctz_ulint x
implement g0uint_ctz<ullint_kind> (x) = g0uint_ctz_ullint x
 
(* Let one call the function simply ‘ctz’. *)
overload ctz with g0uint_ctz
 
(* Now the actual implementation of g0uint_gcd_stein, the template
function for the gcd of two unsigned integers. *)
implement {tk}
g0uint_gcd_stein (u, v) =
let
(* Make ‘t’ a shorthand for the unsigned integer type. *)
typedef t = g0uint tk
 
(* Use this macro to fake proof that an int is non-negative. *)
macdef nonneg (n) = $UNSAFE.cast{intGte 0} ,(n)
 
(* Looping is done by tail recursion. There is no proof
the function terminates; this fact is indicated by
‘<!ntm>’. *)
fun {tk : tkind}
main_loop (x_odd : t, y : t) :<!ntm> t =
let
(* Remove twos from y, giving an odd number.
Note gcd(x_odd,y_odd) = gcd(x_odd,y). *)
val y_odd = (y >> nonneg (ctz y))
in
if x_odd = y_odd then
x_odd
else
let
(* If y_odd < x_odd then swap x_odd and y_odd.
This operation does not affect the gcd. *)
val x_odd = min (x_odd, y_odd)
and y_odd = max (x_odd, y_odd)
in
main_loop (x_odd, y_odd - x_odd)
end
end
 
fn
u_and_v_both_positive (u : t, v : t) :<> t =
let
(* n = the number of common factors of two in u and v. *)
val n = ctz (u lor v)
 
(* Remove the common twos from u and v, giving x and y. *)
val x = (u >> nonneg n)
val y = (v >> nonneg n)
 
(* Remove twos from x, giving an odd number.
Note gcd(x_odd,y) = gcd(x,y). *)
val x_odd = (x >> nonneg (ctz x))
 
(* Run the main loop, but pretend it is proven to
terminate. Otherwise we could not write ‘<>’ above,
telling the ATS compiler that we trust the function
to terminate. *)
val z = $effmask_ntm (main_loop (x_odd, y))
in
(* Put the common factors of two back in. *)
(z << nonneg n)
end
 
(* If v < u then swap u and v. This operation does not
affect the gcd. *)
val u = min (u, v)
and v = max (u, v)
in
if iseqz u then
v
else
u_and_v_both_positive (u, v)
end
 
(* The implementation of g0int_gcd_stein, the template function for
the gcd of two signed integers, giving an unsigned result. *)
implement {signed_tk, unsigned_tk}
g0int_gcd_stein (u, v) =
let
val abs_u = $UNSAFE.cast{g0uint unsigned_tk} (abs u)
val abs_v = $UNSAFE.cast{g0uint unsigned_tk} (abs v)
in
g0uint_gcd_stein<unsigned_tk> (abs_u, abs_v)
end
 
(********************************************************************)
(* A demonstration program. *)
 
implement
main0 () =
begin
(* Unsigned integers. *)
assertloc (gcd (0U, 10U) = 10U);
assertloc (gcd (9UL, 6UL) = 3UL);
assertloc (gcd (40902ULL, 24140ULL) = 34ULL);
 
(* Signed integers. *)
assertloc (gcd (0, 10) = gcd (0U, 10U));
assertloc (gcd (~10, 0) = gcd (0U, 10U));
assertloc (gcd (~6L, ~9L) = 3UL);
assertloc (gcd (40902LL, 24140LL) = 34ULL);
assertloc (gcd (40902LL, ~24140LL) = 34ULL);
assertloc (gcd (~40902LL, 24140LL) = 34ULL);
assertloc (gcd (~40902LL, ~24140LL) = 34ULL);
assertloc (gcd (24140LL, 40902LL) = 34ULL);
assertloc (gcd (~24140LL, 40902LL) = 34ULL);
assertloc (gcd (24140LL, ~40902LL) = 34ULL);
assertloc (gcd (~24140LL, ~40902LL) = 34ULL)
end
 
(********************************************************************)</syntaxhighlight>
 
 
===Stein’s algorithm, with proof of termination===
 
Here is an implementation of Stein’s algorithm, this time with a proof of termination. Notice that the proof is rather ‘informal’; this is practical systems programming, not an exercise in mathematical logic.
 
<syntaxhighlight lang="ats">(********************************************************************)
(*
 
GCD of two integers, by Stein’s algorithm:
https://en.wikipedia.org/w/index.php?title=Binary_GCD_algorithm&oldid=1072393147
 
This is an implementation with proof of termination.
 
The implementations shown here require the GCC builtin functions
for ‘count trailing zeros’. If your C compiler is GCC or another
that supports those functions, you are fine. Otherwise, one could
easily substitute other C code.
 
Compile with ‘patscc -o gcd gcd.dats’.
 
*)
 
#define ATS_EXTERN_PREFIX "rosettacode_gcd_"
#define ATS_DYNLOADFLAG 0 (* No initialization is needed. *)
 
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
 
(********************************************************************)
(* *)
(* Declarations of the functions. *)
(* *)
 
(* g1uint_gcd_stein will be the generic template function for
unsigned integers. *)
extern fun {tk : tkind}
g0uint_gcd_stein :
(g0uint tk, g0uint tk) -<> g0uint tk
 
(* g0int_gcd_stein will be the generic template function for
signed integers, giving an unsigned result. *)
extern fun {tk_signed, tk_unsigned : tkind}
g0int_gcd_stein :
(g0int tk_signed, g0int tk_signed) -<> g0uint tk_unsigned
 
(* Let us call these functions ‘gcd_stein’ or just ‘gcd’. *)
overload gcd_stein with g0uint_gcd_stein
overload gcd_stein with g0int_gcd_stein
overload gcd with gcd_stein
 
(********************************************************************)
(* *)
(* The implementations. *)
(* *)
 
%{^
 
/*
 
We will need a ‘count trailing zeros of a positive number’ function,
but this is not provided in the ATS prelude. Here are
implementations using GCC builtin functions. For fast alternatives
in standard C, see
https://www.chessprogramming.org/index.php?title=BitScan&oldid=22495#Trailing_Zero_Count
 
*/
 
ATSinline() atstype_uint
rosettacode_gcd_g0uint_ctz_uint (atstype_uint x)
{
return __builtin_ctz (x);
}
 
ATSinline() atstype_ulint
rosettacode_gcd_g0uint_ctz_ulint (atstype_ulint x)
{
return __builtin_ctzl (x);
}
 
ATSinline() atstype_ullint
rosettacode_gcd_g0uint_ctz_ullint (atstype_ullint x)
{
return __builtin_ctzll (x);
}
 
%}
 
extern fun g0uint_ctz_uint : uint -<> int = "mac#%"
extern fun g0uint_ctz_ulint : ulint -<> int = "mac#%"
extern fun g0uint_ctz_ullint : ullint -<> int = "mac#%"
 
(* A generic template function for ‘count trailing zeros’ of
non-dependent unsigned integers. *)
extern fun {tk : tkind} g0uint_ctz : g0uint tk -<> int
 
(* Link the implementations to the template function. *)
implement g0uint_ctz<uint_kind> (x) = g0uint_ctz_uint x
implement g0uint_ctz<ulint_kind> (x) = g0uint_ctz_ulint x
implement g0uint_ctz<ullint_kind> (x) = g0uint_ctz_ullint x
 
(* Let one call the function simply ‘ctz’. *)
overload ctz with g0uint_ctz
 
(* Now the actual implementation of g0uint_gcd_stein, the template
function for the gcd of two unsigned integers. *)
implement {tk}
g0uint_gcd_stein (u, v) =
let
(* Make ‘t’ a shorthand for the unsigned integer types. *)
typedef t = g0uint tk
typedef t (i : int) = g1uint (tk, i)
 
(* Use this macro to fake proof that an int is non-negative. *)
macdef nonneg (n) = $UNSAFE.cast{intGte 0} ,(n)
 
(* Looping is done by tail recursion. The value of (x_odd + y)
must decrease towards zero, to prove termination. *)
fun {tk : tkind}
main_loop {x_odd, y : pos} .<x_odd + y>.
(x_odd : t (x_odd), y : t (y)) :<>
[d : pos] t (d) =
let
 
(* Remove twos from y, giving an odd number. Note
gcd(x_odd,y_odd) = gcd(x_odd,y). We do not have a
dependent-type version of the following operation, so let
us do it with non-dependent types. *)
val [y_odd : int] y_odd =
g1ofg0 ((g0ofg1 y) >> nonneg (ctz (g0ofg1 y)))
 
(* Assert some things we know without proof. (You could also
use assertloc, which inserts a runtime check.) *)
prval _ = $UNSAFE.prop_assert {0 < y_odd} ()
prval _ = $UNSAFE.prop_assert {y_odd <= y} ()
in
if x_odd = y_odd then
x_odd
else if y_odd < x_odd then
main_loop (y_odd, x_odd - y_odd)
else
main_loop (x_odd, y_odd - x_odd)
end
 
fn
u_and_v_both_positive (u : t, v : t) :<> t =
let
(* n = the number of common factors of two in u and v. *)
val n = ctz (u lor v)
 
(* Remove the common twos from u and v, giving x and y. *)
val x = (u >> nonneg n)
val y = (v >> nonneg n)
 
(* Remove twos from x, giving an odd number.
Note gcd(x_odd,y) = gcd(x,y). *)
val x_odd = (x >> nonneg (ctz x))
 
(* To prove termination of main_loop, we have to
convert x_odd and y to a dependent type. *)
val [x_odd : int] x_odd = g1ofg0 x_odd
val [y : int] y = g1ofg0 y
 
(* Assert that they are positive. (One could also use
assertloc, which inserts a runtime check.) *)
prval _ = $UNSAFE.prop_assert {0 < x_odd} ()
prval _ = $UNSAFE.prop_assert {0 < y} ()
 
val z = main_loop (x_odd, y)
 
(* Convert back to the non-dependent type. *)
val z = g0ofg1 z
in
(* Put the common factors of two back in. *)
(z << nonneg n)
end
 
(* If v < u then swap u and v. This operation does not
affect the gcd. *)
val u = min (u, v)
and v = max (u, v)
in
if iseqz u then
v
else
u_and_v_both_positive (u, v)
end
 
(* The implementation of g0int_gcd_stein, the template function for
the gcd of two signed integers, giving an unsigned result. *)
implement {signed_tk, unsigned_tk}
g0int_gcd_stein (u, v) =
let
val abs_u = $UNSAFE.cast{g0uint unsigned_tk} (abs u)
val abs_v = $UNSAFE.cast{g0uint unsigned_tk} (abs v)
in
g0uint_gcd_stein<unsigned_tk> (abs_u, abs_v)
end
 
(********************************************************************)
(* A demonstration program. *)
 
implement
main0 () =
begin
(* Unsigned integers. *)
assertloc (gcd (0U, 10U) = 10U);
assertloc (gcd (9UL, 6UL) = 3UL);
assertloc (gcd (40902ULL, 24140ULL) = 34ULL);
 
(* Signed integers. *)
assertloc (gcd (0, 10) = gcd (0U, 10U));
assertloc (gcd (~10, 0) = gcd (0U, 10U));
assertloc (gcd (~6L, ~9L) = 3UL);
assertloc (gcd (40902LL, 24140LL) = 34ULL);
assertloc (gcd (40902LL, ~24140LL) = 34ULL);
assertloc (gcd (~40902LL, 24140LL) = 34ULL);
assertloc (gcd (~40902LL, ~24140LL) = 34ULL);
assertloc (gcd (24140LL, 40902LL) = 34ULL);
assertloc (gcd (~24140LL, 40902LL) = 34ULL);
assertloc (gcd (24140LL, ~40902LL) = 34ULL);
assertloc (gcd (~24140LL, ~40902LL) = 34ULL)
end
 
(********************************************************************)</syntaxhighlight>
 
===Euclid’s algorithm, with proof of termination and correctness===
 
Here is an implementation of Euclid’s algorithm, with a proof of correctness.
 
<syntaxhighlight lang="ats">(********************************************************************)
(*
 
GCD of two integers, by Euclid’s algorithm; verified with proofs.
 
Compile with ‘patscc -o gcd gcd.dats’.
 
*)
 
#define ATS_DYNLOADFLAG 0 (* No initialization is needed. *)
 
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
 
(********************************************************************)
(* *)
(* Definition of the gcd by axioms in the static language. *)
(* *)
(* (‘Props’ are better supported in ATS, but I enjoy using the *)
(* the static language in proofs.) *)
(* *)
 
(* Write the gcd as an undefined static function. It will be defined
implicitly by axioms. (Such a function also can be used with an
external SMT solver such as CVC4, but using an external solver is
not the topic of this program.) *)
stacst gcd (u : int, v : int) : int
 
(*
I think the reader will accept the following axioms as valid,
if gcd(0, 0) is to be defined as equal to zero.
 
(An exercise for the reader is to prove ‘gcd_of_remainder’
from gcd (u, v) == gcd (u, v - u). This requires definitions
of multiplication and Euclidean division, which are encoded
in terms of props in ‘prelude/SATS/arith_prf.sats’.)
*)
 
extern praxi
gcd_of_zero :
{u, v : int | u == 0; 0 <= v} (* For all integers u = 0,
v non-negative. *)
() -<prf> [gcd (u, v) == v] void
 
extern praxi
gcd_of_remainder :
{u, v : int | 0 < u; 0 <= v} (* For all integers u positive,
v non-negative. *)
() -<prf> [gcd (u, v) == gcd (u, v mod u)] void
 
extern praxi
gcd_is_commutative :
{u, v : int} (* For all integers u, v. *)
() -<prf> [gcd (u, v) == gcd (v, u)] void
 
extern praxi
gcd_of_the_absolute_values :
{u, v : int} (* For all integers u, v. *)
() -<prf> [gcd (u, v) == gcd (abs u, abs v)] void
 
extern praxi
gcd_is_a_function :
{u1, v1 : int}
{u2, v2 : int | u1 == u2; v1 == v2}
() -<prf> [gcd (u1, v1) == gcd (u2, v2)] void
 
(********************************************************************)
(* *)
(* Function declarations. *)
(* *)
 
(* g1uint_gcd_euclid will be the generic template function for
unsigned integers. *)
extern fun {tk : tkind}
g1uint_gcd_euclid :
{u, v : int}
(g1uint (tk, u),
g1uint (tk, v)) -<>
g1uint (tk, gcd (u, v))
 
(* g1int_gcd_euclid will be the generic template function for
signed integers, giving an unsigned result. *)
extern fun {tk_signed, tk_unsigned : tkind}
g1int_gcd_euclid :
{u, v : int}
(g1int (tk_signed, u),
g1int (tk_signed, v)) -<>
g1uint (tk_unsigned, gcd (u, v))
 
(* Let us call these functions ‘gcd_euclid’ or just ‘gcd’. *)
overload gcd_euclid with g1uint_gcd_euclid
overload gcd_euclid with g1int_gcd_euclid
overload gcd with gcd_euclid
 
(********************************************************************)
(* *)
(* Function implementations. *)
(* *)
 
(* The implementation of the remainder function in the ATS2 prelude
is inconvenient for us; it does not say that the result equals
‘u mod v’. Let us reimplement it more to our liking. *)
fn {tk : tkind}
g1uint_rem {u, v : int | v != 0}
(u : g1uint (tk, u),
v : g1uint (tk, v)) :<>
[w : int | 0 <= w; w < v; w == u mod v]
g1uint (tk, w) =
let
prval _ = lemma_g1uint_param u
prval _ = lemma_g1uint_param v
in
$UNSAFE.cast (g1uint_mod (u, v))
end
 
implement {tk}
g1uint_gcd_euclid {u, v} (u, v) =
let
(* The static variable v, which is defined within the curly
braces, must, with each iteration, approach zero without
passing it. Otherwise the loop is not proven to terminate,
and the typechecker will reject it. *)
fun
loop {u, v : int | 0 <= u; 0 <= v} .<v>.
(u : g1uint (tk, u),
v : g1uint (tk, v)) :<>
g1uint (tk, gcd (u, v)) =
if v = g1i2u 0 then
let
(* prop_verify tests whether what we believe we have
proven has actually been proven. Using it a lot lengthens
the code but is excellent documentation. *)
prval _ = prop_verify {0 <= u} ()
prval _ = prop_verify {v == 0} ()
 
prval _ = gcd_of_zero {v, u} ()
prval _ = prop_verify {gcd (v, u) == u} ()
 
prval _ = gcd_is_commutative {u, v} ()
prval _ = prop_verify {gcd (u, v) == gcd (v, u)} ()
 
(* Therefore, by transitivity of equality: *)
prval _ = prop_verify {gcd (u, v) == u} ()
in
u
end
else
let
prval _ = prop_verify {0 <= u} ()
prval _ = prop_verify {0 < v} ()
 
prval _ = gcd_of_remainder {v, u} ()
prval _ = prop_verify {gcd (v, u) == gcd (v, u mod v)} ()
 
prval _ = gcd_is_commutative {u, v} ()
prval _ = prop_verify {gcd (u, v) == gcd (v, u)} ()
 
(* Therefore, by transitivity of equality: *)
prval _ = prop_verify {gcd (u, v) == gcd (v, u mod v)} ()
 
val [w : int] w = g1uint_rem (u, v)
prval _ = prop_verify {0 <= w} ()
prval _ = prop_verify {w < v} ()
prval _ = prop_verify {w == u mod v} ()
 
(* It has been proven that the function will terminate: *)
prval _ = prop_verify {0 <= w && w < v} ()
 
prval _ = gcd_is_a_function {v, u mod v} {v, w} ()
prval _ = prop_verify {gcd (v, u mod v) == gcd (v, w)} ()
 
(* Therefore, by transitivity of equality: *)
prval _ = prop_verify {gcd (u, v) == gcd (v, w)} ()
in
loop (v, w)
end
 
(* u is unsigned, thus proving 0 <= u. *)
prval _ = lemma_g1uint_param (u)
 
(* v is unsigned, thus proving 0 <= v. *)
prval _ = lemma_g1uint_param (v)
in
loop (u, v)
end
 
implement {tk_signed, tk_unsigned}
g1int_gcd_euclid {u, v} (u, v) =
let
(* Prove that gcd(abs u, abs v) equals gcd(u, v). *)
prval _ = gcd_of_the_absolute_values {u, v} ()
in
(* Compute gcd(abs u, abs v). The ‘g1i2u’ notations cast the
values from signed integers to unsigned integers. *)
g1uint_gcd_euclid (g1i2u (abs u), g1i2u (abs v))
end
 
(********************************************************************)
(* *)
(* A demonstration program. *)
(* *)
(* Unfortunately, the ATS prelude may not include implementations *)
(* of all the functions we need for long and long long integers. *)
(* Thus the demonstration will be entirely on regular int and uint. *)
(* *)
(* (Including implementations here would distract from the purpose. *)
(* *)
 
implement
main0 () =
begin
(* Unsigned integers. *)
assertloc (gcd (0U, 10U) = 10U);
assertloc (gcd (9U, 6U) = 3U);
assertloc (gcd (40902U, 24140U) = 34U);
 
(* Signed integers. *)
assertloc (gcd (0, 10) = gcd (0U, 10U));
assertloc (gcd (~10, 0) = gcd (0U, 10U));
assertloc (gcd (~6, ~9) = 3U);
assertloc (gcd (40902, 24140) = 34U);
assertloc (gcd (40902, ~24140) = 34U);
assertloc (gcd (~40902, 24140) = 34U);
assertloc (gcd (~40902, ~24140) = 34U);
assertloc (gcd (24140, 40902) = 34U);
assertloc (gcd (~24140, 40902) = 34U);
assertloc (gcd (24140, ~40902) = 34U);
assertloc (gcd (~24140, ~40902) = 34U)
end
 
(********************************************************************)</syntaxhighlight>
 
===Some proofs about the gcd===
 
 
For the sake of interest, here is some use of ATS's "props"-based proof system. There is no executable code in the following.
 
<syntaxhighlight lang="ats">(* Typecheck this file with ‘patscc -tcats gcd-proofs.dats’. *)
 
(* Definition of the gcd by Euclid’s algorithm, using subtractions;
gcd(0,0) is defined to equal zero. (I do not prove that this
definition is equivalent to the common meaning of ‘greatest common
divisor’; that’s not a sort of thing ATS is good at.) *)
dataprop GCD (int, int, int) =
| GCD_0_0 (0, 0, 0)
| {u : pos}
GCD_u_0 (u, 0, u)
| {v : pos}
GCD_0_v (0, v, v)
| {u, v : pos | u <= v}
{d : pos}
GCD_u_le_v (u, v, d) of
GCD (u, v - u, d)
| {u, v : pos | u > v}
{d : pos}
GCD_u_gt_v (u, v, d) of
GCD (u - v, v, d)
| {u, v : int | u < 0 || v < 0}
{d : pos}
GCD_u_or_v_neg (u, v, d) of
GCD (abs u, abs v, d)
 
(* Here is a proof, by construction, of the proposition
‘The gcd of 12 and 8 is 4’. *)
prfn
gcd_12_8 () :<prf>
GCD (12, 8, 4) =
let
prval pf = GCD_u_0 {4} ()
prval pf = GCD_u_le_v {4, 4} {4} (pf)
prval pf = GCD_u_le_v {4, 8} {4} (pf)
prval pf = GCD_u_gt_v {12, 8} {4} (pf)
in
pf
end
 
(* A lemma: the gcd is total. That is, it is defined for all
integers. *)
extern prfun
gcd_istot :
{u, v : int}
() -<prf>
[d : int]
GCD (u, v, d)
 
(* Another lemma: the gcd is a function: it has a unique value for
any given pair of arguments. *)
extern prfun
gcd_isfun :
{u, v : int}
{d, e : int}
(GCD (u, v, d),
GCD (u, v, e)) -<prf>
[d == e] void
 
(* Proof of gcd_istot. This source file will not pass typechecking
unless the proof is valid. *)
primplement
gcd_istot {u, v} () =
let
prfun
gcd_istot__nat_nat__ {u, v : nat | u != 0 || v != 0} .<u + v>.
() :<prf> [d : pos] GCD (u, v, d) =
sif v == 0 then
GCD_u_0 ()
else sif u == 0 then
GCD_0_v ()
else sif u <= v then
GCD_u_le_v (gcd_istot__nat_nat__ {u, v - u} ())
else
GCD_u_gt_v (gcd_istot__nat_nat__ {u - v, v} ())
 
prfun
gcd_istot__int_int__ {u, v : int | u != 0 || v != 0} .<>.
() :<prf> [d : pos] GCD (u, v, d) =
sif u < 0 || v < 0 then
GCD_u_or_v_neg (gcd_istot__nat_nat__ {abs u, abs v} ())
else
gcd_istot__nat_nat__ {u, v} ()
in
sif u == 0 && v == 0 then
GCD_0_0 ()
else
gcd_istot__int_int__ {u, v} ()
end
 
(* Proof of gcd_isfun. This source file will not pass typechecking
unless the proof is valid. *)
primplement
gcd_isfun {u, v} {d, e} (pfd, pfe) =
let
prfun
gcd_isfun__nat_nat__ {u, v : nat}
{d, e : int}
.<u + v>.
(pfd : GCD (u, v, d),
pfe : GCD (u, v, e)) :<prf> [d == e] void =
case+ pfd of
| GCD_0_0 () =>
{
prval GCD_0_0 () = pfe
}
| GCD_u_0 () =>
{
prval GCD_u_0 () = pfe
}
| GCD_0_v () =>
{
prval GCD_0_v () = pfe
}
| GCD_u_le_v pfd1 =>
{
prval GCD_u_le_v pfe1 = pfe
prval _ = gcd_isfun__nat_nat__ (pfd1, pfe1)
}
| GCD_u_gt_v pfd1 =>
{
prval GCD_u_gt_v pfe1 = pfe
prval _ = gcd_isfun__nat_nat__ (pfd1, pfe1)
}
in
sif u < 0 || v < 0 then
{
prval GCD_u_or_v_neg pfd1 = pfd
prval GCD_u_or_v_neg pfe1 = pfe
prval _ = gcd_isfun__nat_nat__ (pfd1, pfe1)
}
else
gcd_isfun__nat_nat__ (pfd, pfe)
end</syntaxhighlight>
 
=={{header|AutoHotkey}}==
Contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276379.html#276379 forum]
<langsyntaxhighlight AutoHotkeylang="autohotkey">GCD(a,b) {
Return b=0 ? Abs(a) : Gcd(b,mod(a,b))
}</langsyntaxhighlight>
Significantly faster than the recursive version aboverecursion:
<langsyntaxhighlight AutoHotkeylang="autohotkey">gcdGCD(a, b) {
while b
t := b, b := Mod(a, b)| 0x0, a := tb)
return, a
}</langsyntaxhighlight>
 
== {{header|AutoIt}} ==
<langsyntaxhighlight lang="autoit">
_GCD(18, 12)
_GCD(1071, 1029)
Line 263 ⟶ 1,556:
WEnd
EndFunc ;==>_GCD
</syntaxhighlight>
</lang>
 
Output: <pre>GCD of 18 : 12 = 6
Line 271 ⟶ 1,564:
=={{header|AWK}}==
The following scriptlet defines the gcd() function, then reads pairs of numbers from stdin, and reports their gcd on stdout.
<langsyntaxhighlight lang="awk">$ awk 'funcfunction gcd(p,q){return(q?gcd(q,(p%q)):p)}{print gcd($1,$2)}'
12 16
4
Line 277 ⟶ 1,570:
11
45 67
1</langsyntaxhighlight>
 
 
=={{header|Axe}}==
<langsyntaxhighlight lang="axe">Lbl GCD
r₁→A
r₂→B
Line 288 ⟶ 1,580:
Return
End
GCD(B,A^B)</langsyntaxhighlight>
 
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
<syntaxhighlight lang="applesoftbasic">0 A = ABS(INT(A))
1 B = ABS(INT(B))
2 GCD = A * NOT NOT B
3 FOR B = B + A * NOT B TO 0 STEP 0
4 A = GCD
5 GCD = B
6 B = A - INT (A / GCD) * GCD
7 NEXT B</syntaxhighlight>
 
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
====Iterative====
<syntaxhighlight lang="freebasic">
function gcdI(x, y)
while y
t = y
y = x mod y
x = t
end while
 
return x
end function
 
# ------ test ------
a = 111111111111111
b = 11111
 
print : print "GCD(";a;", ";b;") = "; gcdI(a, b)
print : print "GCD(";a;", 111) = "; gcdI(a, 111)
end</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de FreeBASIC.
</pre>
 
====Recursive====
<syntaxhighlight lang="freebasic">
function gcdp(a, b)
if b = 0 then return a
return gcdp(b, a mod b)
end function
 
function gcdR(a, b)
return gcdp(abs(a), abs(b))
end function
</syntaxhighlight>
 
==={{header|BBC BASIC}}===
<syntaxhighlight lang="bbcbasic"> DEF FN_GCD_Iterative_Euclid(A%, B%)
LOCAL C%
WHILE B%
C% = A%
A% = B%
B% = C% MOD B%
ENDWHILE
= ABS(A%)</syntaxhighlight>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
{{trans|BASIC256}}
====Iterative====
<syntaxhighlight lang="qbasic">100 cls
110 a = 40902
120 b = 24140
130 print : print "GCD(";a;", ";b;") = ";gcdi(a,b)
140 print : print "GCD(";a;", 111) = ";gcdi(a,111)
170 end
 
190 sub gcdi(x,y)
200 while y
210 t = y
220 y = x mod y
230 x = t
240 wend
250 gcdi = x
260 end sub</syntaxhighlight>
 
==={{header|FreeBASIC}}===
====Iterative solution====
<syntaxhighlight lang="freebasic">' version 17-06-2015
' compile with: fbc -s console
 
Function gcd(x As ULongInt, y As ULongInt) As ULongInt
Dim As ULongInt t
While y
t = y
y = x Mod y
x = t
Wend
Return x
End Function
 
' ------=< MAIN >=------
 
Dim As ULongInt a = 111111111111111
Dim As ULongInt b = 11111
 
Print : Print "GCD(";a;", ";b;") = "; gcd(a, b)
Print : Print "GCD(";a;", 111) = "; gcd(a, 111)
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print : Print "hit any key to end program"
Sleep
End</syntaxhighlight>
{{out}}
<pre>GCD(111111111111111, 11111) = 11111
GCD(111111111111111, 111) = 111</pre>
 
====Recursive solution====
<syntaxhighlight lang="freebasic">function gcdp( a as uinteger, b as uinteger ) as uinteger
if b = 0 then return a
return gcdp( b, a mod b )
end function
 
function gcd(a as integer, b as integer) as uinteger
return gcdp( abs(a), abs(b) )
end function</syntaxhighlight>
 
==={{header|GFA Basic}}===
<syntaxhighlight lang="basic">
'
' Greatest Common Divisor
'
a%=24
b%=112
PRINT "GCD of ";a%;" and ";b%;" is ";@gcd(a%,b%)
'
' Function computes gcd
'
FUNCTION gcd(a%,b%)
LOCAL t%
'
WHILE b%<>0
t%=a%
a%=b%
b%=t% MOD b%
WEND
'
RETURN ABS(a%)
ENDFUNC
</syntaxhighlight>
 
==={{header|GW-BASIC}}===
<syntaxhighlight lang="gwbasic">10 INPUT A, B
20 IF A < 0 THEN A = -A
30 IF B < 0 THEN B = -B
40 GOTO 70
50 PRINT A
60 END
70 IF B = 0 THEN GOTO 50
80 TEMP = B
90 B = A MOD TEMP
100 A = TEMP
110 GOTO 70</syntaxhighlight>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 DEF GCD(A,B)
110 DO WHILE B>0
120 LET T=B
130 LET B=MOD(A,B)
140 LET A=T
150 LOOP
160 LET GCD=A
170 END DEF
180 PRINT GCD(12,16)</syntaxhighlight>
 
==={{header|Liberty BASIC}}===
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">'iterative Euclid algorithm
print GCD(-2,16)
end
 
function GCD(a,b)
while b
c = a
a = b
b = c mod b
wend
GCD = abs(a)
end function
</syntaxhighlight>
 
==={{header|PureBasic}}===
====Iterative====
<syntaxhighlight lang="purebasic">
Import "" ;msvcrt.lib
AbsI(Quad.q) As "_abs64"
AbsL(Long.l) As "labs"
EndImport
Procedure.i GCD(u.i, v.i)
Protected.i t
While v <> 0
t = v
v = u % v
u = t
Wend
ProcedureReturn AbsI(u) ; Avoid float conversion with Abs(u).
EndProcedure
Debug GCD(18, 12) ; 6
Debug GCD(1071, 1029) ; 21
Debug GCD(3528, -3780) ; 252
</syntaxhighlight>
 
==={{header|QuickBASIC}}===
{{works with|QuickBASIC|4.5}}
====Iterative====
<syntaxhighlight lang="qbasic">DECLARE FUNCTION gcd (a%, b%)
PRINT gcd(18, 30)
END
 
FUNCTION gcd (a%, b%)
WHILE b% <> 0
t% = b%
b% = a% MOD b%
a% = t%
WEND
gcd = ABS(a%)
END FUNCTION</syntaxhighlight>
{{out}}
<pre>
6
</pre>
 
====Recursive====
<syntaxhighlight lang="qbasic">DECLARE FUNCTION gcd (a%, b%)
PRINT gcd(30, 18)
END
 
FUNCTION gcd (a%, b%)
IF b% = 0 THEN
gcd = ABS(a%)
ELSE
gcd = gcd(b%, a% MOD b%)
END IF
END FUNCTION</syntaxhighlight>
{{out}}
<pre>
6
</pre>
 
==={{header|Run BASIC}}===
{{works with|Just BASIC}}
<syntaxhighlight lang="runbasic">print abs(gcd(-220,160))
function gcd(gcd,b)
while b
c = gcd
gcd = b
b = c mod b
wend
end function </syntaxhighlight>
 
==={{header|S-BASIC}}===
<syntaxhighlight lang="basic">
rem - return p mod q
function mod(p, q = integer) = integer
end = p - q * (p / q)
 
rem - return greatest common divisor of x and y
function gcd(x, y = integer) = integer
var r, temp = integer
if x < y then
begin
temp = x
x = y
y = temp
end
r = mod(x, y)
while r <> 0 do
begin
x = y
y = r
r = mod(x, y)
end
end = y
 
rem - exercise the function
 
print "The GCD of 21 and 35 is"; gcd(21,35)
print "The GCD of 23 and 35 is"; gcd(23,35)
print "The GCD of 1071 and 1029 is"; gcd(1071, 1029)
print "The GCD of 3528 and 3780 is"; gcd(3528,3780)
 
end
</syntaxhighlight>
{{out}}
<pre>The GCD of 21 and 35 is 7
The GCD of 23 and 35 is 1
The GCD of 1071 and 1029 is 21
The GCD of 3528 and 3780 is 252
</pre>
 
==={{header|Sinclair ZX81 BASIC}}===
<syntaxhighlight lang="basic"> 10 LET M=119
20 LET N=544
30 LET R=M-N*INT (M/N)
40 IF R=0 THEN GOTO 80
50 LET M=N
60 LET N=R
70 GOTO 30
80 PRINT N</syntaxhighlight>
{{out}}
<pre>17</pre>
 
==={{header|TI-83 BASIC}}, {{header|TI-89 BASIC}}===
gcd(A,B)
The ) can be omitted in TI-83 basic
 
==={{header|Tiny BASIC}}===
{{works with|TinyBasic}}
<syntaxhighlight lang="basic">10 PRINT "First number"
20 INPUT A
30 PRINT "Second number"
40 INPUT B
50 IF A<0 THEN LET A=-A
60 IF B<0 THEN LET B=-B
70 IF A>B THEN GOTO 130
80 LET B = B - A
90 IF A=0 THEN GOTO 110
100 GOTO 50
110 PRINT B
120 END
130 LET C=A
140 LET A=B
150 LET B=C
160 GOTO 70</syntaxhighlight>
 
==={{header|True BASIC}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic">
REM Iterative solution
FUNCTION gcdI(x, y)
DO WHILE y > 0
LET t = y
LET y = remainder(x, y)
LET x = t
LOOP
LET gcdI = x
END FUNCTION
 
LET a = 111111111111111
LET b = 11111
PRINT
PRINT "GCD(";a;", ";b;") = "; gcdI(a, b)
PRINT
PRINT "GCD(";a;", 111) = "; gcdI(a, 111)
END
</syntaxhighlight>
 
==={{header|uBasic/4tH}}===
{{trans|BBC BASIC}}
<syntaxhighlight lang="text">Print "GCD of 18 : 12 = "; FUNC(_GCD_Iterative_Euclid(18,12))
Print "GCD of 1071 : 1029 = "; FUNC(_GCD_Iterative_Euclid(1071,1029))
Print "GCD of 3528 : 3780 = "; FUNC(_GCD_Iterative_Euclid(3528,3780))
 
End
 
_GCD_Iterative_Euclid Param(2)
Local (1)
Do While b@
c@ = a@
a@ = b@
b@ = c@ % b@
Loop
Return (Abs(a@))</syntaxhighlight>
{{out}}
<pre>GCD of 18 : 12 = 6
GCD of 1071 : 1029 = 21
GCD of 3528 : 3780 = 252
 
0 OK, 0:205</pre>
 
==={{header|VBA}}===
<syntaxhighlight lang="vb">Function gcd(u As Long, v As Long) As Long
Dim t As Long
Do While v
t = u
u = v
v = t Mod v
Loop
gcd = u
End Function</syntaxhighlight>
This function uses repeated subtractions. Simple but not very efficient.
<syntaxhighlight lang="vba">Public Function GCD(a As Long, b As Long) As Long
While a <> b
If a > b Then a = a - b Else b = b - a
Wend
GCD = a
End Function</syntaxhighlight>{{out}}
Example:
<pre>print GCD(1280, 240)
80
print GCD(3475689, 23566319)
7
a=123456789
b=234736437
print GCD((a),(b))
3 </pre>
 
A note on the last example: using brackets forces a and b to be evaluated before GCD is called. Not doing this will cause a compile error because a and b are not the same type as in the function declaration (they are Variant, not Long). Alternatively you can use the conversion function CLng as in print GCD(CLng(a),CLng(b))
 
==={{header|VBScript}}===
<syntaxhighlight lang="vbscript">Function GCD(a,b)
Do
If a Mod b > 0 Then
c = a Mod b
a = b
b = c
Else
GCD = b
Exit Do
End If
Loop
End Function
 
WScript.Echo "The GCD of 48 and 18 is " & GCD(48,18) & "."
WScript.Echo "The GCD of 1280 and 240 is " & GCD(1280,240) & "."
WScript.Echo "The GCD of 1280 and 240 is " & GCD(3475689,23566319) & "."
WScript.Echo "The GCD of 1280 and 240 is " & GCD(123456789,234736437) & "."</syntaxhighlight>
 
{{Output}}
<pre>The GCD of 48 and 18 is 6.
The GCD of 1280 and 240 is 80.
The GCD of 1280 and 240 is 7.
The GCD of 1280 and 240 is 3.</pre>
 
==={{header|Visual Basic}}===
{{works with|Visual Basic|5}}
{{works with|Visual Basic|6}}
{{works with|VBA|6.5}}
{{works with|VBA|7.1}}
<syntaxhighlight lang="vb">Function GCD(ByVal a As Long, ByVal b As Long) As Long
Dim h As Long
 
If a Then
If b Then
Do
h = a Mod b
a = b
b = h
Loop While b
End If
GCD = Abs(a)
Else
GCD = Abs(b)
End If
End Function
 
Sub Main()
' testing the above function
 
Debug.Assert GCD(12, 18) = 6
Debug.Assert GCD(1280, 240) = 80
Debug.Assert GCD(240, 1280) = 80
Debug.Assert GCD(-240, 1280) = 80
Debug.Assert GCD(240, -1280) = 80
Debug.Assert GCD(0, 0) = 0
Debug.Assert GCD(0, 1) = 1
Debug.Assert GCD(1, 0) = 1
Debug.Assert GCD(3475689, 23566319) = 7
Debug.Assert GCD(123456789, 234736437) = 3
Debug.Assert GCD(3780, 3528) = 252
End Sub</syntaxhighlight>
 
==={{header|XBasic}}===
{{works with|Windows XBasic}}
<syntaxhighlight lang="xbasic">' Greatest common divisor
PROGRAM "gcddemo"
VERSION "0.001"
 
DECLARE FUNCTION Entry()
DECLARE FUNCTION GcdRecursive(u&, v&)
DECLARE FUNCTION GcdIterative(u&, v&)
DECLARE FUNCTION GcdBinary(u&, v&)
 
FUNCTION Entry()
m& = 49865
n& = 69811
PRINT "GCD("; LTRIM$(STR$(m&)); ","; n&; "):"; GcdIterative(m&, n&); " (iterative)"
PRINT "GCD("; LTRIM$(STR$(m&)); ","; n&; "):"; GcdRecursive(m&, n&); " (recursive)"
PRINT "GCD("; LTRIM$(STR$(m&)); ","; n&; "):"; GcdBinary (m&, n&); " (binary)"
END FUNCTION
 
FUNCTION GcdRecursive(u&, v&)
IF u& MOD v& <> 0 THEN
RETURN GcdRecursive(v&, u& MOD v&)
ELSE
RETURN v&
END IF
END FUNCTION
 
FUNCTION GcdIterative(u&, v&)
DO WHILE v& <> 0
t& = u&
u& = v&
v& = t& MOD v&
LOOP
RETURN ABS(u&)
END FUNCTION
 
FUNCTION GcdBinary(u&, v&)
u& = ABS(u&)
v& = ABS(v&)
IF u& < v& THEN
t& = u&
u& = v&
v& = t&
END IF
IF v& = 0 THEN
RETURN u&
ELSE
k& = 1
DO WHILE (u& MOD 2 = 0) && (v& MOD 2 = 0)
u& = u& >> 1
v& = v& >> 1
k& = k& << 1
LOOP
IF u& MOD 2 = 0 THEN
t& = u&
ELSE
t& = -v&
END IF
DO WHILE t& <> 0
DO WHILE t& MOD 2 = 0
t& = t& \ 2
LOOP
IF t& > 0 THEN
u& = t&
ELSE
v& = -t&
END IF
t& = u& - v&
LOOP
RETURN u& * k&
END IF
END FUNCTION
 
END PROGRAM
</syntaxhighlight>
{{out}}
<pre>
GCD(49865, 69811): 9973 (iterative)
GCD(49865, 69811): 9973 (recursive)
GCD(49865, 69811): 9973 (binary)
</pre>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">sub gcd(u, v)
local t
u = int(abs(u))
v = int(abs(v))
while(v)
t = u
u = v
v = mod(t, v)
wend
return u
end sub
 
print "Greatest common divisor: ", gcd(12345, 9876)</syntaxhighlight>
 
==={{header|ZX Spectrum Basic}}===
<syntaxhighlight lang="zxbasic">10 FOR n=1 TO 3
20 READ a,b
30 PRINT "GCD of ";a;" and ";b;" = ";
40 GO SUB 70
50 NEXT n
60 STOP
70 IF b=0 THEN PRINT ABS (a): RETURN
80 LET c=a: LET a=b: LET b=FN m(c,b): GO TO 70
90 DEF FN m(a,b)=a-INT (a/b)*b
100 DATA 12,16,22,33,45,67</syntaxhighlight>
 
=={{header|Batch File}}==
Recursive method
<langsyntaxhighlight lang="dos">:: gcd.cmd
@echo off
:gcd
Line 313 ⟶ 2,183:
echo Syntax:
echo GCD {a} {b}
echo.</langsyntaxhighlight>
 
=={{header|BASIC}}==
{{works with|QuickBasic|4.5}}
===Iterative===
<lang qbasic>function gcd(a%, b%)
if a > b then
factor = a
else
factor = b
end if
for l = factor to 1 step -1
if a mod l = 0 and b mod l = 0 then
gcd = l
end if
next l
gcd = 1
end function</lang>
===Recursive===
<lang qbasic>function gcd(a%, b%)
if a = 0 gcd = b
if b = 0 gcd = a
if a > b gcd = gcd(b, a mod b)
gcd = gcd(a, b mod a)
end function</lang>
 
=={{header|BBC BASIC}}==
<lang bbcbasic> DEF FN_GCD_Iterative_Euclid(A%, B%)
LOCAL C%
WHILE B%
C% = A%
A% = B%
B% = C% MOD B%
ENDWHILE
= ABS(A%)</lang>
 
=={{header|Bc}}==
Line 354 ⟶ 2,190:
 
Utility functions:
<langsyntaxhighlight lang="bc">define even(a)
{
if ( a % 2 == 0 ) {
Line 370 ⟶ 2,206:
return(a);
}
}</langsyntaxhighlight>
 
'''Iterative (Euclid)'''
<langsyntaxhighlight lang="bc">define gcd_iter(u, v)
{
while(v) {
Line 381 ⟶ 2,217:
}
return(abs(u));
}</langsyntaxhighlight>
 
'''Recursive'''
 
<langsyntaxhighlight lang="bc">define gcd(u, v)
{
if (v) {
Line 392 ⟶ 2,228:
return (abs(u));
}
}</langsyntaxhighlight>
 
'''Iterative (Binary)'''
 
<langsyntaxhighlight lang="bc">define gcd_bin(u, v)
{
u = abs(u);
Line 427 ⟶ 2,263:
}
return (u * k);
}</langsyntaxhighlight>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let gcd(m,n) = n=0 -> m, gcd(n, m rem n)
 
let show(m,n) be
writef("gcd(%N, %N) = %N*N", m, n, gcd(m, n))
let start() be
$( show(18,12)
show(1071,1029)
show(3528,3780)
$)</syntaxhighlight>
{{out}}
<pre>gcd(18, 12) = 6
gcd(1071, 1029) = 21
gcd(3528, 3780) = 252</pre>
 
=={{header|Befunge}}==
<langsyntaxhighlight lang="befunge">#v&< @.$<
:<\g05%p05:_^#</langsyntaxhighlight>
 
=={{header|BQN}}==
<syntaxhighlight lang="bqn">Gcd ← {𝕨(|𝕊⍟(>⟜0)⊣)𝕩}</syntaxhighlight>
 
Example:
<syntaxhighlight lang="bqn">21 Gcd 35</syntaxhighlight>
<pre>7</pre>
 
=={{header|Bracmat}}==
Bracmat uses the Euclidean algorithm to simplify fractions. The <code>den</code> function extracts the denominator from a fraction.
<langsyntaxhighlight lang="bracmat">(gcd=a b.!arg:(?a.?b)&!b*den$(!a*!b^-1)^-1);</langsyntaxhighlight>
Example:
<pre>{?} gcd$(49865.69811)
{!} 9973</pre>
 
=={{header|Bruijn}}==
As defined in <code>std/Math</code>.
<syntaxhighlight lang="bruijn">
:import std/Combinator .
:import std/Number .
 
gcd y [[[=?0 1 (2 0 (1 % 0))]]]
 
:test ((gcd (+2) (+4)) =? (+2)) ([[1]])
:test ((gcd (+10) (+5)) =? (+5)) ([[1]])
:test ((gcd (+3) (+8)) =? (+1)) ([[1]])
</syntaxhighlight>
 
=={{header|C}}==
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="c">int
gcd_iter(int u, int v) {
if (u < 0) u = -u;
int t;
whileif (v < 0) {v = -v;
if (v) twhile ((u %= v) && (v %= u));
return (u =+ v);
}</syntaxhighlight>
v = t % v;
}
return u < 0 ? -u : u; /* abs(u) */
}</lang>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="c">int gcd(int u, int v) {
return (v != 0)?gcd(v, u%v):u;
}</langsyntaxhighlight>
 
===Iterative binary algorithm===
<syntaxhighlight lang="c">int gcd_bin(int u, int v) {
<lang c>int
gcd_bin(int u, int v) {
int t, k;
 
Line 474 ⟶ 2,344:
 
k = 1;
while ((u & 1) == 0 && (v & 1) == 0) { /* u, v - even */
u >>= 1; v >>= 1;
k <<= 1;
Line 481 ⟶ 2,351:
t = (u & 1) ? -v : u;
while (t) {
while ((t & 1) == 0)
t >>= 1;
 
Line 492 ⟶ 2,362:
}
return u * k;
}</langsyntaxhighlight>
 
=={{header|C++}}==
Copied from [http://rosettacode.org/wiki/Least_common_multiple least common multiple page] for the sake of completeness.
{{libheader|Boost}}
<lang cpp>#include <boost/math/common_factor.hpp>
#include <iostream>
 
int main( ) {
std::cout << "The least common multiple of 12 and 18 is " <<
boost::math::lcm( 12 , 18 ) << " ,\n"
<< "and the greatest common divisor " << boost::math::gcd( 12 , 18 ) << " !" << std::endl ;
return 0 ;
}</lang>
 
{{out}}
<pre>The least common multiple of 12 and 18 is 36 ,
and the greatest common divisor 6 !
</pre>
 
=={{header|c sharp|C#}}==
===Iterative===
<langsyntaxhighlight lang="csharp">
static void Main()
{
Line 540 ⟶ 2,392:
return a;
}
</syntaxhighlight>
</lang>
 
Example output:
Line 562 ⟶ 2,414:
</pre>
===Recursive===
<langsyntaxhighlight lang="csharp">
static void Main(string[] args)
{
Line 586 ⟶ 2,438:
return b==0 ? a : gcd(b, a % b);
}
</syntaxhighlight>
</lang>
 
Example output:
Line 607 ⟶ 2,459:
GCD of 36 and 35 is 1
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iostream>
#include <numeric>
 
int main() {
std::cout << "The greatest common divisor of 12 and 18 is " << std::gcd(12, 18) << " !\n";
}</syntaxhighlight>
 
{{libheader|Boost}}
<syntaxhighlight lang="cpp">#include <boost/math/common_factor.hpp>
#include <iostream>
 
int main() {
std::cout << "The greatest common divisor of 12 and 18 is " << boost::math::gcd(12, 18) << "!\n";
}</syntaxhighlight>
 
{{out}}
<pre>The greatest common divisor of 12 and 18 is 6!</pre>
 
=={{header|Clojure}}==
 
===Euclid's Algorithm===
<lang lisp>(defn gcd
 
<syntaxhighlight lang="lisp">(defn gcd
"(gcd a b) computes the greatest common divisor of a and b."
[a b]
(if (zero? b)
a
(recur b (mod a b))))</langsyntaxhighlight>
 
That <code>recur</code> call is the same as <code>(gcd b (mod a b))</code>, but makes use of Clojure's explicit tail call optimization.
 
This can be easily extended to work with variadic arguments:
 
<syntaxhighlight lang="lisp">(defn gcd*
"greatest common divisor of a list of numbers"
[& lst]
(reduce gcd
lst))</syntaxhighlight>
 
=== Stein's Algorithm (Binary GCD) ===
 
<syntaxhighlight lang="lisp">(defn stein-gcd [a b]
(cond
(zero? a) b
(zero? b) a
(and (even? a) (even? b)) (* 2 (stein-gcd (unsigned-bit-shift-right a 1) (unsigned-bit-shift-right b 1)))
(and (even? a) (odd? b)) (recur (unsigned-bit-shift-right a 1) b)
(and (odd? a) (even? b)) (recur a (unsigned-bit-shift-right b 1))
(and (odd? a) (odd? b)) (recur (unsigned-bit-shift-right (Math/abs (- a b)) 1) (min a b))))</syntaxhighlight>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">gcd = proc (a, b: int) returns (int)
while b~=0 do
a, b := b, a//b
end
return(a)
end gcd
 
start_up = proc()
po: stream := stream$primary_input()
as: array[int] := array[int]$[18, 1071, 3528]
bs: array[int] := array[int]$[12, 1029, 3780]
for i: int in array[int]$indexes(as) do
stream$putl(po, "gcd(" || int$unparse(as[i]) || ", "
|| int$unparse(bs[i]) || ") = "
|| int$unparse(gcd(as[i], bs[i])))
end
end start_up</syntaxhighlight>
{{out}}
<pre>gcd(18, 12) = 6
gcd(1071, 1029) = 21
gcd(3528, 3780) = 252</pre>
 
=={{header|COBOL}}==
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. GCD.
 
Line 647 ⟶ 2,562:
END-PERFORM
DISPLAY "The gcd is " A
STOP RUN.</langsyntaxhighlight>
 
=={{header|Cobra}}==
 
<langsyntaxhighlight lang="cobra">
class Rosetta
def gcd(u as number, v as number) as number
Line 664 ⟶ 2,579:
print "gcd of [96] and [27] is [.gcd(27, 96)]"
print "gcd of [51] and [34] is [.gcd(34, 51)]"
</syntaxhighlight>
</lang>
 
Output:
Line 677 ⟶ 2,592:
 
Simple recursion
<langsyntaxhighlight lang="coffeescript">
gcd = (x, y) ->
if y == 0 then x else gcd y, x % y
</syntaxhighlight>
</lang>
 
Since JS has no TCO, here's a version with no recursion
<langsyntaxhighlight lang="coffeescript">
gcd = (x, y) ->
[1..(Math.min x, y)].reduce (acc, v) ->
if x % v == 0 and y % v == 0 then v else acc
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
Common Lisp provides a ''gcd'' function.
 
<langsyntaxhighlight lang="lisp">CL-USER> (gcd 2345 5432)
7</langsyntaxhighlight>
 
Here is an implementation using the do macro. We call the function <code>gcd2gcd*</code> so as not to conflict with <code>common-lisp:gcd</code>.
 
<langsyntaxhighlight lang="lisp">(defun gcd* (a b)
(do () ((zerop b) (abs a))
(shiftf a b (mod a b))))</langsyntaxhighlight>
 
Here is a tail-recursive implementation.
 
<langsyntaxhighlight lang="lisp">(defun gcd* (a b)
(if (zerop b)
a
(gcd2 b (mod a b))))</langsyntaxhighlight>
 
The last implementation is based on the loop macro.
 
<langsyntaxhighlight lang="lisp">(defun gcd* (a b)
(loop for x = a then y
and y = b then (mod x y)
until (zerop y)
finally (return x)))</langsyntaxhighlight>
 
=={{header|Component Pascal}}==
BlackBox Component Builder
<langsyntaxhighlight lang="oberon2">
MODULE Operations;
IMPORT StdLog,Args,Strings;
Line 747 ⟶ 2,662:
 
END Operations.
</syntaxhighlight>
</lang>
Execute:<br/>
^Q Operations.DoGcd 12 8 ~<br/>
Line 760 ⟶ 2,675:
gcd(24 ,-112 )= -8
</pre>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.numeric;
 
long myGCD(in long x, in long y) pure nothrow @nogc {
Line 772 ⟶ 2,688:
gcd(15, 10).writeln; // From Phobos.
myGCD(15, 10).writeln;
}</langsyntaxhighlight>
{{out}}
<pre>5
Line 778 ⟶ 2,694:
 
=={{header|Dc}}==
<syntaxhighlight lang ="dc">[dSa%Lard0<G]dsGx+</langsyntaxhighlight>
This code assumes that there are two integers on the stack.
<pre>dc -e'28 24 [dSa%Lard0<G]dsGx+ p'</pre>
Line 784 ⟶ 2,700:
=={{header|Delphi}}==
See [[#Pascal / Delphi / Free Pascal]].
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec gcd(word m, n) word:
word t;
while n ~= 0 do
t := m;
m := n;
n := t % n
od;
m
corp
 
proc nonrec show(word m, n) void:
writeln("gcd(", m, ", ", n, ") = ", gcd(m, n))
corp
 
proc nonrec main() void:
show(18, 12);
show(1071, 1029);
show(3528, 3780)
corp</syntaxhighlight>
{{out}}
<pre>gcd(18, 12) = 6
gcd(1071, 1029) = 21
gcd(3528, 3780) = 252</pre>
 
=={{header|dt}}==
{{works with|dt|1.3.1}}
<syntaxhighlight lang="dt">[[a b]: a [b a b % gcd] b do?] \gcd def</syntaxhighlight>
 
=={{header|DWScript}}==
<langsyntaxhighlight lang="delphi">PrintLn(Gcd(231, 210));</langsyntaxhighlight>
Output:
<pre>21</pre>
 
=={{header|Dyalect}}==
 
{{trans|Go}}
 
<syntaxhighlight lang="dyalect">func gcd(a, b) {
func bgcd(a, b, res) {
if a == b {
return res * a
} else if a % 2 == 0 && b % 2 == 0 {
return bgcd(a/2, b/2, 2*res)
} else if a % 2 == 0 {
return bgcd(a/2, b, res)
} else if b % 2 == 0 {
return bgcd(a, b/2, res)
} else if a > b {
return bgcd(a-b, b, res)
} else {
return bgcd(a, b-a, res)
}
}
return bgcd(a, b, 1)
}
var testdata = [
(a: 33, b: 77),
(a: 49865, b: 69811)
]
for v in testdata {
print("gcd(\(v.a), \(v.b)) = \(gcd(v.a, v.b))")
}</syntaxhighlight>
 
{{out}}
 
<pre>gcd(33, 77) = 11
gcd(49865, 69811) = 9973</pre>
 
=={{header|E}}==
{{trans|Python}}
 
<langsyntaxhighlight lang="e">def gcd(var u :int, var v :int) {
while (v != 0) {
def r := u %% v
Line 800 ⟶ 2,782:
}
return u.abs()
}</langsyntaxhighlight>
 
=={{header|EasyLang}}==
 
<syntaxhighlight>
func gcd a b .
while b <> 0
swap a b
b = b mod a
.
return a
.
print gcd 120 35
</syntaxhighlight>
 
=={{header|EDSAC order code}}==
The EDSAC had no division instruction,
so the GCD routine below has to include its own code for division.
<syntaxhighlight lang="edsac">
[Greatest common divisor for Rosetta Code.
Program for EDSAC, Initial Orders 2.]
 
[Library subroutine R2. Reads positive integers during input of orders,
and is then overwritten (so doesn't take up any memory).
Negative numbers can be input by adding 2^35.
Each integer is followed by 'F', except the last is followed by '#TZ'.]
T 45 K [store address in location 45
values are then accessed by code letter H]
P 220 F [<------ address here]
GKT20FVDL8FA40DUDTFI40FA40FS39FG@S2FG23FA5@T5@E4@E13Z
T #H [Tell R2 the storage location defined above]
 
[Integers to be read by R2. First item is count, then pairs for GCD algo.]
4F 1066F 2019F 1815F 1914F 103785682F 167928761F 109876463F 177777648#TZ
 
[----------------------------------------------------------------------
Library subroutine P7.
Prints long strictly positive integer at 0D.
10 characters, right justified, padded left with spaces.
Closed, even; 35 storage locations; working position 4D.]
T 56 K
GKA3FT26@H28#@NDYFLDT4DS27@TFH8@S8@T1FV4DAFG31@SFLDUFOFFFSFL4F
T4DA1FA27@G11@XFT28#ZPFT27ZP1024FP610D@524D!FO30@SFL8FE22@
 
[---------------------------------------------------------------
Subroutine to return GCD of two non-negative 35-bit integers.
Input: Integers at 4D, 6D.
Output: GCD at 4D; changes 6D.
41 locations; working location 0D.]
T 100 K
G K
A 3 F [plant link]
T 39 @
S 4 D [test for 4D = 0]
E 37 @ [if so, quick exit, GCD = 6D]
T 40 @ [clear acc]
[5] A 4 D [load divisor]
[6] T D [initialize shifted divisor]
A 6 D [load dividend]
R D [shift 1 right]
S D [shifted divisor > dividend/2 yet?]
G 15 @ [yes, start subtraction]
T 40 @ [no, clear acc]
A D [shift divisor 1 more]
L D
E 6 @ [loop back (always, since acc = 0)]
[15] T 40 @ [clear acc]
[16] A 6 D [load remainder (initially = dividend)]
S D [trial subtraction]
G 20 @ [skip if can't subtract]
T 6 D [update remainder]
[20] T 40 @ [clear acc]
A 4 D [load original divisor]
S D [is shifted divisor back to original?]
E 29 @ [yes, jump out with acc = 0]
T 40 @ [no, clear acc]
A D [shift divisor 1 right]
R D
T D
E 16 @ [loop back (always, since acc = 0)]
[Here when finished dividing 6D by 4D.
Remainder is at 6D; acc = 0.]
[29] S 6 D [test for 6D = 0]
E 39 @ [if so, exit with GCD in 4D]
T D [else swap 4D and 6D]
A 4 D
T 6 D
S D
T 4 D
E 5 @ [loop back]
[37] A 6 D [here if 4D = 0 at start; GCD is 6D]
T 4 D [return in 4D as GCD]
[39] E F
[40] P F [junk word, to clear accumulator]
[----------------------------------------------------------------------
Main routine]
T 150 K
G K
[Variable]
[0] P F
[Constants]
[1] P D [single-word 1]
[2] A 2#H [order to load first number of first pair]
[3] P 2 F [to inc addresses by 2]
[4] # F [figure shift]
[5] K 2048 F [letter shift]
[6] G F [letters to print 'GCD']
[7] C F
[8] D F
[9] V F [equals sign (in figures mode)]
[10] ! F [space]
[11] @ F [carriage return]
[12] & F [line feed]
[13] K 4096 F [null char]
[Enter here with acc = 0]
[14] O 4 @ [set teleprinter to figures]
S H [negative of number of pairs]
T @ [initialize counter]
A 2 @ [initial load order]
[18] U 23 @ [plant order to load 1st integer]
U 32 @
A 3 @ [inc address by 2]
U 28 @ [plant order to load 2nd integer]
T 34 @
[23] A #H [load 1st integer (order set up at runtime)]
T D [to 0D for printing]
A 25 @ [for return from print subroutine]
G 56 F [print 1st number]
O 10 @ [followed by space]
[28] A #H [load 2nd integer (order set up at runtime)]
T D [to 0D for printing]
A 30 @ [for return from print subroutine]
G 56 F [print 2nd number]
[32] A #H [load 1st integer (order set up at runtime)]
T 4 D [to 4D for GCD subroutine]
[34] A #H [load 2nd integer (order set up at runtime)]
T 6 D [to 6D for GCD subroutine]
[36] A 36 @ [for return from subroutine]
G 100 F [call subroutine for GCD]
[Cosmetic printing, add ' GCD = ']
O 10 @
O 10 @
O 5 @
O 6 @
O 7 @
O 8 @
O 4 @
O 10 @
O 9 @
O 10 @
A 4 D [load GCD]
T D [to 0D for printing]
A 50 @ [for return from print subroutine]
G 56 F [print GCD]
O 11 @ [followed by new line]
O 12 @
[On to next pair]
A @ [load negative count of c.f.s]
A 1 @ [add 1]
E 62 @ [exit if count = 0]
T @ [store back]
A 23 @ [order to load first of pair]
A 3 @ [inc address by 4 for next c.f.]
A 3 @
G 18 @ [loop back (always, since 'A' < 0)]
[62] O 13 @ [null char to flush teleprinter buffer]
Z F [stop]
E 14 Z [define entry point]
P F [acc = 0 on entry]
</syntaxhighlight>
{{out}}
<pre>
1066 2019 GCD = 1
1815 1914 GCD = 33
103785682 167928761 GCD = 1001
109876463 177777648 GCD = 1234567
</pre>
 
=={{header|Eiffel}}==
{{trans|D}}
 
<langsyntaxhighlight lang="eiffel">
class
APPLICATION
Line 833 ⟶ 2,992:
 
end
</syntaxhighlight>
</lang>
 
=={{header|Elena}}==
{{trans|C#}}
ELENA 4.x :
<syntaxhighlight lang="elena">import system'math;
import extensions;
gcd(a,b)
{
var i := a;
var j := b;
while(j != 0)
{
var tmp := i;
i := j;
j := tmp.mod(j)
};
^ i
}
printGCD(a,b)
{
console.printLineFormatted("GCD of {0} and {1} is {2}", a, b, gcd(a,b))
}
public program()
{
printGCD(1,1);
printGCD(1,10);
printGCD(10,100);
printGCD(5,50);
printGCD(8,24);
printGCD(36,17);
printGCD(36,18);
printGCD(36,19);
printGCD(36,33);
}</syntaxhighlight>
{{out}}
<pre>
GCD of 1 and 1 is 1
GCD of 1 and 10 is 1
GCD of 10 and 100 is 10
GCD of 5 and 50 is 5
GCD of 8 and 24 is 8
GCD of 36 and 17 is 1
GCD of 36 and 18 is 18
GCD of 36 and 19 is 1
GCD of 36 and 33 is 3
</pre>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule RC do
def gcd(a,0), do: abs(a)
def gcd(a,b), do: gcd(b, rem(a,b))
Line 842 ⟶ 3,051:
 
IO.puts RC.gcd(1071, 1029)
IO.puts RC.gcd(3528, 3780)</langsyntaxhighlight>
 
{{out}}
Line 850 ⟶ 3,059:
</pre>
 
=={{header|Emacs LispElm}}==
<syntaxhighlight lang="elm">import Html exposing (Html, div, h1, p, text)
import Html.Attributes exposing (style)
 
 
<lang lisp>
-- Test cases
(defun gcd (a b)
 
(cond
nr1 : Int
((< a b) (gcd a (- b a)))
nr1 =
((> a b) (gcd (- a b) b))
2 (t* a)))3 * 5 * 7 * 11
 
</lang>
 
nr2 : Int
nr2 =
7 * 11 * 13 * 17 * 23
 
 
main : Html msg
main =
div [ style "margin" "5%", style "font-size" "1.5em", style "color" "blue" ]
[ h1 [ style "font-size" "1.5em" ] [ text "GCD Calculator" ]
, text
("number a = "
++ String.fromInt nr1
++ ", number b = "
++ String.fromInt nr2
)
, p [] [ text ("GCD = " ++ String.fromInt (gcd nr1 nr2)) ]
]
 
 
gcd : Int -> Int -> Int
gcd anr bnr =
if bnr /= 0 then
gcd bnr (modBy bnr anr)
 
else
abs anr
</syntaxhighlight>
{{out}}
<pre>
number a = 2310, number b = 391391
GCD = 77
</pre>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">(defun gcd (a b)
(cond
((< a b) (gcd a (- b a)))
((> a b) (gcd (- a b) b))
(t a)))</syntaxhighlight>
 
=={{header|Erlang}}==
 
<langsyntaxhighlight lang="erlang">% Implemented by Arjun Sunel
-module(gcd).
-export([main/0]).
Line 870 ⟶ 3,121:
gcd(A, 0) -> A;
 
gcd(A, B) -> gcd(B, A rem B).</langsyntaxhighlight>
{{out}}
<pre>4
</pre>
 
 
=={{header|ERRE}}==
This is a iterative version.
<syntaxhighlight lang="erre">
<lang ERRE>
PROGRAM EUCLIDE
! calculate G.C.D. between two integer numbers
Line 900 ⟶ 3,150:
PRINT("G.C.D. between";J%;"and";K%;"is";MCD%)
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
Input two numbers : ? 112,44
G.C.D. between 112 and 44 is 4
 
=={{header|Euler}}==
The original Euler didn't have built-in loops, this defines a while-loop procedure, as in the [[Steady Squares#Euler]] sample.
<br>
'''begin'''
'''new''' while; '''new''' gcd;
while <- ` '''formal''' condition; '''formal''' loopBody;
'''begin'''
'''label''' again;
again: '''if''' condition '''then''' '''begin''' loopBody; '''goto''' again '''end''' '''else''' 0
'''end'''
'
;
gcd <- ` '''formal''' m; '''formal''' n;
'''begin'''
'''new''' a; '''new''' b; '''new''' newA;
a <- '''abs''' m;
b <- '''abs''' n;
while( ` b <> 0 '
, ` '''begin'''
newA <- b;
b <- a '''mod''' b;
a <- newA
'''end'''
'
);
a
'''end'''
'
;
'''out''' gcd( -21, 35 )
'''end''' $
 
=={{header|Euler Math Toolbox}}==
Line 909 ⟶ 3,194:
Non-recursive version in Euler Math Toolbox. Note, that there is a built-in command.
 
<syntaxhighlight lang="text">
>ggt(123456795,1234567851)
33
Line 923 ⟶ 3,208:
>myggt(123456795,1234567851)
33
</syntaxhighlight>
</lang>
 
=={{header|Euphoria}}==
{{trans|C/C++}}
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="euphoria">function gcd_iter(integer u, integer v)
integer t
while v do
Line 940 ⟶ 3,225:
return u
end if
end function</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="euphoria">function gcd(integer u, integer v)
if v then
return gcd(v, remainder(u, v))
Line 951 ⟶ 3,236:
return u
end if
end function</langsyntaxhighlight>
 
===Iterative binary algorithm===
<langsyntaxhighlight lang="euphoria">function gcd_bin(integer u, integer v)
integer t, k
if u < 0 then -- abs(u)
Line 993 ⟶ 3,278:
end while
return u * k
end function</langsyntaxhighlight>
 
=={{header|Excel}}==
Excel's GCD can handle multiple values. Type in a cell:
<langsyntaxhighlight lang="excel">=GCD(A1:E1)</langsyntaxhighlight>
{{Out|Sample Output}}
This will get the GCD of the first 5 cells of the first row.
Line 1,004 ⟶ 3,289:
 
=={{header|Ezhil}}==
<syntaxhighlight lang="ezhil">
<lang Ezhil>
## இந்த நிரல் இரு எண்களுக்கு இடையிலான மீச்சிறு பொது மடங்கு (LCM), மீப்பெரு பொது வகுத்தி (GCD) என்ன என்று கணக்கிடும்
 
Line 1,065 ⟶ 3,350:
 
பதிப்பி "நீங்கள் தந்த இரு எண்களின் மீபொவ (மீப்பெரு பொது வகுத்தி, GCD) = ", மீபொவ(அ, ஆ)
</syntaxhighlight>
</lang>
 
=={{header|Free Pascal}}==
See [[#Pascal / Delphi / Free Pascal]].
 
=={{header|Frege}}==
<lang fsharp>module gcd.GCD where
 
pure native parseInt java.lang.Integer.parseInt :: String -> Int
 
gcd' a 0 = a
gcd' a b = gcd' b (a `mod` b)
 
main args = do
(a:b:_) = args
println $ gcd' (parseInt a) (parseInt b)
</lang>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">
let rec gcd a b =
if b = 0
Line 1,091 ⟶ 3,360:
>gcd 400 600
val it : int = 200</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">: gcd ( a b -- c )
[ abs ] [
[ nip ] [ mod ] 2bi gcd
] if-zero ;</langsyntaxhighlight>
 
=={{header|FALSE}}==
<langsyntaxhighlight lang="false">10 15$ [0=~][$@$@$@\/*-$]#%. { gcd(10,15)=5 }</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 1,125 ⟶ 3,394:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Fermat}}==
<syntaxhighlight lang="fermat">GCD(a,b)</syntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: gcd ( a b -- n )
begin dup while tuck mod repeat drop ;</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|95 and later}}
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="fortran">recursive function gcd_rec(u, v) result(gcd)
integer :: gcd
integer, intent(in) :: u, v
Line 1,143 ⟶ 3,415:
gcd = v
end if
end function gcd_rec</langsyntaxhighlight>
 
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="fortran">subroutine gcd_iter(value, u, v)
integer, intent(out) :: value
integer, intent(inout) :: u, v
Line 1,157 ⟶ 3,429:
enddo
value = abs(u)
end subroutine gcd_iter</langsyntaxhighlight>
 
A different version, and implemented as function
 
<langsyntaxhighlight lang="fortran">function gcd(v, t)
integer :: gcd
integer, intent(in) :: v, t
Line 1,175 ⟶ 3,447:
end do
gcd = b ! abs(b)
end function gcd</langsyntaxhighlight>
 
===Iterative binary algorithm===
<langsyntaxhighlight lang="fortran">subroutine gcd_bin(value, u, v)
integer, intent(out) :: value
integer, intent(inout) :: u, v
Line 1,217 ⟶ 3,489:
enddo
value = u * k
end subroutine gcd_bin</langsyntaxhighlight>
 
===Notes on performance===
Line 1,224 ⟶ 3,496:
<tt>gcd_bin(40902, 24140)</tt> takes us about '''2.5''' µsec
 
===Iterative binary algorithm in Fortran 2008===
=={{header|FreeBASIC}}==
{{works with|Fortran|2008}}
<lang FreeBASIC>' version 17-06-2015
{{works with|Fortran|2018}}
' compile with: fbc -s console
{{trans|ATS}}
Fortran 2008 introduces new intrinsic functions for integer operations that nowadays usually have hardware support, such as TRAILZ to count trailing zeros.
<syntaxhighlight lang="fortran">! Stein’s algorithm implemented in Fortran 2008.
! Translated from my implementation for ATS/Postiats.
 
elemental function gcd (u, v) result (d)
Function gcd(x As ULongInt, y As ULongInt) As ULongInt
implicit none
integer, intent(in) :: u, v
integer :: d
 
integer :: x, y
Dim As ULongInt t
 
! gcd(x,y) = gcd(u,v), but x and y are non-negative and x <= y.
While y
x = min (abs (u), abs t = y(v))
y = max (abs (u), abs y = x Mod y(v))
x = t
Wend
 
if (x Return== x0) then
d = y
else
d = gcd_pos_pos (x, y)
end if
 
contains
End Function
 
elemental function gcd_pos_pos (u, v) result (d)
' ------=< MAIN >=------
integer, intent(in) :: u, v
integer :: d
 
integer :: n
Dim As ULongInt a = 111111111111111
integer :: x, y
Dim As ULongInt b = 11111
integer :: p, q
 
! n = the number of common factors of two in u and v.
Print : Print "GCD(";a;", ";b;") = "; gcd(a, b)
Print : Print "GCD(";a;", 111)n = ";trailz gcd(aior (u, 111v))
 
! Remove the common twos from u and v, giving x and y.
x = ishft (u, -n)
y = ishft (v, -n)
 
! Make both numbers odd. One of the numbers already was odd.
! There is no effect on the value of their gcd.
x = ishft (x, -trailz (x))
y = ishft (y, -trailz (y))
 
do while (x /= y)
! If x > y then swap x and y, renaming them p
! and q. Thus p <= q, and gcd(p,q) = gcd(x,y).
p = min (x, y)
q = max (x, y)
 
x = p ! x remains odd.
q = q - p
y = ishft (q, -trailz (q)) ! Make y odd again.
end do
 
! Put the common twos back in.
d = ishft (x, n)
end function gcd_pos_pos
 
end function gcd
 
program test_gcd
implicit none
 
interface
elemental function gcd (u, v) result (d)
integer, intent(in) :: u, v
integer :: d
end function gcd
end interface
 
write (*, '("gcd (0, 0) = ", I0)') gcd (0, 0)
write (*, '("gcd (0, 10) = ", I0)') gcd (0, 10)
write (*, '("gcd (-6, -9) = ", I0)') gcd (-6, -9)
write (*, '("gcd (64 * 5, -16 * 3) = ", I0)') gcd (64 * 5, -16 * 3)
write (*, '("gcd (40902, 24140) = ", I0)') gcd (40902, 24140)
write (*, '("gcd (-40902, 24140) = ", I0)') gcd (-40902, 24140)
write (*, '("gcd (40902, -24140) = ", I0)') gcd (40902, -24140)
write (*, '("gcd (-40902, -24140) = ", I0)') gcd (-40902, -24140)
write (*, '("gcd (24140, 40902) = ", I0)') gcd (24140, 40902)
 
end program test_gcd</syntaxhighlight>
 
' empty keyboard buffer
While InKey <> "" : Var _key_ = InKey : Wend
Print : Print : Print "hit any key to end program"
Sleep
End</lang>
{{out}}
<pre>GCDgcd (1111111111111110, 111110) = 111110
gcd (0, 10) = 10
GCD(111111111111111, 111) = 111</pre>
gcd (-6, -9) = 3
gcd (64 * 5, -16 * 3) = 16
gcd (40902, 24140) = 34
gcd (-40902, 24140) = 34
gcd (40902, -24140) = 34
gcd (-40902, -24140) = 34
gcd (24140, 40902) = 34</pre>
 
=={{header|Free Pascal}}==
See [[#Pascal / Delphi / Free Pascal]].
 
=={{header|Frege}}==
<syntaxhighlight lang="fsharp">module gcd.GCD where
 
pure native parseInt java.lang.Integer.parseInt :: String -> Int
 
gcd' a 0 = a
gcd' a b = gcd' b (a `mod` b)
 
main args = do
(a:b:_) = args
println $ gcd' (parseInt a) (parseInt b)
</syntaxhighlight>
 
=={{header|Frink}}==
Frink has a builtin <CODE>gcd[x,y]</CODE> function that returns the GCD of two integers (which can be arbitrarily large.)
<langsyntaxhighlight lang="frink">
println[gcd[12345,98765]]
</syntaxhighlight>
</lang>
 
=={{header|FunL}}==
FunL has pre-defined function <code>gcd</code> in module <code>integers</code> defined as:
 
<langsyntaxhighlight lang="funl">def
gcd( 0, 0 ) = error( 'integers.gcd: gcd( 0, 0 ) is undefined' )
gcd( a, b ) =
Line 1,275 ⟶ 3,625:
_gcd( a, b ) = _gcd( b, a%b )
 
_gcd( abs(a), abs(b) )</langsyntaxhighlight>
 
== {{header|GAPFutureBasic}} ==
This is a nearly-trivial 6-line function, so we've dressed it up a bit to show how easily FB builds a full, interactive application. In FB, when you complete your code and hit RUN, the built app can open in as little as 3 seconds.
<lang gap># Built-in
 
[[File:New_app_in_finder.png|200px|frameless]]
 
It also appears in the dock, where you can run it again with a single click.
 
[[File:New_app_in_Mac_dock.png|45px|frameless]]
 
The running app looks like this—we added a button to generate random examples to
process, and an interactive design that instantly responds to each change in an input field.
 
[[File:Running_app.png|280px|frameless]]
 
<syntaxhighlight lang="futurebasic">
begin enum 1 // Object tags
_fldA
_ansA
_fldB
_ansB
_rand
end enum
 
void local fn BuildMacInterface //15-line GUI
window 1, @"Greatest Common Divisor", ( 0, 0, 380, 130 ), NSWindowStyleMaskTitled + NSWindowStyleMaskClosable
textfield _fldA,,, ( 20, 89, 156, 21 )
ControlSetAlignment( _fldA, NSTextAlignmentRight )
ControlSetFormat( _fldA, @"0123456789", Yes, 18, 0 )
textfield _fldB,,, ( 20, 57, 156, 24 )
ControlSetAlignment( _fldB, NSTextAlignmentRight )
ControlSetFormat( _fldB, @"0123456789", Yes, 18, 0 )
textlabel _ansA, @"= ", ( 182, 91, 185, 16 )
textlabel _ansB, @"= ", ( 182, 62, 185, 16 )
button _rand,,,@"Random demo", ( 129, 13, 122, 32 )
menu 1,,, @"File" : menu 1,0,, @"Close", @"w" : MenuItemSetAction(1,0,@"performClose:")
editmenu 2
WindowMakeFirstResponder( 1, _fldA )
end fn
 
local fn GCD( a as long, b as long ) as long //the requested function
while b
long c = a mod b
a = b : b = c
wend
end fn = a
 
void local fn DoDialog( ev as Long, tag as long ) //This makes it interactive
long a, b, c
select ev
case _textFieldDidchange //Find GCD of edit fields' contents
a = fn ControlIntegerValue( _fldA )
b = fn ControlIntegerValue( _fldB )
if a + b == 0 then textlabel _ansA, @"= 0" : textlabel _ansB, @"= 0" : exit fn
c = fn GCD( a, b )
textlabel _ansA, fn stringwithformat(@"= %ld x %ld", c, a / c )
textlabel _ansB, fn stringwithformat(@"= %ld x %ld", c, b / c )
case _btnclick //Fill edit fields with random content, then process
select tag
case _rand
c = rnd(65536)
textfield _fldA,,str( c * rnd(65536) )
textfield _fldB,,str( c * rnd(65536) )
fn DoDialog( _textFieldDidchange, 0 )
end select
case _windowWillClose : end
end select
end fn
 
fn BuildMacInterface
on dialog fn doDialog
handleevents
</syntaxhighlight>
{{output}}
[[File:Screenshot 2023-07-30 at 1.01.00 AM.png]]
 
=={{header|GAP}}==
<syntaxhighlight lang="gap"># Built-in
GcdInt(35, 42);
# 7
Line 1,296 ⟶ 3,721:
 
GcdInteger(35, 42);
# 7</langsyntaxhighlight>
 
=={{header|Genyris}}==
===Recursive===
<langsyntaxhighlight lang="genyris">def gcd (u v)
u = (abs u)
v = (abs v)
cond
(equal? v 0) u
else (gcd v (% u v))</langsyntaxhighlight>
 
===Iterative===
<langsyntaxhighlight lang="genyris">def gcd (u v)
u = (abs u)
v = (abs v)
Line 1,315 ⟶ 3,740:
u = v
v = tmp
u</langsyntaxhighlight>
 
=={{header|GFA Basic}}==
 
<lang basic>
'
' Greatest Common Divisor
'
a%=24
b%=112
PRINT "GCD of ";a%;" and ";b%;" is ";@gcd(a%,b%)
'
' Function computes gcd
'
FUNCTION gcd(a%,b%)
LOCAL t%
'
WHILE b%<>0
t%=a%
a%=b%
b%=t% MOD b%
WEND
'
RETURN ABS(a%)
ENDFUNC
</lang>
 
=={{header|GML}}==
<syntaxhighlight lang="gml">
 
<lang GML>
var n,m,r;
n = max(argument0,argument1);
Line 1,355 ⟶ 3,754:
}
return a;
</syntaxhighlight>
</lang>
 
=={{header|gnuplot}}==
<langsyntaxhighlight lang="gnuplot">gcd (a, b) = b == 0 ? a : gcd (b, a % b)</langsyntaxhighlight>
Example:
<syntaxhighlight lang ="gnuplot">print gcd (111111, 1111)</langsyntaxhighlight>
Output:
<syntaxhighlight lang="text">11</langsyntaxhighlight>
 
=={{header|Go}}==
===Binary Euclidian===
<syntaxhighlight lang="go">package main
 
import "fmt"
 
func gcd(a, b int) int {
var bgcd func(a, b, res int) int
 
bgcd = func(a, b, res int) int {
switch {
case a == b:
return res * a
case a % 2 == 0 && b % 2 == 0:
return bgcd(a/2, b/2, 2*res)
case a % 2 == 0:
return bgcd(a/2, b, res)
case b % 2 == 0:
return bgcd(a, b/2, res)
case a > b:
return bgcd(a-b, b, res)
default:
return bgcd(a, b-a, res)
}
}
 
return bgcd(a, b, 1)
}
 
func main() {
type pair struct {
a int
b int
}
 
var testdata []pair = []pair{
pair{33, 77},
pair{49865, 69811},
}
 
for _, v := range testdata {
fmt.Printf("gcd(%d, %d) = %d\n", v.a, v.b, gcd(v.a, v.b))
}
}
</syntaxhighlight>
{{out|Output for Binary Euclidian algorithm}}
<pre>
gcd(33, 77) = 11
gcd(49865, 69811) = 9973
</pre>
===Iterative===
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 1,381 ⟶ 3,829:
fmt.Println(gcd(49865, 69811))
}
</syntaxhighlight>
</lang>
===Builtin===
(This is just a wrapper for <tt>big.GCD</tt>)
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,398 ⟶ 3,846:
fmt.Println(gcd(33, 77))
fmt.Println(gcd(49865, 69811))
}</langsyntaxhighlight>
{{out|Output in either case}}
<pre>
Line 1,405 ⟶ 3,853:
</pre>
 
=={{header|GroovyGolfscript}}==
<syntaxhighlight lang="golfscript">;'2706 410'
~{.@\%.}do;</syntaxhighlight>
{{out}}
<pre>
82
</pre>
 
=={{header|Groovy}}==
===Recursive===
<langsyntaxhighlight lang="groovy">def gcdR
gcdR = { m, n -> m = m.abs(); n = n.abs(); n == 0 ? m : m%n == 0 ? n : gcdR(n, m%n) }</langsyntaxhighlight>
 
===Iterative===
<langsyntaxhighlight lang="groovy">def gcdI = { m, n -> m = m.abs(); n = n.abs(); n == 0 ? m : { while(m%n != 0) { t=n; n=m%n; m=t }; n }() }</langsyntaxhighlight>
 
Test program:
<langsyntaxhighlight lang="groovy">println " R I"
println "gcd(28, 0) = ${gcdR(28, 0)} == ${gcdI(28, 0)}"
println "gcd(0, 28) = ${gcdR(0, 28)} == ${gcdI(0, 28)}"
Line 1,423 ⟶ 3,878:
println "gcd(28, 70) = ${gcdR(28, 70)} == ${gcdI(28, 70)}"
println "gcd(800, 70) = ${gcdR(800, 70)} == ${gcdI(800, 70)}"
println "gcd(27, -70) = ${gcdR(27, -70)} == ${gcdI(27, -70)}"</langsyntaxhighlight>
 
Output:
Line 1,437 ⟶ 3,892:
 
=={{header|Haskell}}==
That is already available as the function ''gcd'' in the Prelude. Here's the implementation, with one name adjusted to avoid a Wiki formatting glitch:
 
<syntaxhighlight lang="haskell">gcd :: (Integral a) => a -> a -> a
That is already available as the function ''gcd'' in the Prelude. Here's the implementation:
gcd x y = gcd_ (abs x) (abs y)
 
where
<lang haskell>gcd :: (Integral a) => a -> a -> a
gcd_ a 0 = a
gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined"
gcd_ a b = gcd_ b (a `rem` b)</syntaxhighlight>
gcd x y = gcd' (abs x) (abs y) where
gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)</lang>
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest">FUNCTION gcd(a, b)
IF(b == 0) THEN
gcd = ABS(a)
Line 1,460 ⟶ 3,914:
ENDDO
ENDIF
END</langsyntaxhighlight>
 
 
=={{header|Hoon}}==
 
<syntaxhighlight lang="hoon">::
:: Greatest common divisor (gcd), Euclid's algorithm.
::
|= [a=@ud b=@ud]
^- @ud
?> (gth b 0)
?: =((mod a b) 0)
b
$(a b, b (mod a b))</syntaxhighlight>
 
<pre>
An example of use at dojo (assuming the gate is pinned as gcd):
> (gcd 123 36)
3
</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">link numbers # gcd is part of the Icon Programming Library
procedure main(args)
write(gcd(arg[1], arg[2])) | "Usage: gcd n m")
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}} [http://www.cs.arizona.edu/icon/library/procs/numbers.htm numbers] implements this as:
 
<langsyntaxhighlight Iconlang="icon">procedure gcd(i,j) #: greatest common divisor
local r
 
Line 1,481 ⟶ 3,954:
j := r
}
end</langsyntaxhighlight>
 
=={{header|J}}==
<syntaxhighlight lang J="j">x+.y</langsyntaxhighlight>
 
For example:
 
<langsyntaxhighlight Jlang="j"> 12 +. 30
6</langsyntaxhighlight>
 
Note that <code>+.</code> is a single, two character token. GCD is a primitive in J (and anyone that has studied the right kind of mathematics should instantly recognize why the same operation is used for both GCD and OR -- among other things, GCD and boolean OR both have the same identity element: 0, and of course they produce the same numeric results on the same arguments (when we are allowed to use the usual 1 bit implementation of 0 and 1 for false and true) - more than that, though, GCD corresponds to George Boole's original "Boolean Algebra" (as it was later called). The redefinition of "Boolean algebra" to include logical negation came much later, in the 20th century).
Line 1,495 ⟶ 3,968:
gcd could also be defined recursively, if you do not mind a little inefficiency:
 
<langsyntaxhighlight Jlang="j">gcd=: (| gcd [)^:(0<[)&|</langsyntaxhighlight>
 
=={{header|Java}}==
From ''javax.swing.table.DefaultTableModel''
<syntaxhighlight lang="java">
/* recursive */
int gcd(int a, int b) {
return (b == 0) ? a : gcd(b, a % b);
}
</syntaxhighlight>
 
===Iterative===
<langsyntaxhighlight lang="java">public static long gcd(long a, long b){
long factor= Math.min(a, b);
for(long loop= factor;loop > 1;loop--){
Line 1,507 ⟶ 3,988:
}
return 1;
}</langsyntaxhighlight>
 
===Iterative Euclid's Algorithm===
<langsyntaxhighlight lang="java">
public static int gcd(int a, int b) //valid for positive integers.
{
Line 1,521 ⟶ 4,002:
return a;
}
</syntaxhighlight>
</lang>
 
===Optimized Iterative===
<langsyntaxhighlight lang="java">
static int gcd(int a,int b)
{
int min=a>b?b:a,max=a+b-min, div=min;
for(int i=1;i<min;div=min/++i)
if(min%div==0&&max%div==0)
return div;
return 1;
}
</syntaxhighlight>
</lang>
 
===Iterative binary algorithm===
{{trans|C/C++}}
<langsyntaxhighlight lang="java">public static long gcd(long u, long v){
long t, k;
Line 1,566 ⟶ 4,047:
}
return u * k;
}</langsyntaxhighlight>
===Recursive===
<langsyntaxhighlight lang="java">public static long gcd(long a, long b){
if(a == 0) return b;
if(b == 0) return a;
if(a > b) return gcd(b, a % b);
return gcd(a, b % a);
}</langsyntaxhighlight>
===Built-in===
<langsyntaxhighlight lang="java">import java.math.BigInteger;
 
public static long gcd(long a, long b){
return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).longValue();
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Iterative implementation
<langsyntaxhighlight lang="javascript">function gcd(a,b) {
a = Math.abs(a);
b = Math.abs(b);
Line 1,599 ⟶ 4,080:
if (b === 0) { return a; }
}
}</langsyntaxhighlight>
 
Recursive.
<langsyntaxhighlight lang="javascript">function gcd_rec(a, b) {
return b ? gcd_rec(b, a % b) : Math.abs(a);
}</langsyntaxhighlight>
 
Implementation that works on an array of integers.
<langsyntaxhighlight lang="javascript">function GCD(arr) {
var i, y,
n = arr.length,
Line 1,625 ⟶ 4,106:
//For example:
GCD([57,0,-45,-18,90,447]); //=> 3
</syntaxhighlight>
</lang>
 
=={{header|Joy}}==
<langsyntaxhighlight lang="joy">DEFINE gcd == [0 >] [dup rollup rem] while pop.</langsyntaxhighlight>
 
=={{header|jq}}==
<langsyntaxhighlight lang="jq">def recursive_gcd(a; b):
if b == 0 then a
else recursive_gcd(b; a % b)
end ;</langsyntaxhighlight>Recent versions of jq include support for tail recursion optimization for arity-0 filters (which can be thought of as arity-1 functions), so here is an implementation that takes advantage of that optimization. Notice that the subfunction, rgcd, can be easily derived from recursive_gcd above by moving the arguments to the input:<langsyntaxhighlight lang="jq">def gcd(a; b):
# The subfunction expects [a,b] as input
# i.e. a ~ .[0] and b ~ .[1]
Line 1,640 ⟶ 4,121:
else [.[1], .[0] % .[1]] | rgcd
end;
[a,b] | rgcd ;</langsyntaxhighlight>
 
=={{header|Julia}}==
Julia includes a built-in <code>gcd</code> function:
Line 1,650 ⟶ 4,132:
1</pre>
The actual implementation of this function in Julia 0.2's standard library is reproduced here:
<langsyntaxhighlight lang="julia">function gcd{T<:Integer}(a::T, b::T)
neg = a < 0
while b != 0
Line 1,659 ⟶ 4,141:
g = abs(a)
neg ? -g : g
end</langsyntaxhighlight>
(For arbitrary-precision integers, Julia calls a different implementation from the GMP library.)
 
=={{header|K}}==
===K3===
<lang K>gcd:{:[~x;y;_f[y;x!y]]}</lang>
{{works with|Kona}}
<syntaxhighlight lang="k">gcd:{:[~x;y;_f[y;x!y]]}</syntaxhighlight>
===K6===
{{works with|ngn/k}}
<syntaxhighlight lang="k">gcd:{$[~x;y;o[x!y;x]]}</syntaxhighlight>
 
=={{header|Klong}}==
<syntaxhighlight lang="k">gcd::{:[~x;y:|~y;x:|x>y;.f(y;x!y);.f(x;y!x)]}</syntaxhighlight>
 
=={{header|Kotlin}}==
Recursive one line solution:
<langsyntaxhighlight lang="kotlin">tailrec fun gcd(a: Int, b: Int): Int = if (b == 0) kotlin.math.abs(a) else gcd(b, a % b)</langsyntaxhighlight>
 
=={{header|LabVIEW}}==
Line 1,674 ⟶ 4,164:
{{VI snippet}}<br/>
[[File:LabVIEW Greatest common divisor.png]]
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
 
{def gcd
{lambda {:a :b}
{if {= :b 0}
then :a
else {gcd :b {% :a :b}}}}}
-> gcd
 
{gcd 12 3}
-> 3
 
{gcd 123 122}
-> 1
 
{S.map {gcd 123} {S.serie 1 30}}
-> 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3
 
A simpler one if a and b are greater than zero
 
{def GCD
{lambda {:a :b}
{if {= :a :b}
then :a
else {if {> :a :b}
then {GCD {- :a :b} :b}
else {GCD :a {- :b :a}}}}}}
-> GCD
 
{S.map {GCD 123} {S.serie 1 30}}
-> 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 3
</syntaxhighlight>
 
=={{header|LFE}}==
Line 1,679 ⟶ 4,203:
{{trans|Clojure}}
 
<langsyntaxhighlight lang="lisp">
> (defun gcd
"Get the greatest common divisor."
((a 0) a)
((a b) (gcd b (rem a b))))
</syntaxhighlight>
</lang>
 
Usage:
Line 1,697 ⟶ 4,221:
17
</pre>
 
 
=={{header|Liberty BASIC}}==
<lang lb>'iterative Euclid algorithm
print GCD(-2,16)
end
 
function GCD(a,b)
while b
c = a
a = b
b = c mod b
wend
GCD = abs(a)
end function
</lang>
 
=={{header|Limbo}}==
<syntaxhighlight lang="limbo">gcd(x: int, y: int): int
 
<lang Limbo>gcd(x: int, y: int): int
{
if(y == 0)
Line 1,722 ⟶ 4,229:
return gcd(y, x % y);
}
</syntaxhighlight>
</lang>
 
=={{header|LiveCode}}==
<langsyntaxhighlight LiveCodelang="livecode">function gcd x,y
repeat until y = 0
put x mod y into z
Line 1,732 ⟶ 4,239:
end repeat
return x
end gcd</langsyntaxhighlight>
 
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">to gcd :a :b
if :b = 0 [output :a]
output gcd :b modulo :a :b
end</langsyntaxhighlight>
 
=={{header|LOLCODE}}==
<syntaxhighlight lang="lolcode">HAI 1.3
 
HOW IZ I gcd YR a AN YR b
a R BIGGR OF a AN PRODUKT OF a AN -1 BTW absolute value of a
b R BIGGR OF b AN PRODUKT OF b AN -1 BTW absolute value of b
BOTH SAEM a AN b, O RLY?
YA RLY
FOUND YR a
OIC
BOTH SAEM a AN 0, O RLY?
YA RLY
FOUND YR b
OIC
BOTH SAEM b AN 0, O RLY?
YA RLY
FOUND YR a
OIC
BOTH SAEM b AN BIGGR OF a AN b, O RLY? BTW make sure a is the larger of (a, b)
YA RLY
I HAS A temp ITZ a
a R b
b R temp
OIC
 
IM IN YR loop
I HAS A temp ITZ b
b R MOD OF a AN b
a R temp
BOTH SAEM b AN 0, O RLY?
YA RLY
FOUND YR a
OIC
IM OUTTA YR loop
IF U SAY SO
 
VISIBLE I IZ gcd YR 40902 AN YR 24140 MKAY
 
KTHXBYE</syntaxhighlight>
[https://tio.run/##jVJNU8IwFDw3v2KPOoNOwV48Oal8NAMlTpuK5ZZARMcydVrw79ekrUhlRHNJ3kt2377Ny/Jsla91VQWUoX99Q0jAF2BLMGxWa6QRJOjc7oo4EhF8NplE4OMm/xDxYTIVh/iqD8AXC0CqMs/2O40Pme018mdI4qhjAvWDQP1FYBT4XASI6ShsyqkeOKJZekccJ6X2ZA7OmCfzYS3dRJzdn8Dc8zB1ClP/gMlfYF3HDpLRrLrXrXzTKPeFNm9eS@xeNDJZbHRh276QPajLTk2GgMag2OntO5hY1rXr77Haa5vtVSuIOCwEqz8xy3ObPcFbmEWFfPitlDSULdMZM46Ude1o/DDVeSIE/RIAwsZIDFeKmBPyyGLmz0Zm4szYtUPnubfuoB28gdf3XIRTmhIyFcGTn46q6hM Try it online!]
 
=={{header|LSE}}==
<syntaxhighlight lang="lse">(*
** MÉTHODE D'EUCLIDE POUR TROUVER LE PLUS GRAND DIVISEUR COMMUN D'UN
** NUMÉRATEUR ET D'UN DÉNOMINATEUR.
*)
PROCÉDURE &PGDC(ENTIER U, ENTIER V) : ENTIER LOCAL U, V
ENTIER T
TANT QUE U > 0 FAIRE
SI U< V ALORS
T<-U
U<-V
V<-T
FIN SI
U <- U - V
BOUCLER
RÉSULTAT V
FIN PROCÉDURE
 
PROCÉDURE &DEMO(ENTIER U, ENTIER V) LOCAL U, V
AFFICHER ['Le PGDC de ',U,'/',U,' est ',U,/] U, V, &PGDC(U,V)
FIN PROCÉDURE
 
&DEMO(9,12)
&DEMO(6144,8192)
&DEMO(100,5)
&DEMO(7,23)</syntaxhighlight>
 
Resultats:
<pre>
Le PGDC de 9/12 est 3
Le PGDC de 6144/8192 est 2048
Le PGDC de 100/5 est 5
Le PGDC de 7/23 est 1
</pre>
 
=={{header|Lua}}==
{{trans|C}}
<langsyntaxhighlight lang="lua">function gcd(a,b)
if b ~= 0 then
return gcd(b, a % b)
Line 1,757 ⟶ 4,339:
demo(100, 5)
demo(5, 100)
demo(7, 23)</langsyntaxhighlight>
 
Output:
Line 1,765 ⟶ 4,347:
GCD of 7 and 23 is 1
</pre>
 
Faster iterative solution of Euclid:
<syntaxhighlight lang="lua">function gcd(a,b)
while b~=0 do
a,b=b,a%b
end
return math.abs(a)
end
</syntaxhighlight>
 
=={{header|Lucid}}==
===dataflow algorithm===
<langsyntaxhighlight lang="lucid">gcd(n,m) where
z = [% n, m %] fby if x > y then [% x - y, y %] else [% x, y - x%] fi;
x = hd(z);
y = hd(tl(z));
gcd(n, m) = (x asa x*y eq 0) fby eod;
end</langsyntaxhighlight>
 
=={{header|Luck}}==
<langsyntaxhighlight lang="luck">function gcd(a: int, b: int): int = (
if a==0 then b
else if b==0 then a
else if a>b then gcd(b, a % b)
else gcd(a, b % a)
)</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
gcd=lambda (u as long, v as long) -> {
=if(v=0&->abs(u), lambda(v, u mod v))
}
gcd_Iterative= lambda (m as long, n as long) -> {
while m {
let old_m = m
m = n mod m
n = old_m
}
=abs(n)
}
Module CheckGCD (f){
Print f(49865, 69811)=9973
Def ExpType$(x)=Type$(x)
Print ExpType$(f(49865, 69811))="Long"
}
CheckGCD gcd
CheckGCD gcd_Iterative
</syntaxhighlight>
 
=={{header|m4}}==
This should work in any POSIX-compliant m4. I have tested it with GNU m4, OpenBSD m4, and Heirloom Devtools m4. It is Euler’s algorithm.
<syntaxhighlight lang="m4">divert(-1)
define(`gcd',
`ifelse(eval(`0 <= (' $1 `)'),`0',`gcd(eval(`-(' $1 `)'),eval(`(' $2 `)'))',
eval(`0 <= (' $2 `)'),`0',`gcd(eval(`(' $1 `)'),eval(`-(' $2 `)'))',
eval(`(' $1 `) == 0'),`0',`gcd(eval(`(' $2 `) % (' $1 `)'),eval(`(' $1 `)'))',
eval(`(' $2 `)'))')
divert`'dnl
dnl
gcd(0, 0) = 0
gcd(24140, 40902) = 34
gcd(-24140, -40902) = 34
gcd(-40902, 24140) = 34
gcd(40902, -24140) = 34</syntaxhighlight>
 
{{out}}
<pre>0 = 0
34 = 34
34 = 34
34 = 34
34 = 34</pre>
 
=={{header|Maple}}==
To compute the greatest common divisor of two integers in Maple, use the procedure igcd.
 
<syntaxhighlight lang Maple="maple">igcd( a, b )</langsyntaxhighlight>
 
For example,
<syntaxhighlight lang="maple">
<lang Maple>
> igcd( 24, 15 );
3
</syntaxhighlight>
</lang>
 
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang ="mathematica">GCD[a, b]</langsyntaxhighlight>
 
=={{header|MATLAB}}==
<langsyntaxhighlight Matlablang="matlab">function [gcdValue] = greatestcommondivisor(integer1, integer2)
gcdValue = gcd(integer1, integer2);</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">/* There is a function gcd(a, b) in Maxima, but one can rewrite it */
gcd2(a, b) := block([a: abs(a), b: abs(b)], while b # 0 do [a, b]: [b, mod(a, b)], a)$
 
/* both will return 2^97 * 3^48 */
gcd(100!, 6^100), factor;
gcd2(100!, 6^100), factor;</langsyntaxhighlight>
 
=={{header|MAXScript}}==
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="maxscript">fn gcdIter a b =
(
while b > 0 do
Line 1,821 ⟶ 4,456:
)
abs a
)</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="maxscript">fn gcdRec a b =
(
if b > 0 then gcdRec b (mod a b) else abs a
)</langsyntaxhighlight>
 
=={{header|Mercury}}==
===Recursive Euclid algorithm===
<langsyntaxhighlight Mercurylang="mercury">:- module gcd.
 
:- interface.
Line 1,841 ⟶ 4,476:
 
:- pragma memo(gcd/2).
gcd(A, B) = (if B = integer(0) then A else gcd(B, A mod B)).</langsyntaxhighlight>
 
An example console program to demonstrate the gcd module:
<langsyntaxhighlight Mercurylang="mercury">:- module test_gcd.
 
:- interface.
Line 1,871 ⟶ 4,506:
Fmt = integer.to_string,
GCD = gcd(A, B),
io.format("gcd(%s, %s) = %s\n", [s(Fmt(A)), s(Fmt(B)), s(Fmt(GCD))], !IO).</langsyntaxhighlight>
 
Example output:
<langsyntaxhighlight Bashlang="bash">gcd(70000000000000000000000, 60000000000000000000000000) = 10000000000000000000000</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.37.0}}
<syntaxhighlight lang="min">((dup 0 !=) (swap over mod) while pop abs) ^gcd</syntaxhighlight>
 
=={{header|MINIL}}==
<langsyntaxhighlight lang="minil">// Greatest common divisor
00 0E GCD: ENT R0
01 1E ENT R1
Line 1,890 ⟶ 4,529:
0A 1D Stop: DEC R1
0B C2 JNZ Again
0C 80 JZ GCD // Display GCD in R0</langsyntaxhighlight>
 
=={{header|MiniScript}}==
Using an iterative Euclidean algorithm:
<syntaxhighlight lang="miniscript">gcd = function(a, b)
while b
temp = b
b = a % b
a = temp
end while
return abs(a)
end function
 
print gcd(18,12)</syntaxhighlight>
{{output}}
<pre>6</pre>
 
=={{header|MiniZinc}}==
<syntaxhighlight lang="minizinc">function var int: gcd(int:a2,int:b2) =
let {
int:a1 = max(a2,b2);
int:b1 = min(a2,b2);
array[0..a1,0..b1] of var int: gcd;
constraint forall(a in 0..a1)(
forall(b in 0..b1)(
gcd[a,b] ==
if (b == 0) then
a
else
gcd[b, a mod b]
endif
)
)
} in gcd[a1,b1];
var int: gcd1 = gcd(8,12);
solve satisfy;
output [show(gcd1),"\n"];</syntaxhighlight>
{{output}}
<pre>6</pre>
 
=={{header|MIPS Assembly}}==
<langsyntaxhighlight lang="mips">gcd:
# a0 and a1 are the two integer parameters
# return value is in v0
Line 1,906 ⟶ 4,584:
done:
move $v0, $t0
jr $ra</langsyntaxhighlight>
 
=={{header|МК-61/52}}==
Line 1,918 ⟶ 4,596:
=={{header|ML}}==
==={{header|mLite}}===
<langsyntaxhighlight lang="ocaml">fun gcd (a, 0) = a
| (0, b) = b
| (a, b) where (a < b)
Line 1,924 ⟶ 4,602:
| (a, b) = gcd (b, a rem b)
 
</syntaxhighlight>
</lang>
 
==={{header|ML}} / {{header|Standard ML}}===
 
<lang sml>fun gcd a 0 = a
See also [[#Standard ML]].
| gcd a b = gcd b (a mod b)</lang>
 
<syntaxhighlight lang="sml">fun gcd a 0 = a
| gcd a b = gcd b (a mod b)</syntaxhighlight>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE ggTkgV;
 
FROM InOut IMPORT ReadCard, WriteCard, WriteLn, WriteString, WriteBf;
Line 1,956 ⟶ 4,637:
WriteString ("u ="); WriteCard (u, 6); WriteLn;
WriteString ("v ="); WriteCard (v , 6); WriteLn
END ggTkgV.</langsyntaxhighlight>
Producing the output
<langsyntaxhighlight Modulalang="modula-2">jan@Beryllium:~/modula/Wirth/PIM$ ggtkgv
x = 12
y = 20
Line 1,971 ⟶ 4,652:
kgV = 10455
u = 13773
v = 7137</langsyntaxhighlight>
 
=={{header|Modula-3}}==
<langsyntaxhighlight lang="modula3">MODULE GCD EXPORTS Main;
 
IMPORT IO, Fmt;
Line 1,995 ⟶ 4,676:
IO.Put("GCD of 5, 100 is " & Fmt.Int(GCD(5, 100)) & "\n");
IO.Put("GCD of 7, 23 is " & Fmt.Int(GCD(7, 23)) & "\n");
END GCD.</langsyntaxhighlight>
 
Output:
Line 2,003 ⟶ 4,684:
GCD of 7, 23 is 1
</pre>
 
=={{header|Monicelli}}==
<syntaxhighlight lang="monicelli">
#main function (needs two ints from stdin)
Lei ha clacsonato bitumatissimi cari amici ospiti
voglio arrivata, Necchi bitumati qui tra noi benvenuti ENERGIAAh
voglio espertizzata, Necchi
mi porga arrivata mi porga espertizzata bitumata mi raccomando
voglio garantita, Necchi come se fosse prematurata la supercazzola accanita con arrivata, espertizzata o scherziamo?
brematurata la supercazzola novella o scherziamo? bitumata ma dai
garantita a posterdati
# gcd function
blinda la supercazzola Necchi accanita con visibilio Necchi, sgomento Necchi o scherziamo?
voglio la catarsi, Necchi bituma, e come bituma lui non bituma nessuno
voglio l'entusiasmo, Necchi bituma, chi di bituma vive bitumato muore
che cos'è il visibilio? sgomento: vaffanzum visibilio!
o magari maggiore di sgomento: catarsi come fosse visibilio meno sgomento bitumato ma non troppo
entusiasmo come fosse sgomento bitumato anche piu del necessario
o tarapia tapioco: catarsi come fosse sgomento meno il visibilio bitumante dai tempi andati
entusiasmo come fosse visibilio e velocità di esecuzione
voglio la spensierataggine, Necchi come fosse prematurata la supercazzola accanita con catarsi, entusiasmo o scherziamo?
vaffanzum la spensierataggine!
# prints new line
blinda la supercazzola novella o scherziamo?
voglio novita, Mascetti come se fosse 10 bituma come fosse una lungaggine, uno scherzo di mano
novita a posterdati!
</syntaxhighlight>
 
=={{header|MUMPS}}==
<syntaxhighlight lang="mumps">
<lang MUMPS>
GCD(A,B)
QUIT:((A/1)'=(A\1))!((B/1)'=(B\1)) 0
Line 2,012 ⟶ 4,720:
IF B'=0
FOR SET T=A#B,A=B,B=T QUIT:B=0 ;ARGUEMENTLESS FOR NEEDS TWO SPACES
QUIT A</langsyntaxhighlight>
 
Ouput:
Line 2,026 ⟶ 4,734:
=={{header|MySQL}}==
 
<langsyntaxhighlight lang="mysql">
DROP FUNCTION IF EXISTS gcd;
DELIMITER |
Line 2,051 ⟶ 4,759:
 
SELECT gcd(12345, 9876);
</syntaxhighlight>
</lang>
 
+------------------+
Line 2,059 ⟶ 4,767:
+------------------+
1 row in set (0.00 sec)
 
=={{header|Nanoquery}}==
{{trans|Java}}
===Iterative===
<syntaxhighlight lang="nanoquery">def gcd(a, b)
factor = a.min(b)
 
for loop in range(factor, 2)
if (a % loop = 0) and (b % loop = 0)
return loop
end
end
 
return 1
end</syntaxhighlight>
 
===Iterative Euclid's Method===
<syntaxhighlight lang="nanoquery">def gcd_euclid(a, b)
while b > 0
c = a % b
a = b
b = c
end
return a
end</syntaxhighlight>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 2,068 ⟶ 4,801:
return
 
-- 09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)~~
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Euclid's algorithm - iterative implementation
method gcdEucidI(a_, b_) public static
Line 2,078 ⟶ 4,811:
return a_
 
-- 09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)~~
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Euclid's algorithm - recursive implementation
method gcdEucidR(a_, b_) public static
Line 2,084 ⟶ 4,817:
return a_
 
-- 09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)~~
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method runSample(arg) private static
-- pairs of numbers, each number in the pair separated by a colon, each pair separated by a comma
Line 2,130 ⟶ 4,863:
return
 
-- 09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)~~
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method showResults(stem, title) public static
say
Line 2,141 ⟶ 4,874:
return
 
-- 09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)09:53, 27 August 2022 (UTC)~~
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method verifyResults(stem1, stem2) public static returns boolean
if stem1[0] \= stem2[0] then signal BadArgumentException
Line 2,154 ⟶ 4,887:
end i_
return verified
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,191 ⟶ 4,924:
Success: Results of iterative and recursive methods match
</pre>
 
=={{header|NewLISP}}==
<langsyntaxhighlight NewLISPlang="newlisp">(gcd 12 36)
→ 12</langsyntaxhighlight>
 
=={{header|Nial}}==
Nial provides gcd in the standard lib.
<langsyntaxhighlight lang="nial">|loaddefs 'niallib/gcd.ndf'
|gcd 6 4
=2</langsyntaxhighlight>
 
defining it for arrays
<langsyntaxhighlight lang="nial"># red is the reduction operator for a sorted list
# one is termination condition
red is cull filter (0 unequal) link [mod [rest, first] , first]
one is or [= [1 first, tally], > [2 first, first]]
gcd is fork [one, first, gcd red] sort <=</langsyntaxhighlight>
 
Using it
<langsyntaxhighlight lang="nial">|gcd 9 6 3
=3</langsyntaxhighlight>
 
=={{header|Nim}}==
Ported from {{trans|Pascal example}}
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="nim">procfunc gcd_recursive*(u, v: int64SomeSignedInt): int64 =
if u %%mod v != 0:
result = gcd_recursive(v, u %%mod v)
else:
result = abs(v</lang>)
 
when isMainModule:
import strformat
let (x, y) = (49865, 69811)
echo &"gcd({x}, {y}) = {gcd_recursive(49865, 69811)}"</syntaxhighlight>
 
{{out}}
<pre>gcd(49865, 69811) = 9973</pre>
 
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="nim">procfunc gcd_iterative*(u1u, v1v: int64SomeSignedInt): int64 =
var t: int64u = 0u
var uv = u1v
var v = v1
while v != 0:
tu = u mod v
uswap =u, v
vresult = t %% vabs(u)
 
result = abs(u)</lang>
when isMainModule:
import strformat
let (x, y) = (49865, 69811)
echo &"gcd({x}, {y}) = {gcd_iterative(49865, 69811)}")</syntaxhighlight>
 
{{out}}
<pre>gcd(49865, 69811) = 9973</pre>
 
===Iterative binary algorithm===
<langsyntaxhighlight lang="nim">proctemplate gcd_binaryisEven(u1, v1n: int64): int64bool = (n and 1) == 0
var t, k: int64
var u = u1
var v = v1
u = abs(u)
v = abs(v)
if u < v:
t = u
u = v
v = t
if v == 0:
result = u
else:
k = 1
while (u %% 2 == 0) and (v %% 2 == 0):
u = u shl 1
v = v shl 1
k = k shr 1
if (u %% 2) == 0:
t = u
else:
t = -v
while t != 0:
while (t %% 2) == 0:
t = t div 2
if t > 0:
u = t
else:
v = -t
t = u - v
result = u * k
 
func gcd_binary*(u, v: int64): int64 =
echo ("GCD(", 49865, ", ", 69811, "): ", gcd_iterative(49865, 69811), " (iterative)")
 
echo ("GCD(", 49865, ", ", 69811, "): ", gcd_recursive(49865, 69811), " (recursive)")
var u = abs(u)
echo ("GCD(", 49865, ", ", 69811, "): ", gcd_binary (49865, 69811), " (binary)")</lang>
var v = abs(v)
if u < v: swap u, v
 
if v == 0: return u
 
var k = 1
while u.isEven and v.isEven:
u = u shr 1
v = v shr 1
k = k shl 1
var t = if u.isEven: u else: -v
while t != 0:
while t.isEven: t = ashr(t, 1)
if t > 0: u = t
else: v = -t
t = u - v
result = u * k
 
when isMainModule:
import strformat
let (x, y) = (49865, 69811)
echo &"gcd({x}, {y}) = {gcd_binary(49865, 69811)}"</syntaxhighlight>
{{out}}
<pre>GCDgcd(49865, 69811): = 9973 (iterative)</pre>
GCD(49865, 69811): 9973 (recursive)
GCD(49865, 69811): 9973 (binary)</pre>
 
=={{header|Oberon-2}}==
Works with oo2c version 2
<langsyntaxhighlight lang="oberon2">
MODULE GCD;
(* Greatest Common Divisor *)
Line 2,296 ⟶ 5,036:
Out.String("GCD of 40902 and 24140 : ");Out.LongInt(Gcd(40902,24140),4);Out.Ln
END GCD.
</syntaxhighlight>
</lang>
Output:<br/>
<pre>
Line 2,305 ⟶ 5,045:
GCD of 40902 and 24140 : 34
</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class GDC {
Line 2,330 ⟶ 5,071:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let rec gcd a b = function
if | 0 -> a = 0 then b
| b -> gcd b (a mod b)</syntaxhighlight>
else if b = 0 then a
else if a > b then gcd b (a mod b)
else gcd a (b mod a)</lang>
 
A little more idiomatic version:
<lang ocaml>let rec gcd1 a b =
match (a mod b) with
0 -> b
| r -> gcd1 b r</lang>
 
=== Built-in ===
<langsyntaxhighlight lang="ocaml">#load "nums.cma";;
open Big_int;;
let gcd a b =
int_of_big_int (gcd_big_int (big_int_of_int a) (big_int_of_int b))</langsyntaxhighlight>
 
=={{header|Octave}}==
 
<langsyntaxhighlight lang="octave">r = gcd(a, b)</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
gcd is already defined into Integer class :
<syntaxhighlight lang Oforth="oforth">128 96 gcd</langsyntaxhighlight>
 
Source of this method is (see Integer.of file) :
<langsyntaxhighlight Oforthlang="oforth">Integer method: gcd self while ( dup ) [ tuck mod ] drop ;</langsyntaxhighlight>
 
=={{header|Ol}}==
<syntaxhighlight lang="scheme">
(print (gcd 1071 1029))
; ==> 21
</syntaxhighlight>
 
=={{header|Order}}==
{{trans|bc}}
<langsyntaxhighlight lang="c">#include <order/interpreter.h>
 
#define ORDER_PP_DEF_8gcd ORDER_PP_FN( \
8fn(8U, 8V, \
8if(8isnt_0(8V), 8gcd(8V, 8remainder(8U, 8V)), 8U)))
// No support for negative numbers</langsyntaxhighlight>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
fun {UnsafeGCD A B}
if B == 0 then
Line 2,390 ⟶ 5,129:
end
in
{Show {GCD 456 ~632}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<syntaxhighlight lang ="parigp">gcd(a,b)</langsyntaxhighlight>
 
[[PASCAL]]
Line 2,418 ⟶ 5,157:
=={{header|Pascal}} / {{header|Delphi}} / {{header|Free Pascal}}==
===Recursive Euclid algorithm===
{{works with|Free Pascal|version 3.2.0 }}
<lang pascal>function gcd_recursive(u, v: longint): longint;
<syntaxhighlight lang="pascal">
begin
PROGRAM EXRECURGCD.PAS;
if u mod v <> 0 then
 
gcd_recursive := gcd_recursive(v, u mod v)
{$IFDEF FPC}
else
{$mode objfpc}{$H+}{$J-}{R+}
gcd_recursive := v;
{$ELSE}
end;</lang>
{$APPTYPE CONSOLE}
{$ENDIF}
 
(*)
Free Pascal Compiler version 3.2.0 [2020/06/14] for x86_64
The free and readable alternative at C/C++ speeds
compiles natively to almost any platform, including raspberry PI
(*)
 
FUNCTION gcd_recursive(u, v: longint): longint;
 
BEGIN
IF ( v = 0 ) THEN Exit ( u ) ;
result := gcd_recursive ( v, u MOD v ) ;
END;
 
BEGIN
 
WriteLn ( gcd_recursive ( 231, 7 ) ) ;
 
END.
 
</syntaxhighlight>JPD 2021/03/14
 
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="fortran">function gcd_iterative(u, v: longint): longint;
var
t: longint;
Line 2,438 ⟶ 5,200:
end;
gcd_iterative := abs(u);
end;</langsyntaxhighlight>
 
===Iterative binary algorithm===
<langsyntaxhighlight Pascallang="pascal">function gcd_binary(u, v: longint): longint;
var
t, k: longint;
Line 2,480 ⟶ 5,242:
gcd_binary := u * k;
end;
end;</langsyntaxhighlight>
 
Demo program:
 
<langsyntaxhighlight lang="pascal">Program GreatestCommonDivisorDemo(output);
begin
writeln ('GCD(', 49865, ', ', 69811, '): ', gcd_iterative(49865, 69811), ' (iterative)');
writeln ('GCD(', 49865, ', ', 69811, '): ', gcd_recursive(49865, 69811), ' (recursive)');
writeln ('GCD(', 49865, ', ', 69811, '): ', gcd_binary (49865, 69811), ' (binary)');
end.</langsyntaxhighlight>
Output:
<pre>GCD(49865, 69811): 9973 (iterative)
Line 2,498 ⟶ 5,260:
=={{header|Perl}}==
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="perl">sub gcd_iter($$) {
my ($u, $v) = @_;
while ($v) {
Line 2,504 ⟶ 5,266:
}
return abs($u);
}</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="perl">sub gcd($$) {
my ($u, $v) = @_;
if ($v) {
Line 2,514 ⟶ 5,276:
return abs($u);
}
}</langsyntaxhighlight>
 
===Iterative binary algorithm===
<langsyntaxhighlight lang="perl">sub gcd_bin($$) {
my ($u, $v) = @_;
$u = abs($u);
Line 2,546 ⟶ 5,308:
}
return $u * $k;
}</langsyntaxhighlight>
 
===Modules===
All three modules will take large integers as input, e.g.
<tt>gcd("68095260063025322303723429387", "51306142182612010300800963053")</tt>. Other possibilities are Math::Cephes euclid, Math::GMPz gcd and gcd_ui.
<langsyntaxhighlight lang="perl"># Fastest, takes multiple inputs
use Math::Prime::Util "gcd";
$gcd = gcd(49865, 69811);
Line 2,562 ⟶ 5,324:
use Math::Pari "gcd";
$gcd = gcd(49865, 69811)->pari2iv
</syntaxhighlight>
</lang>
 
===Notes on performance===
<langsyntaxhighlight lang="perl">use Benchmark qw(cmpthese);
use Math::BigInt;
use Math::Pari;
Line 2,579 ⟶ 5,341:
'gcd_pari' => sub { Math::Pari::gcd($u,$v)->pari2iv(); },
'gcd_mpu' => sub { Math::Prime::Util::gcd($u,$v); },
});</langsyntaxhighlight>
 
Output on 'Intel i3930k 4.2GHz' / Linux / Perl 5.20:
Line 2,591 ⟶ 5,353:
gcd_mpu 7114798/s 17714% 2930% 1057% 797% 275% --
</pre>
 
=={{header|Perl 6}}==
 
===Iterative===
<lang perl6>sub gcd (Int $a is copy, Int $b is copy) {
$a & $b == 0 and fail;
($a, $b) = ($b, $a % $b) while $b;
return abs $a;
}</lang>
 
===Recursive===
<lang perl6>multi gcd (0, 0) { fail }
multi gcd (Int $a, 0) { abs $a }
multi gcd (Int $a, Int $b) { gcd $b, $a % $b }</lang>
 
===Concise===
<lang perl6>my &gcd = { ($^a.abs, $^b.abs, * % * ... 0)[*-2] }</lang>
 
===Actually, it's a built-in infix===
<lang perl6>my $gcd = $a gcd $b;</lang>
Because it's an infix, you can use it with various meta-operators:
<lang perl6>[gcd] @list; # reduce with gcd
@alist Zgcd @blist; # lazy zip with gcd
@alist Xgcd @blist; # lazy cross with gcd
@alist »gcd« @blist; # parallel gcd</lang>
 
=={{header|Phix}}==
Line 2,621 ⟶ 5,358:
atom parameters allow greater precision, but any fractional parts are immediately and deliberately discarded.<br>
Actually, it is an autoinclude, reproduced below. The first parameter can be a sequence, in which case the second parameter (if provided) is ignored.
<!--<syntaxhighlight lang="phix">-->
<lang Phix>function gcd(object u, atom v=0)
<span style="color: #008080;">function</span> <span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #004080;">object</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
atom t
<span style="color: #004080;">atom</span> <span style="color: #000000;">t</span>
if sequence(u) then
<span style="color: #008080;">if</span> <span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
v = u[1] -- (for the typecheck)
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (for the typecheck)</span>
t = floor(abs(v))
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">))</span>
for i=2 to length(u) do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
v = u[i] -- (for the typecheck)
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (for the typecheck)</span>
t = gcd(t,v)
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return t
<span style="color: #008080;">return</span> <span style="color: #000000;">t</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
u = floor(abs(u))
<span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">))</span>
v = floor(abs(v))
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">))</span>
while v do
<span style="color: #008080;">while</span> <span style="color: #000000;">v</span> <span style="color: #008080;">do</span>
t = u
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u</span>
u = v
<span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span>
v = remainder(t, v)
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
end while
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
return u
<span style="color: #008080;">return</span> <span style="color: #000000;">u</span>
end function</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<!--</syntaxhighlight>-->
Sample results
<!--<syntaxhighlight lang="phix">(phixonline)-->
<pre>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 0</span>
gcd(0,0) -- 0
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">24</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">112</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 8</span>
gcd(24,-112) -- 8
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 10</span>
gcd(0, 10) -- 10
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 10</span>
gcd(10, 0) -- 10
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 10</span>
gcd(-10, 0) -- 10
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 10</span>
gcd(0, -10) -- 10
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(9, 6) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(6, 9) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(-6, 9) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(9, -6) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(6, -9) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd(-9, 6) -- 3
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">40902</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24140</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 34 </span>
gcd(40902, 24140) -- 34
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">70000000000000000000</span><span style="color: #0000FF;">,</span>
gcd(70000000000000000000,
<span style="color: #000000;">60000000000000000000000</span><span style="color: #0000FF;">))</span>
<span style="color: #000080;font-style:italic;">-- 10000000000000000000</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">gcd</span><span style="color: #0000FF;">({</span><span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">45</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">90</span><span style="color: #0000FF;">,</span><span style="color: #000000;">447</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- 3</span>
gcd({57,0,-45,-18,90,447}) -- 3
<!--</syntaxhighlight>-->
</pre>
 
=={{header|PicoLisp}}==
<lang PicoLisp>(de gcd (A B)
(until (=0 B)
(let M (% A B)
(setq A B B M) ) )
(abs A) )</lang>
 
=={{header|PHP}}==
 
===Iterative===
<langsyntaxhighlight lang="php">
function gcdIter($n, $m) {
while(true) {
Line 2,685 ⟶ 5,417:
}
}
</syntaxhighlight>
</lang>
 
===Recursive===
<langsyntaxhighlight lang="php">
function gcdRec($n, $m)
{
Line 2,696 ⟶ 5,428:
return abs($n);
}
</syntaxhighlight>
</lang>
 
=={{header|PicoLisp}}==
<syntaxhighlight lang="picolisp">(de gcd (A B)
(until (=0 B)
(let M (% A B)
(setq A B B M) ) )
(abs A) )</syntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
GCD: procedure (a, b) returns (fixed binary (31)) recursive;
declare (a, b) fixed binary (31);
Line 2,708 ⟶ 5,447:
 
end GCD;
</syntaxhighlight>
</lang>
 
=={{header|Pop11}}==
===Built-in gcd===
<langsyntaxhighlight lang="pop11">gcd_n(15, 12, 2) =></langsyntaxhighlight>
 
Note: the last argument gives the number of other arguments (in
this case 2).
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="pop11">define gcd(k, l) -> r;
lvars k , l, r = l;
abs(k) -> k;
Line 2,726 ⟶ 5,465:
endwhile;
k -> r;
enddefine;</langsyntaxhighlight>
 
=={{header|PostScript}}==
{{libheader|initlib}}
<langsyntaxhighlight lang="postscript">
/gcd {
{
Line 2,736 ⟶ 5,475:
} loop
}.
</syntaxhighlight>
</lang>
With no external lib, recursive
<langsyntaxhighlight lang="postscript">
/gcd {
dup 0 ne {
Line 2,744 ⟶ 5,483:
} { pop } ifelse
} def
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
===Recursive Euclid Algorithm===
<langsyntaxhighlight lang="powershell">function Get-GCD ($x, $y)
{
if ($x -eq $y) { return $y }
Line 2,764 ⟶ 5,504:
}
return $b
}</langsyntaxhighlight>
 
or shorter (taken from Python implementation)
<langsyntaxhighlight lang="powershell">function Get-GCD ($x, $y) {
if ($y -eq 0) { $x } else { Get-GCD $y ($x%$y) }
}</langsyntaxhighlight>
 
===Iterative Euclid Algorithm===
 
based on Python implementation
<langsyntaxhighlight lang="powershell">
Function Get-GCD( $x, $y ) {
while ($y -ne 0) {
Line 2,781 ⟶ 5,521:
[Math]::abs($x)
}
</syntaxhighlight>
</lang>
 
=={{header|Prolog}}==
===Recursive Euclid Algorithm===
<langsyntaxhighlight lang="prolog">gcd(X, 0, X):- !.
gcd(0, X, X):- !.
gcd(X, Y, D):- X > Y, !, Z is X mod Y, gcd(Y, Z, D).
gcd(X, Y, D):- Z is Y mod X, gcd(X, Z, D).</langsyntaxhighlight>
 
===Repeated Subtraction===
<langsyntaxhighlight lang="prolog">gcd(X, 0, X):- !.
gcd(0, X, X):- !.
gcd(X, Y, D):- X =< Y, !, Z is Y - X, gcd(X, Z, D).
gcd(X, Y, D):- gcd(Y, X, D).</langsyntaxhighlight>
 
 
=={{header|PureBasic}}==
'''Iterative'''
<lang PureBasic>Procedure GCD(x, y)
Protected r
While y <> 0
r = x % y
x = y
y = r
Wend
ProcedureReturn y
EndProcedure</lang>
 
'''Recursive'''
<lang PureBasic>Procedure GCD(x, y)
Protected r
r = x % y
If (r > 0)
y = GCD(y, r)
EndIf
ProcedureReturn y
EndProcedure</lang>
 
=={{header|Purity}}==
<syntaxhighlight lang="purity">
<lang Purity>
data Iterate = f => FoldNat <const id, g => $g . $f>
 
Line 2,842 ⟶ 5,559:
 
data gcd = Iterate (gcd => uncurry (step (curry $gcd)))
</syntaxhighlight>
</lang>
 
=={{header|Python}}==
===Built-in===
{{works with|Python|2.6+}}
<syntaxhighlight lang ="python">from fractions import gcd</langsyntaxhighlight>
 
{{Works with|Python|3.7}}
(Note that '''fractions.gcd''' is now deprecated in Python 3)
<syntaxhighlight lang="python">from math import gcd</syntaxhighlight>
 
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="python">def gcd_iter(u, v):
while v:
u, v = v, u % v
return abs(u)</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
'''Interpreter:''' [[Python]] 2.5
<langsyntaxhighlight lang="python">def gcd(u, v):
return gcd(v, u % v) if v else abs(u)</langsyntaxhighlight>
 
===Tests===
Line 2,874 ⟶ 5,595:
===Iterative binary algorithm===
See [[The Art of Computer Programming]] by Knuth (Vol.2)
<langsyntaxhighlight lang="python">def gcd_bin(u, v):
u, v = abs(u), abs(v) # u >= 0, v >= 0
if u < v:
Line 2,896 ⟶ 5,617:
v = -t
t = u - v
return u * k</langsyntaxhighlight>
 
===Notes on performance===
Line 2,906 ⟶ 5,627:
 
=={{header|Qi}}==
<syntaxhighlight lang="qi">
<lang Qi>
(define gcd
A 0 -> A
A B -> (gcd B (MOD A B)))
</syntaxhighlight>
</lang>
 
=={{header|Quackery}}==
<syntaxhighlight lang="quackery">
[ [ dup while
tuck mod again ]
drop abs ] is gcd ( n n --> n )
</syntaxhighlight>
 
=={{header|R}}==
Recursive:
<langsyntaxhighlight Rlang="r">"%gcd%" <- function(u, v) {
ifelse(u %% v != 0, v %gcd% (u%%v), v)
}</langsyntaxhighlight>
Iterative:
<langsyntaxhighlight Rlang="r">"%gcd%" <- function(v, t) {
while ( (c <- v%%t) != 0 ) {
v <- t
Line 2,924 ⟶ 5,652:
}
t
}</langsyntaxhighlight>
{{out}}
Same either way.
Line 2,936 ⟶ 5,664:
Racket provides a built-in gcd function. Here's a program that computes the gcd of 14 and 63:
 
<langsyntaxhighlight lang="racket">#lang racket
 
(gcd 14 63)</langsyntaxhighlight>
 
Here's an explicit implementation. Note that since Racket is tail-calling, the memory behavior of this program is "loop-like", in the sense that this program will consume no more memory than a loop-based implementation.
 
<langsyntaxhighlight lang="racket">#lang racket
 
;; given two nonnegative integers, produces their greatest
Line 2,958 ⟶ 5,686:
(* 3 3 7))
(check-equal? (gcd 0 14) 14)
(check-equal? (gcd 13 0) 13))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
 
===Iterative===
<syntaxhighlight lang="raku" line>sub gcd (Int $a is copy, Int $b is copy) {
$a & $b == 0 and fail;
($a, $b) = ($b, $a % $b) while $b;
return abs $a;
}</syntaxhighlight>
 
===Recursive===
<syntaxhighlight lang="raku" line>multi gcd (0, 0) { fail }
multi gcd (Int $a, 0) { abs $a }
multi gcd (Int $a, Int $b) { gcd $b, $a % $b }</syntaxhighlight>
 
===Recursive(inline coderef)===
<syntaxhighlight lang="raku" line>{ $^b ?? &?BLOCK( $^b, $^a % $^b ) !! $^a }</syntaxhighlight>
 
===Concise===
<syntaxhighlight lang="raku" line>my &gcd = { ($^a.abs, $^b.abs, * % * ... 0)[*-2] }</syntaxhighlight>
 
===Actually, it's a built-in infix===
<syntaxhighlight lang="raku" line>my $gcd = $a gcd $b;</syntaxhighlight>
Because it's an infix, you can use it with various meta-operators:
<syntaxhighlight lang="raku" line>[gcd] @list; # reduce with gcd
@alist Zgcd @blist; # lazy zip with gcd
@alist Xgcd @blist; # lazy cross with gcd
@alist »gcd« @blist; # parallel gcd</syntaxhighlight>
 
=={{header|Rascal}}==
 
===Iterative Euclidean algorithm===
<langsyntaxhighlight lang="rascal">
public int gcd_iterative(int a, b){
if(a == 0) return b;
Line 2,971 ⟶ 5,728:
return a;
}
</syntaxhighlight>
</lang>
An example:
<langsyntaxhighlight lang="rascal">
rascal>gcd_iterative(1989, 867)
int: 51
</syntaxhighlight>
</lang>
 
===Recursive Euclidean algorithm===
<langsyntaxhighlight lang="rascal">
public int gcd_recursive(int a, b){
return (b == 0) ? a : gcd_recursive(b, a%b);
}
</syntaxhighlight>
</lang>
An example:
<langsyntaxhighlight lang="rascal">
rascal>gcd_recursive(1989, 867)
int: 51
</syntaxhighlight>
</lang>
 
=={{header|Raven}}==
===Recursive Euclidean algorithm===
<langsyntaxhighlight Ravenlang="raven">define gcd use $u, $v
$v 0 > if
$u $v % $v gcd
Line 2,998 ⟶ 5,755:
$u abs
 
24140 40902 gcd</langsyntaxhighlight>
{{out}}<pre>34</pre>
 
=={{header|REBOL}}==
<langsyntaxhighlight lang="rebol">gcd: func [
{Returns the greatest common divisor of m and n.}
m [integer!]
Line 3,014 ⟶ 5,772:
]
m
]</langsyntaxhighlight>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
= <Prout <Gcd 3528 3780>>;
};
 
Gcd {
s.M 0 = s.M;
s.M s.N = <Gcd s.N <Mod s.M s.N>>;
};</syntaxhighlight>
{{out}}
<pre>252</pre>
 
=={{header|Retro}}==
This is from the math extensions library.
 
<langsyntaxhighlight Retrolang="retro">: gcd ( ab-n ) [ tuck mod dup ] while drop ;</langsyntaxhighlight>
 
=={{header|REXX}}==
Line 3,026 ⟶ 5,796:
<br>argument(s), &nbsp; making it easier to use when computing Frobenius numbers &nbsp; (also known as &nbsp; ''postage stamp'' &nbsp; or &nbsp;
<br>''coin'' &nbsp; numbers).
<langsyntaxhighlight lang="rexx">/*REXX program calculates the GCD (Greatest Common Divisor) of any number of integers.*/
numeric digits 2000 /*handle up to 2k decimal dig integers.*/
call gcd 0 0 ; call gcd 55 0 ; call gcd 0 66
Line 3,043 ⟶ 5,813:
 
say 'GCD (Greatest Common Divisor) of ' translate(space($),",",' ') " is " x
return x</langsyntaxhighlight>
'''output'''
<pre>
Line 3,064 ⟶ 5,834:
===version 2===
Recursive function (as in PL/I):
<syntaxhighlight lang="rexx">
<lang REXX>
/* REXX ***************************************************************
* using PL/I code extended to many arguments
Line 3,110 ⟶ 5,880:
Parse Arg a,b
if b = 0 then return abs(a)
return GCD(b,a//b)</langsyntaxhighlight>
Output:
<pre>
Line 3,129 ⟶ 5,899:
Considerably faster than version 1 (and version 2)
<br>See http://rosettacode.org/wiki/Least_common_multiple#REXX for reasoning.
<langsyntaxhighlight lang="rexx">gcd: procedure
x=abs(arg(1))
do j=2 to arg()
Line 3,141 ⟶ 5,911:
end
end
return x</langsyntaxhighlight>
 
=={{header|Ring}}==
<syntaxhighlight lang="text">
see gcd (24, 32)
func gcd gcd, b
Line 3,153 ⟶ 5,923:
end
return gcd
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
≪ '''WHILE''' DUP '''REPEAT''' SWAP OVER MOD '''END''' DROP ABS ≫ '<span style="color:blue">'''GCD'''</span>' STO
 
40902 24140 <span style="color:blue">'''GCD'''</span>
'''Output:'''
<span style="color:grey">1:</span> 34
===Using unsigned integers===
≪ DUP2 < ≪ SWAP ≫ '''IFT'''
'''WHILE''' DUP B→R '''REPEAT''' SWAP OVER / LAST ROT * - '''END''' DROP
≫ '<span style="color:blue">'''GCD'''</span>' STO
 
#40902d #24140d <span style="color:blue">'''GCD'''</span>
'''Output:'''
<span style="color:grey">1:</span> #34d
 
=={{header|Ruby}}==
Line 3,159 ⟶ 5,944:
That is already available as the ''gcd'' method of integers:
 
<langsyntaxhighlight lang="ruby">
irb(main):001:0> 40902.gcd(24140) # => 34</syntaxhighlight>
=> 34</lang>
 
Here's an implementation:
<langsyntaxhighlight lang="ruby">def gcd(u, v)
u, v = u.abs, v.abs
while v > 0
Line 3,170 ⟶ 5,954:
end
u
end</langsyntaxhighlight>
 
=={{header|Run BASIC}}==
<lang Runbasic>print abs(gcd(-220,160))
function gcd(gcd,b)
while b
c = gcd
gcd = b
b = c mod b
wend
end function </lang>
 
 
=={{header|Rust}}==
===num crate===
<langsyntaxhighlight lang="rust">extern crate num;
use num::integer::gcd;</langsyntaxhighlight>
 
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="rust">fn gcd(mut m: i32, mut n: i32) -> i32 {
while m != 0 {
let old_m = m;
Line 3,196 ⟶ 5,969:
}
n.abs()
}</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="rust">fn gcd(m: i32, n: i32) -> i32 {
if m == 0 {
n.abs()
Line 3,205 ⟶ 5,978:
gcd(n % m, m)
}
}</langsyntaxhighlight>
 
===Stein's Algorithm===
Stein's algorithm is very much like Euclid's except that it uses bitwise operators (and consequently slightly more performant) and the integers must be unsigned. The following is a recursive implementation that leverages Rust's pattern matching.
 
<syntaxhighlight lang="rust">use std::cmp::{min, max};
fn gcd(a: usize, b: usize) -> usize {
match ((a, b), (a & 1, b & 1)) {
((x, y), _) if x == y => y,
((0, x), _) | ((x, 0), _) => x,
((x, y), (0, 1)) | ((y, x), (1, 0)) => gcd(x >> 1, y),
((x, y), (0, 0)) => gcd(x >> 1, y >> 1) << 1,
((x, y), (1, 1)) => { let (x, y) = (min(x, y), max(x, y));
gcd((y - x) >> 1, x)
}
_ => unreachable!(),
}
}</syntaxhighlight>
 
===Tests===
<langsyntaxhighlight lang="rust">
println!("{}",gcd(399,-3999));
println!("{}",gcd(0,3999));
Line 3,215 ⟶ 6,005:
3
3999
13</langsyntaxhighlight>
 
=={{header|Sass/SCSS}}==
 
Iterative Euclid's Algorithm
 
<syntaxhighlight lang="coffeescript">
@function gcd($a,$b) {
@while $b > 0 {
$c: $a % $b;
$a: $b;
$b: $c;
}
@return $a;
}
</syntaxhighlight>
 
=={{header|Sather}}==
{{trans|bc}}
<langsyntaxhighlight lang="sather">class MATH is
 
gcd_iter(u, v:INT):INT is
Line 3,270 ⟶ 6,075:
end;
 
end;</langsyntaxhighlight>
 
<langsyntaxhighlight lang="sather">class MAIN is
main is
a ::= 40902;
Line 3,282 ⟶ 6,087:
#OUT + a.gcd(b) + "\n";
end;
end;</langsyntaxhighlight>
 
=={{header|Sass/SCSS}}==
 
Iterative Euclid's Algorithm
 
<lang coffeescript>
@function gcd($a,$b) {
@while $b > 0 {
$c: $a % $b;
$a: $b;
$b: $c;
}
@return $a;
}
</lang>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def gcd(a: Int, b: Int): Int = if (b == 0) a.abs else gcd(b, a % b)</langsyntaxhighlight>
 
Using pattern matching
 
<langsyntaxhighlight lang="scala">@tailrec
def gcd(a: Int, b: Int): Int = {
b match {
Line 3,310 ⟶ 6,100:
case _ => gcd(b, (a % b))
}
}</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (gcd a b)
(if (= b 0)
a
(gcd b (modulo a b))))</langsyntaxhighlight>
 
or using the standard function included with Scheme (takes any number of arguments):
<syntaxhighlight lang ="scheme">(gcd a b)</langsyntaxhighlight>
 
=={{header|Sed}}==
 
<langsyntaxhighlight lang="sed">#! /bin/sed -nf
 
# gcd.sed Copyright (c) 2010 by Paweł Zuzelski <pawelz@pld-linux.org>
Line 3,632 ⟶ 6,422:
b next
 
# END OF GSU dc.sed</langsyntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">const func integer: gcd (in var integer: a, in var integer: b) is func
result
var integer: gcd is 0;
Line 3,647 ⟶ 6,437:
end while;
gcd := b;
end func;</langsyntaxhighlight>
Original source: [http://seed7.sourceforge.net/algorith/math.htm#gcd]
 
=={{header|SequenceL}}==
Tail Recursive Greatest Common Denominator using Euclidian Algorithm
<langsyntaxhighlight lang="sequencel">gcd(a, b) :=
a when b = 0
else
gcd(b, a mod b);</langsyntaxhighlight>
 
=={{header|SETL}}==
<langsyntaxhighlight lang="setl">a := 33; b := 77;
print(" the gcd of",a," and ",b," is ",gcd(a,b));
 
Line 3,666 ⟶ 6,456:
proc gcd (u, v);
return if v = 0 then abs u else gcd (v, u mod v) end;
end;</langsyntaxhighlight>
 
Output:
<langsyntaxhighlight lang="setl">the gcd of 33 and 77 is 11
the gcd of 49865 and 69811 is 9973</langsyntaxhighlight>
 
=={{header|Sidef}}==
===Built-in===
 
<langsyntaxhighlight lang="ruby">var arr = [100, 1_000, 10_000, 20];
say Math.gcd(arr...);</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
 
<langsyntaxhighlight lang="ruby">func gcd(a, b) {
b.is_zero ? a.abs : gcd(b, a % b);
}</langsyntaxhighlight>
 
=={{header|Simula}}==
For a recursive variant, see [[Sum multiples of 3 and 5#Simula|Sum multiples of 3 and 5]].
<syntaxhighlight lang="algolw">BEGIN
INTEGER PROCEDURE GCD(a, b); INTEGER a, b;
BEGIN
IF a = 0 THEN a := b
ELSE
WHILE 0 < b DO BEGIN INTEGER i;
i := MOD(a, b); a := b; b := i;
END;
GCD := a
END;
 
INTEGER a, b;
!outint(SYSOUT.IMAGE.MAIN.LENGTH, 0);!OUTIMAGE;!OUTIMAGE;
!SYSOUT.IMAGE :- BLANKS(132); ! this may or may not work;
FOR b := 1 STEP 5 UNTIL 37 DO BEGIN
FOR a := 0 STEP 2 UNTIL 21 DO BEGIN
OUTTEXT(" ("); OUTINT(a, 0);
OUTCHAR(','); OUTINT(b, 2);
OUTCHAR(')'); OUTINT(GCD(a, b), 3);
END;
OUTIMAGE
END
END</syntaxhighlight>
{{out}}
<pre>(0, 1) 1 (2, 1) 1 (4, 1) 1 (6, 1) 1 (8, 1) 1 (10, 1) 1 (12, 1) 1 (14, 1) 1 (16, 1) 1 (18, 1) 1 (20, 1) 1
(0, 6) 6 (2, 6) 2 (4, 6) 2 (6, 6) 6 (8, 6) 2 (10, 6) 2 (12, 6) 6 (14, 6) 2 (16, 6) 2 (18, 6) 6 (20, 6) 2
(0,11) 11 (2,11) 1 (4,11) 1 (6,11) 1 (8,11) 1 (10,11) 1 (12,11) 1 (14,11) 1 (16,11) 1 (18,11) 1 (20,11) 1
(0,16) 16 (2,16) 2 (4,16) 4 (6,16) 2 (8,16) 8 (10,16) 2 (12,16) 4 (14,16) 2 (16,16) 16 (18,16) 2 (20,16) 4
(0,21) 21 (2,21) 1 (4,21) 1 (6,21) 3 (8,21) 1 (10,21) 1 (12,21) 3 (14,21) 7 (16,21) 1 (18,21) 3 (20,21) 1
(0,26) 26 (2,26) 2 (4,26) 2 (6,26) 2 (8,26) 2 (10,26) 2 (12,26) 2 (14,26) 2 (16,26) 2 (18,26) 2 (20,26) 2
(0,31) 31 (2,31) 1 (4,31) 1 (6,31) 1 (8,31) 1 (10,31) 1 (12,31) 1 (14,31) 1 (16,31) 1 (18,31) 1 (20,31) 1
(0,36) 36 (2,36) 2 (4,36) 4 (6,36) 6 (8,36) 4 (10,36) 2 (12,36) 12 (14,36) 2 (16,36) 4 (18,36) 18 (20,36) 4
</pre>
 
=={{header|Slate}}==
Line 3,688 ⟶ 6,514:
Slate's Integer type has gcd defined:
 
<syntaxhighlight lang ="slate">40902 gcd: 24140</langsyntaxhighlight>
 
===Iterative Euclid algorithm===
 
<langsyntaxhighlight lang="slate">x@(Integer traits) gcd: y@(Integer traits)
"Euclid's algorithm for finding the greatest common divisor."
[| n m temp |
Line 3,699 ⟶ 6,525:
[n isZero] whileFalse: [temp: n. n: m \\ temp. m: temp].
m abs
].</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="slate">x@(Integer traits) gcd: y@(Integer traits)
[
y isZero
ifTrue: [x]
ifFalse: [y gcd: x \\ y]
].</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
The <tt>Integer</tt> class has its <tt>gcd</tt> method.
 
<syntaxhighlight lang ="smalltalk">(40902 gcd: 24140) displayNl</langsyntaxhighlight>
 
An reimplementation of the Iterative Euclid's algorithm would be:
 
<langsyntaxhighlight lang="smalltalk">|gcd_iter|
 
gcd_iter := [ :a :b |
Line 3,730 ⟶ 6,556:
].
 
(gcd_iter value: 40902 value: 24140) printNl.</langsyntaxhighlight>
 
=={{header|SNOBOL4}}==
<langsyntaxhighlight lang="snobol"> define('gcd(i,j)') :(gcd_end)
gcd ?eq(i,0) :s(freturn)
?eq(j,0) :s(freturn)
Line 3,744 ⟶ 6,570:
 
output = gcd(1071,1029)
end</langsyntaxhighlight>
 
=={{header|Sparkling}}==
<langsyntaxhighlight lang="sparkling">function factors(n) {
var f = {};
 
Line 3,779 ⟶ 6,605:
function LCM(n, k) {
return n * k / GCD(n, k);
}</langsyntaxhighlight>
 
=={{header|SQL}}==
Demonstration of Oracle 12c WITH Clause Enhancements
<langsyntaxhighlight SQLlang="sql">drop table tbl;
create table tbl
(
Line 3,816 ⟶ 6,643:
from tbl
/
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,851 ⟶ 6,678:
22 55 11
</pre>
 
Demonstration of SQL Server 2008
<syntaxhighlight lang="sql">CREATE FUNCTION gcd (
@ui INT,
@vi INT
) RETURNS INT
 
AS
 
BEGIN
DECLARE @t INT
DECLARE @u INT
DECLARE @v INT
SET @u = @ui
SET @v = @vi
 
WHILE @v > 0
BEGIN
SET @t = @u;
SET @u = @v;
SET @v = @t % @v;
END;
RETURN abs( @u );
END
 
GO
 
CREATE TABLE tbl (
u INT,
v INT
);
INSERT INTO tbl ( u, v ) VALUES ( 20, 50 );
INSERT INTO tbl ( u, v ) VALUES ( 21, 50 );
INSERT INTO tbl ( u, v ) VALUES ( 21, 51 );
INSERT INTO tbl ( u, v ) VALUES ( 22, 50 );
INSERT INTO tbl ( u, v ) VALUES ( 22, 55 );
 
SELECT u, v, dbo.gcd ( u, v )
FROM tbl;
 
DROP TABLE tbl;
 
DROP FUNCTION gcd;
</syntaxhighlight>
 
PostgreSQL function using a recursive common table expression
<syntaxhighlight lang="sql">CREATE FUNCTION gcd(integer, integer)
RETURNS integer
LANGUAGE sql
AS $function$
WITH RECURSIVE x (u, v) AS (
SELECT ABS($1), ABS($2)
UNION
SELECT v, u % v FROM x WHERE v > 0
)
SELECT min(u) FROM x;
$function$
</syntaxhighlight>
 
{{out}}
<pre>
postgres> select gcd(40902, 24140);
gcd
-----
34
SELECT 1
Time: 0.012s
</pre>
 
=={{header|Standard ML}}==
 
See also [[#ML / Standard ML]].
 
<syntaxhighlight lang="sml">(* Euclid’s algorithm. *)
 
fun gcd (u, v) =
let
fun loop (u, v) =
if v = 0 then
u
else
loop (v, u mod v)
in
loop (abs u, abs v)
end
 
(* Using the Rosetta Code example for assertions in Standard ML. *)
fun assert cond =
if cond then () else raise Fail "assert"
val () = assert (gcd (0, 0) = 0)
val () = assert (gcd (0, 10) = 10)
val () = assert (gcd (~10, 0) = 10)
val () = assert (gcd (9, 6) = 3)
val () = assert (gcd (~6, ~9) = 3)
val () = assert (gcd (40902, 24140) = 34)
val () = assert (gcd (40902, ~24140) = 34)
val () = assert (gcd (~40902, 24140) = 34)
val () = assert (gcd (~40902, ~24140) = 34)
val () = assert (gcd (24140, 40902) = 34)
val () = assert (gcd (~24140, 40902) = 34)
val () = assert (gcd (24140, ~40902) = 34)
val () = assert (gcd (~24140, ~40902) = 34)</syntaxhighlight>
 
=={{header|Stata}}==
 
<syntaxhighlight lang="stata">function gcd(a_,b_) {
a = abs(a_)
b = abs(b_)
while (b>0) {
a = mod(a,b)
swap(a,b)
}
return(a)
}</syntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight Swiftlang="swift">// Iterative
 
func gcd(var a: Int, var b: Int) -> Int {
var a = abs(a); b = abs(b)
var b = abs(b)
if (b > a) { swap(&a, &b) }
Line 3,868 ⟶ 6,813:
// Recursive
 
func gcdr (var a: Int, var b: Int) -> Int {
var a = abs(a); b = abs(b)
var b = abs(b)
 
if (b > a) { swap(&a, &b) }
Line 3,888 ⟶ 6,834:
println("Iterative: GCD of \(a) and \(b) is \(gcd(a, b))")
println("Recursive: GCD of \(a) and \(b) is \(gcdr(a, b))")
}</langsyntaxhighlight>
{{out}}
<pre>
Line 3,907 ⟶ 6,853:
=={{header|Tcl}}==
===Iterative Euclid algorithm===
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
namespace path {::tcl::mathop ::tcl::mathfunc}
proc gcd_iter {p q} {
Line 3,914 ⟶ 6,860:
}
abs $p
}</langsyntaxhighlight>
 
===Recursive Euclid algorithm===
<langsyntaxhighlight lang="tcl">proc gcd {p q} {
if {$q == 0} {
return $p
}
gcd $q [expr {$p % $q}]
}</langsyntaxhighlight>
With Tcl 8.6, this can be optimized slightly to:
<langsyntaxhighlight lang="tcl">proc gcd {p q} {
if {$q == 0} {
return $p
}
tailcall gcd $q [expr {$p % $q}]
}</langsyntaxhighlight>
(Tcl does not perform automatic tail-call optimization introduction because that makes any potential error traces less informative.)
 
===Iterative binary algorithm===
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
namespace path {::tcl::mathop ::tcl::mathfunc}
proc gcd_bin {p q} {
Line 3,954 ⟶ 6,900:
}
return [* $p $k]
}</langsyntaxhighlight>
 
===Notes on performance===
<langsyntaxhighlight lang="tcl">foreach proc {gcd_iter gcd gcd_bin} {
puts [format "%-8s - %s" $proc [time {$proc $u $v} 100000]]
}</langsyntaxhighlight>
Outputs:
<pre>gcd_iter - 4.46712 microseconds per iteration
Line 3,965 ⟶ 6,911:
gcd_bin - 9.25613 microseconds per iteration</pre>
 
=={{header|TITransact-83 BASIC}}, {{header|TI-89 BASICSQL}}==
<syntaxhighlight lang="transact-sql">
gcd(A,B)
CREATE OR ALTER FUNCTION [dbo].[PGCD]
The ) can be omitted in TI-83 basic
( @a BigInt
, @b BigInt
)
RETURNS BigInt
WITH RETURNS NULL ON NULL INPUT
-- Calculates the Greatest Common Denominator of two numbers (1 if they are coprime).
BEGIN
DECLARE @PGCD BigInt;
 
WITH Vars(A, B)
As ( SELECT Max(V.N) As A
, Min(V.N) As B
FROM ( VALUES ( Abs(@a) , Abs(@b)) ) Params(A, B)
-- First, get absolute value
Cross APPLY ( VALUES (Params.A) , (Params.B) ) V(N)
-- Then, order parameters without Greatest/Least functions
WHERE Params.A > 0
And Params.B > 0 -- If 0 passed in, NULL shall be the output
)
, Calc(A, B)
As ( SELECT A
, B
FROM Vars
 
UNION ALL
 
SELECT B As A
, A % B As B -- Self-ordering
FROM Calc
WHERE Calc.A > 0
And Calc.B > 0
)
SELECT @PGCD = Min(A)
FROM Calc
WHERE Calc.B = 0
;
 
RETURN @PGCD;
 
END
</syntaxhighlight>
 
=={{header|TSE SAL}}==
<syntaxhighlight lang="tse sal">
<lang TSE SAL>
 
// library: math: get: greatest: common: divisor <description>greatest common divisor whole numbers. Euclid's algorithm. Recursive version</description> <version control></version control> <version>1.0.0.0.3</version> <version control></version control> (filenamemacro=getmacdi.s) [<Program>] [<Research>] [kn, ri, su, 20-01-2013 14:22:41]
Line 3,995 ⟶ 6,982:
END
 
</syntaxhighlight>
</lang>
 
 
=={{header|TXR}}==
 
<langsyntaxhighlight lang="bash">$ txr -cp @(bind g @'(gcd (expt 2 123) (expt 6 49)))'
g="562949953421312"</langsyntaxhighlight>
 
=={{header|TypeScript}}==
Iterative implementation
<langsyntaxhighlight lang="javascript">function gcd(a: number, b: number) {
a = Math.abs(a);
b = Math.abs(b);
Line 4,021 ⟶ 7,007:
if (b === 0) { return a; }
}
}</langsyntaxhighlight>
 
Recursive.
<langsyntaxhighlight lang="javascript">function gcd_rec(a: number, b: number) {
return b ? gcd_rec(b, a % b) : Math.abs(a);
}</langsyntaxhighlight>
 
== [[:Category:Uiua|Uiua]] ==
<syntaxhighlight>
⊙◌⍢(⊃∘◿:)(±,)
</syntaxhighlight>
 
=={{header|uBasic/4tH}}==
{{trans|BBC BASIC}}
<lang>Print "GCD of 18 : 12 = "; FUNC(_GCD_Iterative_Euclid(18,12))
Print "GCD of 1071 : 1029 = "; FUNC(_GCD_Iterative_Euclid(1071,1029))
Print "GCD of 3528 : 3780 = "; FUNC(_GCD_Iterative_Euclid(3528,3780))
 
End
 
_GCD_Iterative_Euclid Param(2)
Local (1)
Do While b@
c@ = a@
a@ = b@
b@ = c@ % b@
Loop
Return (Abs(a@))</lang>
{{out}}
<pre>GCD of 18 : 12 = 6
GCD of 1071 : 1029 = 21
GCD of 3528 : 3780 = 252
 
0 OK, 0:205</pre>
=={{header|UNIX Shell}}==
{{works with|Bourne Shell}}
<langsyntaxhighlight lang="bash">gcd() {
# Calculate $1 % $2 until $2 becomes zero.
until test 0 -eq "$2"; do
Line 4,066 ⟶ 7,034:
 
gcd -47376 87843
# => 987</langsyntaxhighlight>
 
==={{header|dash or bash}}===
Procedural :
<syntaxhighlight lang="bash">gcd() { until test 0 -eq "$2";do set -- "$2" "$(($1 % $2))";done;if [ 0 -gt "$1" ];then echo "$((- $1))";else echo "$1"; fi }
 
gcd -47376 87843
# => 987</syntaxhighlight>
 
 
Recursive :
<syntaxhighlight lang="bash">
gcd () { if [ "$2" -ne 0 ];then gcd "$2" "$(($1 % $2))";else echo "$1";fi }
 
gcd 100 75
# => 25</syntaxhighlight>
 
==={{header|C Shell}}===
<langsyntaxhighlight lang="csh">alias gcd eval \''set gcd_args=( \!*:q ) \\
@ gcd_u=$gcd_args[2] \\
@ gcd_v=$gcd_args[3] \\
Line 4,083 ⟶ 7,066:
gcd result -47376 87843
echo $result
# => 987</langsyntaxhighlight>
 
=={{header|Ursa}}==
<syntaxhighlight lang="ursa">import "math"
out (gcd 40902 24140) endl console</syntaxhighlight>
{{out}}
<pre>34</pre>
 
=={{header|Ursala}}==
Line 4,091 ⟶ 7,080:
it includes a bit shifting optimization that happens when both operands
are even.
<langsyntaxhighlight Ursalalang="ursala">#import nat
 
gcd = ~&B?\~&Y ~&alh^?\~&arh2faltPrXPRNfabt2RCQ @a ~&ar^?\~&al ^|R/~& ^/~&r remainder</langsyntaxhighlight>
test program:
<langsyntaxhighlight Ursalalang="ursala">#cast %nWnAL
 
test = ^(~&,gcd)* <(25,15),(36,16),(120,45),(30,100)></langsyntaxhighlight>
output:
<pre><
Line 4,134 ⟶ 7,123:
=21
 
=={{header|VBAVerilog}}==
<syntaxhighlight lang="verilog">module gcd
This function uses repeated subtractions. Simple but not very efficient.
(
input reset_l,
input clk,
 
input [31:0] initial_u,
<lang VBA>
input [31:0] initial_v,
Public Function GCD(a As Long, b As Long) As Long
input load,
While a <> b
If a > b Then a = a - b Else b = b - a
Wend
GCD = a
End Function
</lang>
 
output reg [31:0] result,
Example:
output reg busy
);
 
reg [31:0] u, v;
<pre>
print GCD(1280, 240)
80
print GCD(3475689, 23566319)
7
a=123456789
b=234736437
print GCD((a),(b))
3
</pre>
 
always @(posedge clk or negedge reset_l)
if (!reset_l)
begin
busy <= 0;
u <= 0;
v <= 0;
end
else
begin
 
result <= u + v; // Result (one of them will be zero)
A note on the last example: using brackets forces a and b to be evaluated before GCD is called. Not doing this will cause a compile error because a and b are not the same type as in the function declaration (they are Variant, not Long). Alternatively you can use the conversion function CLng as in print GCD(CLng(a),CLng(b))
 
busy <= u && v; // We're still busy...
=={{header|VBScript}}==
<lang VBScript>Function GCD(a,b)
Do
If a Mod b > 0 Then
c = a Mod b
a = b
b = c
Else
GCD = b
Exit Do
End If
Loop
End Function
 
// Repeatedly subtract smaller number from larger one
WScript.Echo "The GCD of 48 and 18 is " & GCD(48,18) & "."
if (v <= u)
WScript.Echo "The GCD of 1280 and 240 is " & GCD(1280,240) & "."
u <= u - v;
WScript.Echo "The GCD of 1280 and 240 is " & GCD(3475689,23566319) & "."
else if (u < v)
WScript.Echo "The GCD of 1280 and 240 is " & GCD(123456789,234736437) & "."</lang>
v <= v - u;
 
if (load) // Load new problem when high
{{Output}}
begin
<pre>The GCD of 48 and 18 is 6.
u <= initial_u;
The GCD of 1280 and 240 is 80.
v <= initial_v;
The GCD of 1280 and 240 is 7.
busy <= 1;
The GCD of 1280 and 240 is 3.</pre>
end
 
end
 
endmodule
</syntaxhighlight>
 
=={{header|V (Vlang)}}==
===Iterative===
<syntaxhighlight lang="go">fn gcd(xx int, yy int) int {
mut x, mut y := xx, yy
for y != 0 {
x, y = y, x%y
}
return x
}
fn main() {
println(gcd(33, 77))
println(gcd(49865, 69811))
}
</syntaxhighlight>
===Builtin===
(This is just a wrapper for <tt>big.gcd</tt>)
<syntaxhighlight lang="v (vlang)">import math.big
fn gcd(x i64, y i64) i64 {
return big.integer_from_i64(x).gcd(big.integer_from_i64(y)).int()
}
fn main() {
println(gcd(33, 77))
println(gcd(49865, 69811))
}</syntaxhighlight>
{{out|Output in either case}}
<pre>
11
9973
</pre>
 
=={{header|Wortel}}==
Operator
<syntaxhighlight lang ="wortel">@gcd a b</langsyntaxhighlight>
Number expression
<syntaxhighlight lang ="wortel">!#~kg a b</langsyntaxhighlight>
Iterative
<langsyntaxhighlight lang="wortel">&[a b] [@vars[t] @while b @:{t b b %a b a t} a]</langsyntaxhighlight>
Recursive
<langsyntaxhighlight lang="wortel">&{gcd a b} ?{b !!gcd b %a b @abs a}</langsyntaxhighlight>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var gcd = Fn.new { |x, y|
while (y != 0) {
var t = y
y = x % y
x = t
}
return x.abs
}
 
System.print("gcd(33, 77) = %(gcd.call(33, 77))")
System.print("gcd(49865, 69811) = %(gcd.call(49865, 69811))")</syntaxhighlight>
 
{{out}}
<pre>
gcd(33, 77) = 11
gcd(49865, 69811) = 9973
</pre>
 
=={{header|x86 Assembly}}==
Using GNU Assembler syntax:
<langsyntaxhighlight lang="8086 Assemblyassembly">.text
.global pgcd
 
Line 4,222 ⟶ 7,257:
pop %edx
leave
ret</langsyntaxhighlight>
 
=={{header|XLISP}}==
<code>GCD</code> is a built-in function. If we wanted to reimplement it, one (tail-recursive) way would be like this:
<syntaxhighlight lang="lisp">(defun greatest-common-divisor (x y)
(if (= y 0)
x
(greatest-common-divisor y (mod x y)) ) )</syntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes;
 
func GCD(U, V); \Return the greatest common divisor of U and V
Line 4,236 ⟶ 7,278:
 
\Display the GCD of two integers entered on command line
IntOut(0, GCD(IntIn(8), IntIn(8)))</langsyntaxhighlight>
 
=={{header|Z80 Assembly}}==
Uses the iterative subtraction implementation of Euclid's algorithm because the Z80 does not implement modulus or division opcodes.
<langsyntaxhighlight lang="z80">; Inputs: a, b
; Outputs: a = gcd(a, b)
; Destroys: c
Line 4,261 ⟶ 7,303:
ld a, c
 
jr gcd</langsyntaxhighlight>
 
=={{header|Zig}}==
<syntaxhighlight lang="zig">pub fn gcd(u: anytype, v: anytype) @TypeOf(u) {
if (@typeInfo(@TypeOf(u)) != .Int) {
@compileError("non-integer type used on gcd: " ++ @typeName(@TypeOf(u)));
}
if (@typeInfo(@TypeOf(v)) != .Int) {
@compileError("non-integer type used on gcd: " ++ @typeName(@TypeOf(v)));
}
return if (v != 0) gcd(v, @mod(u,v)) else u;
}</syntaxhighlight>
 
=={{header|zkl}}==
This is a method on integers:
<langsyntaxhighlight lang="zkl">(123456789).gcd(987654321) //-->9</langsyntaxhighlight>
Using the gnu big num library (GMP):
<langsyntaxhighlight lang="zkl">var BN=Import("zklBigNum");
BN(123456789).gcd(987654321) //-->9</langsyntaxhighlight>
or
<langsyntaxhighlight lang="zkl">fcn gcd(a,b){ while(b){ t:=a; a=b; b=t%b } a.abs() }</langsyntaxhighlight>
55

edits