# Math part 2

`/** * Recursive version of Euclidean Algorithm of finding greatest common divisor (GCD). * @param {number} originalA  * @param {number} originalB  * @return {number}  */export default function euclideanAlgorithm(originalA, originalB) {  // Make input numbers positive.     const a = Math.abs(originalA);     const b = Math.abs(originalB);   // To make algorithm work faster instead of subtracting one number // from the other  // we may use modulo operation.     return (b === 0) ? a : euclideanAlgorithm(b, a % b);}/** * Iterative version of Euclidean Algorithm of finding greatest common divisor (GCD). * @param {number} originalA * @param {number} originalB * @return {number} */export default function euclideanAlgorithmIterative(originalA, originalB) {     // Make input numbers positive.     let a = Math.abs(originalA);     let b = Math.abs(originalB);      // Subtract one number from another until both numbers would    /  //become the same.  // This will be out GCD. Also quit the loop if one of the numbers is zero.     while (a && b && a !== b) {         [a, b] = a > b ? [a - b, b] : [a, b - a];  }   // Return the number that is not equal to zero since the last                  //subtraction (it will be a GCD).      return a || b;}`
`4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, ...`
`6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, ...`
`12, 24, 36, 48, 60, 72, ....`
`lcm(a, b) = |a * b| / gcd(a, b)`
`import euclideanAlgorithm from '../euclidean-algorithm/euclideanAlgorithm'; /** * @param {number} a * @param {number} b * @return {number} */ export default function leastCommonMultiple(a, b) {  return ((a === 0) || (b === 0)) ? 0 : Math.abs(a * b) / euclideanAlgorithm(a, b);}`
`/** * @param {number} maxNumber * @return {number[]} */export default function sieveOfEratosthenes(maxNumber) {     const isPrime = new Array(maxNumber + 1).fill(true);     isPrime = false;  isPrime = false;      const primes = [];      for (let number = 2; number <= maxNumber; number += 1) {       if (isPrime[number] === true) {             primes.push(number);       /*       * Optimisation.       * Start marking multiples of `p` from `p * p`, and not from `2 * p`.       * The reason why this works is because, at that point, smaller  * multiples       * of `p` will have already been marked `false`.       *       * Warning: When working with really big numbers, the following line * may cause overflow       * In that case, it can be changed to:      * let nextNumber = 2 * number;       */             let nextNumber = number * number;              while (nextNumber <= maxNumber) {                 isPrime[nextNumber] = false;                 nextNumber += number;             }         }     }      return primes;}`

--

--