/// <summary> /// Taking GCM of two numbers by Binary Eyklid algorithm /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static int BinaryGCM(int a, int b) { if (a == 0 || b == 0) { return(a + b); } else if (a == 1 || b == 1) { return(1); } else if (a % 2 == 0 && b % 2 == 0) { return(2 * GCMs.BinaryGCM(a / 2, b / 2)); } else if (a % 2 == 1 && b % 2 == 0) { return(GCMs.BinaryGCM(a, b / 2)); } else if (a % 2 == 0 && b % 2 == 1) { return(GCMs.BinaryGCM(a / 2, b)); } else { return(GCMs.BinaryGCM((Math.Max(a, b) - Math.Min(a, b)) / 2, Math.Min(a, b))); } }
/// <summary> /// Taking GCM by binary Evklidov algorithm. Return GCM and time. /// </summary> /// <param name="compliteTime">Time of complitting</param> /// <param name="a">First number</param> /// <param name="b">Second number</param> /// <returns></returns> public static int BinaryGCMTime(out Stopwatch compliteTime, int a, int b) { compliteTime = new Stopwatch(); compliteTime.Start(); int result = GCMs.BinaryGCM(a, b); compliteTime.Stop(); return(result); }