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( "", "" ), "" )

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)
Posted by: Scott Morrison | January 18, 2006 at 11:04 PM
A nice bit; thanks, Scott!
Posted by: Mikhail Edoshin | January 19, 2006 at 10:56 PM