7

Mathematica has the ContinuedFraction[] function to give the continued fraction expansion of a rational (or approximation of a real) number. I'm interested in the inverse: is there an efficient way to give an array as a continued fraction expansion and have Mathematica calculate the number it represents?

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
Cocopuffs
  • 173
  • 5
  • 13
  • 1
    Every Mathematica function ref page has a "See also" section and a "More about" section. Looking there on the ContinuedFraction ref page would have given you links to FromContinuedFraction and the overview page "Continued Fractions & Rational Approximations". The tutorial, also mentioned on the same page, contains a discussion of FromContinuedFraction as well. – Sjoerd C. de Vries Jun 24 '12 at 15:53

1 Answers1

16

As Heike mentions in the comments, FromContinuedFraction[] does what you want:

FromContinuedFraction[{2, 2, 1, 7, 1, 2, 2, 16}]
6784/2891

If FromContinuedFraction[] had not been built-in, however, something like this could be done:

(* backward recursion *)
Fold[#2 + 1/#1 &, Infinity, Reverse[{2, 2, 1, 7, 1, 2, 2, 16}]]
6784/2891

or even

(* forward recursion, matrix multiplication form *)
Divide @@ Last[Fold[{{0, 1}, {1, #2}}.#1 &, {{0, 1}, {1, 0}}, {2, 2, 1, 7, 1, 2, 2, 16}]]

or equivalently

Divide @@ First[Fold[{{#2, 1}, {1, 0}}.#1 &, IdentityMatrix[2], {2, 2, 1, 7, 1, 2, 2, 16}]]

Still another alternative is

(* Lentz-Thompson-Barnett recursion *)
1/(Times @@ Flatten[Rest[FoldList[{#2 + 1/#1[[1]], 1/(#2 + #1[[2]])} &, {1, 0},
                                  {2, 2, 1, 7, 1, 2, 2, 16}]]] - 1)
J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574