From d1152144aa5d777f22666c91b44c1588cc7a0d01 Mon Sep 17 00:00:00 2001 From: Akshay Dubey <38462415+itsAkshayDubey@users.noreply.github.com> Date: Thu, 15 Sep 2022 12:20:58 +0530 Subject: [PATCH] algorithm: Liouville function (#1100) --- Maths/LiouvilleFunction.js | 25 +++++++++++++++++++++++++ Maths/test/LiouvilleFunction.test.js | 19 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 Maths/LiouvilleFunction.js create mode 100644 Maths/test/LiouvilleFunction.test.js diff --git a/Maths/LiouvilleFunction.js b/Maths/LiouvilleFunction.js new file mode 100644 index 000000000..f13916d55 --- /dev/null +++ b/Maths/LiouvilleFunction.js @@ -0,0 +1,25 @@ +/* + * Author: Akshay Dubey (https://github.com/itsAkshayDubey) + * Liouville Function: https://en.wikipedia.org/wiki/Liouville_function + * For any positive integer n, define λ(n) as the sum of the primitive nth roots of unity. + * It has values in {−1, 1} depending on the factorization of n into prime factors: + * λ(n) = +1 if n positive integer with an even number of prime factors. + * λ(n) = −1 if n positive integer with an odd number of prime factors. + */ + +/** + * @function liouvilleFunction + * @description -> This method returns λ(n) of given number n + * returns 1 when number has even number of prime factors + * returns -1 when number has odd number of prime factors + * @param {Integer} number + * @returns {Integer} 1|-1 + */ + +import { PrimeFactors } from './PrimeFactors.js' +export const liouvilleFunction = (number) => { + if (number <= 0) { + throw new Error('Number must be greater than zero.') + } + return PrimeFactors(number).length % 2 === 0 ? 1 : -1 +} diff --git a/Maths/test/LiouvilleFunction.test.js b/Maths/test/LiouvilleFunction.test.js new file mode 100644 index 000000000..58a79c9cc --- /dev/null +++ b/Maths/test/LiouvilleFunction.test.js @@ -0,0 +1,19 @@ +import { liouvilleFunction } from '../LiouvilleFunction' + +const expectedValuesArray = [1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1] + +describe('Testing liouville function', () => { + for (let i = 1; i <= 100; i++) { + it('Testing for number = ' + i + ', should return ' + expectedValuesArray[i], () => { + expect(liouvilleFunction(i)).toBe(expectedValuesArray[i - 1]) + }) + } + + it('should throw error when supplied negative numbers', () => { + expect(() => { liouvilleFunction(-1) }).toThrow(Error) + }) + + it('should throw error when supplied zero', () => { + expect(() => { liouvilleFunction(0) }).toThrow(Error) + }) +})