Add Liouville lambda function (#3284)
This commit is contained in:
parent
2fbb1d6402
commit
ea8e0463ef
@ -0,0 +1,34 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
/*
|
||||
* Java program for liouville lambda 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 is a positive integer with an even number of prime factors.
|
||||
* λ(n) = −1 if n is a positive integer with an odd number of prime factors.
|
||||
* Wikipedia: https://en.wikipedia.org/wiki/Liouville_function
|
||||
*
|
||||
* Author: Akshay Dubey (https://github.com/itsAkshayDubey)
|
||||
*
|
||||
* */
|
||||
|
||||
public class LiouvilleLambdaFunction {
|
||||
|
||||
/**
|
||||
* This method returns λ(n) of given number n
|
||||
*
|
||||
* @param number Integer value which λ(n) is to be calculated
|
||||
* @return 1 when number has even number of prime factors
|
||||
* -1 when number has odd number of prime factors
|
||||
* @throws IllegalArgumentException when number is negative
|
||||
*/
|
||||
static int liouvilleLambda(int number) {
|
||||
if(number <= 0) {
|
||||
//throw exception when number is less than or is zero
|
||||
throw new IllegalArgumentException("Number must be greater than zero.");
|
||||
}
|
||||
|
||||
//return 1 if size of prime factor list is even, -1 otherwise
|
||||
return PrimeFactorization.pfactors(number).size() % 2 == 0 ? 1 : -1;
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class LiouvilleLambdaFunctionTest {
|
||||
|
||||
@Test
|
||||
void testLiouvilleLambdaMustThrowExceptionIfNumberIsZero() {
|
||||
//given
|
||||
int number = 0;
|
||||
String expectedMessage = "Number must be greater than zero.";
|
||||
|
||||
//when
|
||||
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
|
||||
LiouvilleLambdaFunction.liouvilleLambda(number);
|
||||
});
|
||||
String actualMessage = exception.getMessage();
|
||||
|
||||
//then
|
||||
assertEquals(expectedMessage, actualMessage);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLiouvilleLambdaMustThrowExceptionIfNumberIsNegative() {
|
||||
//given
|
||||
int number = -1;
|
||||
String expectedMessage = "Number must be greater than zero.";
|
||||
|
||||
//when
|
||||
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
|
||||
LiouvilleLambdaFunction.liouvilleLambda(number);
|
||||
});
|
||||
String actualMessage = exception.getMessage();
|
||||
|
||||
//then
|
||||
assertEquals(expectedMessage, actualMessage);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLiouvilleLambdaMustReturnNegativeOne() {
|
||||
//given
|
||||
int number = 11;
|
||||
int expectedOutput = -1;
|
||||
|
||||
//when
|
||||
int actualOutput = LiouvilleLambdaFunction.liouvilleLambda(number);
|
||||
|
||||
//then
|
||||
assertEquals(expectedOutput, actualOutput);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLiouvilleLambdaMustReturnPositiveOne() {
|
||||
//given
|
||||
int number = 10;
|
||||
int expectedOutput = 1;
|
||||
|
||||
//when
|
||||
int actualOutput = LiouvilleLambdaFunction.liouvilleLambda(number);
|
||||
|
||||
//then
|
||||
assertEquals(expectedOutput, actualOutput);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user