« Rounding to a given number | Main | Fraction(): approximate a number as a common fraction »

Greatest Common Divisor

The function finds the greatest common divisor or greatest common factor for two numbers; for example, the greatest common divisor for 8 and 12 is 4. It's very simple and is widely available in fact, but I'll need it for some next posts, which are almost written now.

The function code is almost identical to Scott Morrison's variant, but my variant also checks the input values.

The function

GCD( greater number, smaller number)

Let( [ 
  greater = GetAsNumber( greater number );
  smaller = GetAsNumber( smaller number ) ];

  Case( 
    IsEmpty( greater ) or IsEmpty( smaller );
      "";

   smaller = 0; 
    greater;

  GCD( smaller; Mod( greater; smaller ) ) ) )

A test for the function tester

Assert Equals( GCD( 60, 1 ), 1 ) & 
Assert Equals( GCD( 60, 2 ), 2 ) & 
Assert Equals( GCD( 60, 3 ), 3 ) & 
Assert Equals( GCD( 60, 4 ), 4 ) & 
Assert Equals( GCD( 60, 5 ), 5 ) & 
Assert Equals( GCD( 60, 6 ), 6 ) & 
Assert Equals( GCD( 60, 7 ), 1 ) &
Assert Equals( GCD( 60, 8 ), 4 ) & 
Assert Equals( GCD( 60, 9 ), 3 ) & 
Assert Equals( GCD( 60, 10 ), 10 ) &

Assert Equals( GCD( 60, 11 ), 1 ) & 
Assert Equals( GCD( 60, 12 ), 12 ) & 
Assert Equals( GCD( 60, 13 ), 1 ) & 
Assert Equals( GCD( 60, 14 ), 2 ) & 
Assert Equals( GCD( 60, 15 ), 15 ) & 
Assert Equals( GCD( 60, 16 ), 4 ) & 
Assert Equals( GCD( 60, 17 ), 1 ) &
Assert Equals( GCD( 60, 18 ), 6 ) & 
Assert Equals( GCD( 60, 19 ), 1 ) & 
Assert Equals( GCD( 60, 20 ), 20 ) & 

Assert Equals( GCD( 60, 21 ), 3 ) & 
Assert Equals( GCD( 60, 22 ), 2 ) & 
Assert Equals( GCD( 60, 23 ), 1 ) & 
Assert Equals( GCD( 60, 24 ), 12 ) & 
Assert Equals( GCD( 60, 25 ), 5 ) & 
Assert Equals( GCD( 60, 26 ), 2 ) & 
Assert Equals( GCD( 60, 27 ), 3 ) &
Assert Equals( GCD( 60, 28 ), 4 ) & 
Assert Equals( GCD( 60, 29 ), 1 ) & 
Assert Equals( GCD( 60, 30 ), 30 ) & 

Assert Equals( GCD( 60, 31 ), 1 ) & 
Assert Equals( GCD( 60, 32 ), 4 ) & 
Assert Equals( GCD( 60, 33 ), 3 ) & 
Assert Equals( GCD( 60, 34 ), 2 ) & 
Assert Equals( GCD( 60, 35 ), 5 ) & 
Assert Equals( GCD( 60, 36 ), 12 ) & 
Assert Equals( GCD( 60, 37 ), 1 ) &
Assert Equals( GCD( 60, 38 ), 2 ) & 
Assert Equals( GCD( 60, 39 ), 3 ) & 
Assert Equals( GCD( 60, 40 ), 20 ) & 

Assert Equals( GCD( 60, 41 ), 1 ) & 
Assert Equals( GCD( 60, 42 ), 6 ) & 
Assert Equals( GCD( 60, 43 ), 1 ) & 
Assert Equals( GCD( 60, 44 ), 4 ) & 
Assert Equals( GCD( 60, 45 ), 15 ) & 
Assert Equals( GCD( 60, 46 ), 2 ) & 
Assert Equals( GCD( 60, 47 ), 1 ) &
Assert Equals( GCD( 60, 48 ), 12 ) & 
Assert Equals( GCD( 60, 49 ), 1 ) & 
Assert Equals( GCD( 60, 50 ), 10 ) & 

Assert Equals( GCD( 60, 51 ), 3 ) & 
Assert Equals( GCD( 60, 52 ), 4 ) & 
Assert Equals( GCD( 60, 53 ), 1 ) & 
Assert Equals( GCD( 60, 54 ), 6 ) & 
Assert Equals( GCD( 60, 55 ), 5 ) & 
Assert Equals( GCD( 60, 56 ), 4 ) & 
Assert Equals( GCD( 60, 57 ), 3 ) &
Assert Equals( GCD( 60, 58 ), 2 ) & 
Assert Equals( GCD( 60, 59 ), 1 ) & 
Assert Equals( GCD( 60, 60 ), 60 ) & 

Assert Equals( GCD( 8, 12 ), 4 ) & 
Assert Equals( GCD( 12, 8 ), 4 ) & 

Assert Equals( GCD( 0, 0 ), 0 ) & 
Assert Equals( GCD( 0, 1 ), 1 ) & 
Assert Equals( GCD( 1, 0 ), 1 ) & 
Assert Equals( GCD( 12345, 0 ), 12345 ) & 
Assert Equals( GCD( 0, 12345 ), 12345 ) &

Assert Equals( GCD( "", 1 ), "" ) & 
Assert Equals( GCD( 1, "" ), "" ) & 
Assert Equals( GCD( "", "" ), "" )

TrackBack

TrackBack URL for this entry:
http://www.typepad.com/t/trackback/510343/4069200

Listed below are links to weblogs that reference Greatest Common Divisor:

Comments

Also as a note, remember that the Lowest Common Multiple of 2 numbers = the Product / GCF

eg:

LCM(a,b) = a*b/gcf(a,b)

A nice bit; thanks, Scott!

Post a comment

If you have a TypeKey or TypePad account, please Sign In