Added [FEATURE REQUEST] Golden Ration formula to find Nth Fibonacci number #4505 (#4513)

* Create FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Create FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Delete src/main/java/com/thealgorithms/maths/FibonacciNumberTest.java

* Create FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Create FibonacciCalculator.java

* Update FibonacciNumberTest.java

* Update and rename FibonacciCalculator.java to FibCalc.java

* Update FibonacciNumberTest.java

* Update FibCalc.java

* Update FibonacciNumber.java

* Delete src/test/java/com/thealgorithms/maths/FibCalc.java

* Create FibCalc.java

* Update FibonacciNumberTest.java

* Update FibCalc.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumber.java

* fix: use proper name

* fix: use proper class name

* tests: add `returnsCorrectValues`

* Update and rename FibCalc.java to Fibonacci.java

* Update Fibonacci.java

* Update FibonacciNumber.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update Fibonacci.java

* Update FibonacciNumber.java

* Update and rename FibCalcTest.java to FibonacciTest.java

* Update FibonacciNumber.java

* Update Fibonacci.java

* Update Fibonacci.java

* Update Fibonacci.java

* Update FibonacciTest.java

* Update Fibonacci.java

* Update src/main/java/com/thealgorithms/maths/Fibonacci.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update FibonacciTest.java

* Update FibonacciNumberTest.java

* Update FibonacciNumberTest.java

* Update FibonacciTest.java

* Update src/main/java/com/thealgorithms/maths/Fibonacci.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/Fibonacci.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/main/java/com/thealgorithms/maths/FibonacciNumber.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update src/test/java/com/thealgorithms/maths/FibonacciNumberTest.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update FibonacciNumber.java

* Update FibonacciNumber.java

* Update Fibonacci.java

* Update FibonacciNumber.java

* Update and rename FibonacciNumber.java to FibonacciNumberGoldenRation.java

* Update and rename FibonacciNumberTest.java to FibonacciNumberGoldenRationTest.java

* Update Fibonacci.java

* Update FibonacciNumberGoldenRation.java

* Update FibonacciNumberGoldenRationTest.java

* Update FibonacciTest.java

* Update Fibonacci.java

* Update FibonacciNumberGoldenRationTest.java

* Update FibonacciNumberGoldenRationTest.java

* Update FibonacciNumberGoldenRation.java

* Update FibonacciNumberGoldenRation.java

* Update FibonacciNumberGoldenRationTest.java

* Update FibonacciNumberGoldenRationTest.java

* Update src/main/java/com/thealgorithms/maths/FibonacciNumberGoldenRation.java

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>

* Update and rename Fibonacci.java to FibonacciLoop.java

* Update FibonacciNumberGoldenRation.java

* Update FibonacciNumberGoldenRationTest.java

* Update and rename FibonacciTest.java to FibonacciLoopTest.java

* Update FibonacciLoop.java

* Update FibonacciLoop.java

* Update FibonacciNumberGoldenRation.java

* docs: add missing dot

---------

Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com>
Co-authored-by: vil02 <vil02@o2.pl>
This commit is contained in:
Pronay Debnath 2023-10-14 00:53:30 +05:30 committed by GitHub
parent 1dc64b1685
commit 24a8223062
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 156 additions and 0 deletions

View File

@ -0,0 +1,41 @@
package com.thealgorithms.maths;
import java.math.BigInteger;
/**
* This class provides methods for calculating Fibonacci numbers using BigInteger for large values of 'n'.
*/
public final class FibonacciLoop {
private FibonacciLoop() {
// Private constructor to prevent instantiation of this utility class.
}
/**
* Calculates the nth Fibonacci number.
*
* @param n The index of the Fibonacci number to calculate.
* @return The nth Fibonacci number as a BigInteger.
* @throws IllegalArgumentException if the input 'n' is a negative integer.
*/
public static BigInteger compute(final int n) {
if (n < 0) {
throw new IllegalArgumentException("Input 'n' must be a non-negative integer.");
}
if (n <= 1) {
return BigInteger.valueOf(n);
}
BigInteger prev = BigInteger.ZERO;
BigInteger current = BigInteger.ONE;
for (int i = 2; i <= n; i++) {
BigInteger next = prev.add(current);
prev = current;
current = next;
}
return current;
}
}

