fredrikj.net / blog /

The reciprocal Fibonacci constant

November 15, 2023

The reciprocal Fibonacci constant $$C = \sum_{n=1}^{\infty} \frac{1}{F_n} = 3.359885...$$ isn't really useful for anything; its only claim to fame is to be proven irrational (André-Jeannin, 1989).

Computationally, this constant turns out to be somewhat interesting though. The convergence rate of the defining series is decent enough ($\approx 0.2$ digits per term) but unlike series like $e = \sum_{n=0}^{\infty} 1 / n!$ or $\log(2) = \sum_{n=1}^{\infty} (\tfrac{1}{2})^n / n$ which can be computed to $N$ digits in $N^{1+o(1)}$ (quasilinear) time using binary splitting, the reciprocal Fibonacci series ostensibly requires $N^{2+o(1)}$ time; indeed, the LCM of $F_1, \ldots, F_N$ has $O(N^2)$ digits, so we cannot hope to extract a small common denominator for the partial sums.

Theta-like sums

We can achieve $N^{1.5+o(1)}$ time if we express $C$ using theta-like series with $q^{n^2}$-type terms. For example (see the MathWorld entry for some references), we can write $$C = \sqrt{5} \, (L(\phi^{-2}) - L(\phi^{-4})) + \frac{1}{4} \sqrt{5} \, \theta_2^2(\varphi^{-2})$$ where $\phi$ is the golden ratio and $L(q)$ is the Lambert series $$L(q) = \sum_{n=1}^{\infty} \frac{q^n}{1 - q^n} = \sum_{n=1}^{\infty} q^{n^2} \frac{1+q^n}{1-q^n}.$$ I actually know how to compute the Jacobi theta function $\theta_2$ in quasilinear time using the AGM, but I don't know how to do this for $L(q)$. Various Lambert-like series can be expressed in terms of Jacobi theta functions, but I have not seen such a formula for $L(q)$ itself. If anyone has a quasilinear algorithm for $L(q)$, I'd be interested in it.

Quasilinear algorithm

Surprisingly, $C$ can actually be computed in $N^{1+o(1)}$ time using an algorithm that I discovered just yesterday (quite possibly someone thought of this before me but didn't write it down). The idea is to apply binary splitting to Gosper's series $$C = \sum_{n=0}^{\infty} \frac{(-1)^{n(n-1)/2} (F_{4n+3} + (-1)^n F_{2n+2})}{F_{2n+1} F_{2n+2} L_1 L_3 \cdots L_{2n+1}}$$ in which $L_n$ denotes a Lucas number (Gosper p. 66; Arndt).

This is a really weird series; I don't think I've ever seen anything else like it. It has theta-like convergence and a denominator which is a factorial-like product taken over a holonomic sequence. For $N$ digits, you end up multiplying $O(\sqrt N)$ matrices with $O(\sqrt N)$ digits each. Normally in binary splitting based algorithms you have $O(N)$ or $O(N / \log N)$ matrices with $O(\log N)$-bit entries.

Here is a non-optimised reference implementation in Python:

from mpmath import *

def recfib():
    with extraprec(20):
        prec = mp.prec
        N = int(1.200175024907849 * prec**0.5 + 2)
        def bs(a, b):
            if b - a == 1:
                f1, f2 = fib(2*a), fib(2*a+1)
                f1f2 = f1*f2; f22 = f2**2; f4 = f1**2 + 2*(f1f2+f22); q = 2*f1+f2
                return q, (-1)**((a&3)>>1)*(f4+(-1)**a*(f1+f2)), (f1f2+f22)*q
            else:
                m = a + (b - a) // 2
                P1, R1, Q1 = bs(a, m); P2, R2, Q2 = bs(m, b)
                Q2 *= P1; P1 *= P2; R1 *= Q2
                R2 *= Q1; R1 += R2; Q1 *= Q2
                return P1, R1, Q1
        P, R, Q = bs(0, N)
    return R / Q

mp.dps = 1000000
C = recfib()

This takes 0.8 seconds on my laptop (using the GMPY backend for mpmath).

Just because it's an amusing benchmark problem, I've put a more optimised implementation in FLINT. With this I can compute 1 million digits in 0.1 seconds and 1 billion digits in 12 minutes (only using 2 cores for the latter because otherwise I run out of memory):

~/src/flint$ build/examples/pi 1000005 -constant reciprocal_fibonacci -threads 8
precision = 3321949 bits... cpu/wall(s): 0.558 0.111
virt/peak/res/peak(MB): 548.91 923.86 55.47 55.47
[3.35988566624317755317{...999964 digits...}31740420902017255257 +/- 3.28e-1000005]

~/src/flint$ build/examples/pi 1000000005 -constant reciprocal_fibonacci -threads 2
precision = 3321928116 bits... cpu/wall(s): 1009.31 718.785
virt/peak/res/peak(MB): 16534.32 18638.34 15483.07 18098.75
[3.35988566624317755317{...999999964 digits...}02927932123820488401 +/- 2.91e-1000000005]

In practice computing $C$ is about two times slower than $\pi$ and two times faster than $\log(2)$.

I'm now curious to what extent Gosper's series can be generalised. If I'm reading Gosper's notes correctly, this particular formula should be possible to generalise to certain other Fibonacci-like sequences, but maybe there are also entirely different interesting numbers which admit a series representation with similar overall form, i.e. something like $\sum_n A(n) / (B(n) \prod_i C(i))$ with $A$, $B$, $C$ holonomic?

Addendum: I believe evaluating the Lambert series and theta series using binary splitting with arithmetic in $\mathbb{Q}(\phi)$ also leads to a quasilinear algorithm. It would be interesting to compare this to the Gosper series.



fredrikj.net  |  Blog index  |  RSS feed  |  Follow me on Mastodon  |  Become a sponsor