From a260dfe333b765c91522c70869ae7a0dec1dc306 Mon Sep 17 00:00:00 2001 From: Anton Yefremov Date: Fri, 10 Feb 2017 21:10:33 +0200 Subject: [PATCH] Implement coprime algorithm --- lib/iterative/coprime.js | 35 ++++++++++++++++++++++++++++++ lib/iterative/test/coprime-test.js | 11 ++++++++++ 2 files changed, 46 insertions(+) create mode 100644 lib/iterative/coprime.js create mode 100644 lib/iterative/test/coprime-test.js diff --git a/lib/iterative/coprime.js b/lib/iterative/coprime.js new file mode 100644 index 0000000..b5a750b --- /dev/null +++ b/lib/iterative/coprime.js @@ -0,0 +1,35 @@ + +/** + * Expose `coprime`. + */ + +module.exports = coprime; + +/** + * Test whether `a` and `b` are coprime numbers. + * + * @param {number} a Positive number value. + * @param {number} b Positive number value. + * @returns {boolean} + * @example + * + * coprime(13, 27); + * // => false + * + * coprime(20536, 7826); + * // => false + */ + +function coprime(a, b) { + // subtraction-based version of Euclid's algorithm + while (a !== b) { + if (a > b) { + a -= b; + } else { + b -= a; + } + } + // two numbers are coprime if their greatest + // common divisor equals 1 + return a === 1; +} diff --git a/lib/iterative/test/coprime-test.js b/lib/iterative/test/coprime-test.js new file mode 100644 index 0000000..e21ea1c --- /dev/null +++ b/lib/iterative/test/coprime-test.js @@ -0,0 +1,11 @@ +var test = require('tape'); +var coprime = require('../coprime'); + +test('coprime(a, b)', function (t) { + t.equal(coprime(1, 1), true, 'should return `true`'); + t.equal(coprime(1, 2), true, 'should return `true`'); + t.equal(coprime(2, 2), false, 'should return `false`'); + t.equal(coprime(13, 27), true, 'should return `true`'); + t.equal(coprime(20536, 7826), false, 'should return `false`'); + t.end(); +});