View File

@ -0,0 +1,50 @@
package com.thealgorithms.maths;
/**
* This class provides methods for calculating Fibonacci numbers using Binet's formula.
* Binet's formula is based on the golden ratio and allows computing Fibonacci numbers efficiently.
*
* @see <a href="https://en.wikipedia.org/wiki/Fibonacci_sequence#Binet's_formula">Binet's formula on Wikipedia</a>
*/
public final class FibonacciNumberGoldenRation {
private FibonacciNumberGoldenRation() {
// Private constructor to prevent instantiation of this utility class.
}
/**
* Compute the limit for 'n' that fits in a long data type.
* Reducing the limit to 70 due to potential floating-point arithmetic errors
* that may result in incorrect results for larger inputs.
*/
public static final int MAX_ARG = 70;
/**
* Calculates the nth Fibonacci number using Binet's formula.
*
* @param n The index of the Fibonacci number to calculate.
* @return The nth Fibonacci number as a long.
* @throws IllegalArgumentException if the input 'n' is negative or exceeds the range of a long data type.
*/
public static long compute(int n) {
if (n < 0) {
throw new IllegalArgumentException("Input 'n' must be a non-negative integer.");
}
if (n > MAX_ARG) {
throw new IllegalArgumentException("Input 'n' is too big to give accurate result.");
}
if (n <= 1) {
return n;
}
// Calculate the nth Fibonacci number using the golden ratio formula
final double sqrt5 = Math.sqrt(5);
final double phi = (1 + sqrt5) / 2;
final double psi = (1 - sqrt5) / 2;
final double result = (Math.pow(phi, n) - Math.pow(psi, n)) / sqrt5;
// Round to the nearest integer and return as a long
return Math.round(result);
}
}

View File

@ -0,0 +1,36 @@
package com.thealgorithms.maths;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.math.BigInteger;
import org.junit.jupiter.api.Test;
public class FibonacciLoopTest {
@Test
public void checkValueAtZero() {
assertEquals(BigInteger.ZERO, FibonacciLoop.compute(0));
}
@Test
public void checkValueAtOne() {
assertEquals(BigInteger.ONE, FibonacciLoop.compute(1));
}
@Test
public void checkValueAtTwo() {
assertEquals(BigInteger.ONE, FibonacciLoop.compute(2));
}
@Test
public void checkRecurrenceRelation() {
for (int i = 0; i < 100; ++i) {
assertEquals(FibonacciLoop.compute(i + 2), FibonacciLoop.compute(i + 1).add(FibonacciLoop.compute(i)));
}
}
@Test
public void checkNegativeInput() {
assertThrows(IllegalArgumentException.class, () -> { FibonacciLoop.compute(-1); });
}
}

View File

@ -0,0 +1,29 @@
package com.thealgorithms.maths;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.math.BigInteger;
import org.junit.jupiter.api.Test;
public class FibonacciNumberGoldenRationTest {
@Test
public void returnsCorrectValues() {
for (int n = 0; n <= FibonacciNumberGoldenRation.MAX_ARG; ++n) {
final var actual = FibonacciNumberGoldenRation.compute(n);
final var expected = FibonacciLoop.compute(n);
assertEquals(expected, BigInteger.valueOf(actual));
}
}
@Test
public void throwsIllegalArgumentExceptionForNegativeInput() {
assertThrows(IllegalArgumentException.class, () -> { FibonacciNumberGoldenRation.compute(-1); });
}
@Test
public void throwsIllegalArgumentExceptionForLargeInput() {
assertThrows(IllegalArgumentException.class, () -> { FibonacciNumberGoldenRation.compute(FibonacciNumberGoldenRation.MAX_ARG + 1); });
}
}