/**
* @function greatestCommonFactor
* @description Determine the greatest common factor of a group of numbers.
* @param {Number[]} nums - An array of numbers.
* @return {Number} - The greatest common factor.
* @see https://www.mathsisfun.com/greatest-common-factor.html
* @example GreatestCommonFactor(12, 8) = 4
* @example GreatestCommonFactor(3, 6) = 3
* @example GreatestCommonFactor(32, 16, 12) = 4
*/
export const binaryGCF = (a: number, b: number): number => {
if (!Number.isInteger(a) || !Number.isInteger(b) || a < 0 || b < 0) {
throw new Error("numbers must be natural to determine factors");
}
while (b) {
[a, b] = [b, a % b]
}
return a;
}
export const greatestCommonFactor = (nums: number[]): number => {
if (nums.length === 0) {
throw new Error("at least one number must be passed in");
}
return nums.reduce(binaryGCF);
};