  If \(f\) is effectively computable—a recursive function—let us say that \(\delta\) is an \(f\)-description of a finite string \(\sigma\) iff \(f\) yields \(\sigma\) on input \(\delta\). We may define the \(f\)-complexity of a string \(\sigma , C_f (\sigma)\), as the length of the shortest string \(\delta\) that \(f\)-describes \(\sigma\). If there is no such \(\delta\), let the \(f\)-complexity of \(\sigma\) be infinite. \(f\) is thus a decompression algorithm, taking the compressed description \(\delta\) back to the original string \(\sigma\). There are obviously many different kinds of decompression algorithm. One boring case is the identity function (the empty program), which takes each string to itself. The existence of this function shows that there are decompression algorithms \(f\) which have a finite \(f\)-complexity for any finite string. Any useful decompression algorithm will, however, yield an output string significantly longer than the input description, for at least some input descriptions.