Difference between revisions of "Fibonacci"
Line 16: | Line 16: | ||
==Code To Use== | ==Code To Use== | ||
− | |||
<youtube>PELL8QxKl4M</youtube> | <youtube>PELL8QxKl4M</youtube> | ||
− | + | ===Parallel Docs=== | |
[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/v5/V5.html V5] | [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/v5/V5.html V5] | ||
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/v5/V5.html#future-edu.wustl.cse231s.v5.api.CheckedCallable- future(body)] | : [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/v5/V5.html#future-edu.wustl.cse231s.v5.api.CheckedCallable- future(body)] | ||
Line 24: | Line 23: | ||
: [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get-- get()] | : [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get-- get()] | ||
− | ===BigInteger=== | + | ===BigInteger Docs=== |
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. | 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. | ||
Revision as of 16:38, 9 February 2018
Contents
- 1 Motivation
- 2 Background
- 3 Studio (Required)
- 4 Fun (Optional)
- 5 Testing Your Solution
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.
Code To Use
Parallel Docs
BigInteger Docs
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.
Studio (Required)
RecurrenceRelationSequentialFibonacciCalculator
Work: |
class: | RecurrenceRelationSequentialFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
method: public BigInteger fibonacci(int n)
(sequential implementation only)
implement a recursive method for:
recurrence relation
seed values
RecurrenceRelationParallelFibonacciCalculator
Work: | |
CPL: | |
Ideal Parallelism: |
class: | RecurrenceRelationParallelFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
method: public BigInteger fibonacci(int n)
(parallel implementation required)
Use futures to add parallelism to the recurrence relation solution.
MemoizationSequentialFibonacciCalculator
Work: |
class: | MemoizationSequentialFibonacciCalculator.java | |
methods: | fibonacciMemo | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
method: private BigInteger fibonacciMemo(BigInteger[] memos, int n)
(sequential implementation only)
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); }
Warning: Do NOT invoke fibonacci from fibonacciMemo. Invoke fibonacciMemo from fibonacciMemo. |
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 | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
method: public BigInteger fibonacci(int n)
(sequential implementation only)
Imagine you are simply writing out Fibonacci numbers:
- 0, 1, 1, 2, 3, 5, 8, 13...
Convert that process of summing the two previous numbers over and over into code.
LinearRecurrenceSequentialFibonacciCalculator
Work: |
class: | LinearRecurrenceSequentialFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
method: public BigInteger fibonacci(int n)
(sequential implementation only)
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. |
Tip: You can shift left by 1 if you would prefer to not have to multiply by the big integer value of 2. |
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 | |
package: | fibonacci.studio | |
source folder: | testing/src/test/java |
Performance
class: | FibonacciTiming.java | |
package: | fibonacci.studio | |
source folder: | src/main/java |
class: | FibonacciIterations.java | |
package: | fibonacci.studio | |
source folder: | src/main/java |