Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- // How good is Binet's formula for approximating the n-th Fibonacci number?
- // Spoilers: it's good for N <= 72
- typedef long long ll;
- typedef long double ld;
- const int MAXN = 1000;
- const ld phi = 1.618033988749894848204586834365638117720309179805762862135;
- const ld oneoversqrt5 = 0.447213595499957939281834733746255247088123671922305144854;
- ll fibdp[MAXN];
- ld phipow[MAXN]; // phi^n
- ld phipowrec[MAXN]; // 1 / (phi^n)
- // Regular Fibonacci formula:
- // fib(0) = 0, fib(1) = 1, fib(n) = fib(n-1) + fib(n-2), for n >= 2
- ll fibaccurate(int n) {
- return (fibdp[n] != -1) ? fibdp[n] : fibdp[n] = fibaccurate(n-1) + fibaccurate(n-2);
- }
- // Binet's formula:
- // fib(n) = [ (phi^n - (-phi)^(-n)) / sqrt(5) ]
- // where [x] = closest integer to x
- ll fibapprox(int n) {
- return round( oneoversqrt5 * (phipow[n] - phipowrec[n]*(n&1?-1:1)) );
- }
- int main() {
- memset(fibdp, -1, sizeof(fibdp));
- fibdp[0] = 0;
- fibdp[1] = 1;
- phipow[0] = 1.0;
- for (int i = 1; i < MAXN; ++i) {
- phipow[i] = phipow[i-1] * phi;
- phipowrec[i] = 1.0 / phipow[i];
- }
- int n = 2;
- ll f1, f2;
- do {
- f1 = fibaccurate(n);
- f2 = fibapprox(n);
- ++n;
- cout << "n = " << setw(3) << n << " : " << setw(20) << f1 << " " << setw(20) << f2 << endl;
- } while (f1 == f2 && n < MAXN);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement