Difference between revisions of "Fibonacci"

From CSE231 Wiki
Jump to navigation Jump to search
Line 23: Line 23:
  
 
===BigInteger===
 
===BigInteger===
fibonacci(47) is greater than [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#MAX_VALUE Integer.MAX_VALUE] which would [https://en.wikipedia.org/wiki/Integer_overflow overflow] if we used the primitive int data type.  We use [https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html BigInteger] instead to prevent this problem.
+
fibonacci(47) is greater than [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#MAX_VALUE Integer.MAX_VALUE] which would [https://en.wikipedia.org/wiki/Integer_overflow overflow] if we used the [https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html primitive int data type].  We use [https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html BigInteger] instead to prevent this problem.
  
 
[https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html BigInteger]
 
[https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html BigInteger]

Revision as of 13:32, 7 February 2018

Motivation

It is important to always reduce the work, then parallelize if possible. In this studio you will build a beautiful, elegant solution to Fibonacci which can be easily parallelized yielding off-the-charts ideal parallelism. Sadly, it performs terribly since the work is exponential. It is far better to build a linear or log time algorithm whether or not it can be parallelized.

We will gain experience with the future construct.

We will convert recurrence relations into code.

Additionally, (and of minor importance) we gain experience working with the BigInteger class.

Background

The fibonacci sequence is a mathematical concept often used in computer science as a means to demonstrate iteration and recursion. Although you should be familiar with it from CSE 131, we will use the fibonacci sequence to demonstrate memoization and dynamic programming. Follow these links for a quick recap on memoization, dynamic programming, and the fibonacci sequence.

Scientific American Video: Fibonacci spiral.jpg

Javadocs

Parallel

V5

future(body)

interface Future<V>.

get()

BigInteger

fibonacci(47) is greater than Integer.MAX_VALUE which would overflow if we used the primitive int data type. We use BigInteger instead to prevent this problem.

BigInteger

BigInteger.ZERO
BigInteger.ONE
bi.add(other)
bi.multiply(other)

Studio (Required)

RecurrenceRelationSequentialFibonacciCalculator

Work:
class: RecurrenceRelationSequentialFibonacciCalculator.java Java.png
methods: fibonacci
package: fibonacci.studio
source folder: student/src/main/java

implement a recursive method for:

recurrence relation

seed values

RecurrenceRelationParallelFibonacciCalculator

Work:
CPL:
Ideal Parallelism:
class: RecurrenceRelationParallelFibonacciCalculator.java Java.png
methods: fibonacci
package: fibonacci.studio
source folder: student/src/main/java

Use futures to add parallelism to the recurrence relation solution.

MemoizationSequentialFibonacciCalculator

Work:
class: MemoizationSequentialFibonacciCalculator.java Java.png
methods: fibonacciMemo
package: fibonacci.studio
source folder: student/src/main/java

Implement the recurrence relation algorithm but employ memoization for the win.

	@Override
	public BigInteger fibonacci(int n) {
		BigInteger[] memos = new BigInteger[n + 1];
		return fibonacciMemo(memos, n);
	}
Attention niels epting.svg Warning: Do NOT invoke fibonacci from fibonacciMemo. Invoke fibonacciMemo from fibonacciMemo.
Attention niels epting.svg Warning: The entire point of memoization is to avoid recalculating the same computation. Be sure to store the value for each calculation as it is made even if that means splitting up a line of code.

DynamicIterativeSequentialFibonacciCalculator

Work:
class: DynamicIterativeSequentialFibonacciCalculator.java Java.png
methods: fibonacci
package: fibonacci.studio
source folder: student/src/main/java

LinearRecurrenceSequentialFibonacciCalculator

Work:
class: LinearRecurrenceSequentialFibonacciCalculator.java Java.png
methods: fibonacci
package: fibonacci.studio
source folder: student/src/main/java
Attention niels epting.svg Warning: There is no need to store k in a BigInteger. Since it is smaller than n, it will fit just fine in an int.

recurrence relation

if n is odd
else


seed values

Fun (Optional)

RecurrenceRelationParallelWithThresholdFibonacciCalculator

Similar to #RecurrenceRelationParallelFibonacciCalculator but with a threshold in place to prevent creating too many tasks for the number of processors.

MemoizationParallelFibonacciCalculator

Create all of your futures [0..N] up front and then call get on memo[n].

DynamicRecursiveSequentialFibonacciCalculator

RoundPhiToTheNOverSqrt5SequentialFibonacciCalculator

Testing Your Solution

Correctness

class: FibonacciTestSuite.java Junit.png
package: fibonacci.studio
source folder: testing/src/test/java

Performance

class: FibonacciTiming.java Noun Project stopwatch icon 386232 cc.svg
package: fibonacci.studio
source folder: src/main/java
class: FibonacciIterations.java Noun Project stopwatch icon 386232 cc.svg
package: fibonacci.studio
source folder: src/main/java