Binary GCD Algorithm implemented in D
import std.stdio;
import std.traits;
// Template function to find the GCD using Stein's algorithm for non negative integral types
T steinGCD(T)(T a, T b) if (isIntegral!T && isUnsigned!T)
{
// Base cases
if (a == b)
return a;
if (a == T(0))
return b;
if (b == T(0))
return a;
// If both a and b are even, divide them by 2
if ((a & T(1)) == T(0) && (b & T(1)) == T(0))
return steinGCD(a >> T(1), b >> T(1)) << T(1);
// If a is even and b is odd, divide a by 2
if ((a & T(1)) == T(0))
return steinGCD(a >> T(1), b);
// If a is odd and b is even, divide b by 2
if ((b & T(1)) == T(0))
return steinGCD(a, b >> T(1));
// If both a and b are odd, subtract smaller from larger
if (a > b)
return steinGCD((a - b) >> T(1), b);
return steinGCD((b - a) >> T(1), a);
}
void main()
{
// Example #1 usage with unsigned integers
uint num1 = 48u;
uint num2 = 18u;
uint gcdUInt = steinGCD(num1, num2);
writeln("\nGCD of ", num1, " and ", num2, " is ", gcdUInt);
// Example #2 usage with unsigned longs
ulong num3 = 105L;
ulong num4 = 45L;
ulong gcdULong = steinGCD(num3, num4);
writeln("GCD of ", num3, " and ", num4, " is ", gcdULong);
}
Enter into the Dub Package folder, type dub run
and type Return
to run it...
GCD of 48 and 18 is 6
GCD of 105 and 45 is 15