Documentation

Complexity.Computability.Kolmogorov.Uncomputability

Growth and uncomputability of plain Kolmogorov complexity #

For every description method only finitely many objects have complexity below any given bound (eventually_natCast_le_ecomplexity), so the plain complexity K(x) of natural numbers under the universal description method tends to infinity (tendsto_complexity_universal). No computable unbounded function is a lower bound for K: such a function exceeds K at some argument (exists_complexity_universal_lt_of_computable), and hence at infinitely many (frequently_complexity_universal_lt_of_computable). In particular K is not computable (not_computable_complexity_universal). The proof is Berry's paradox: if f ≤ K were computable and unbounded, the program "the least x with f x ≥ 2 |q|", run on an input q, would describe a number of complexity at least 2 |q| by |q| + O(1) bits Li and Vitányi, Chapter 2.

The same invariance argument, applied to total computable decoders, shows that K(g p) ≤ |p| + O(1) for every computable g : List Bool → ℕ (exists_complexity_universal_le_length_add). Consequently K(x) ≤ log₂ x + O(1) (exists_complexity_universal_le_size_add), and computable maps increase K by at most a constant (exists_complexity_universal_comp_le).

The statements use the ℕ-valued complexity, which is the genuine plain complexity for the universal method (natCast_complexity_universal). The ℕ∞-valued complexity does not tend to ⊤ along the cofinite filter (not_tendsto_ecomplexity_universal), because it is never ⊤. Following the rest of the library, K denotes the plain complexity, which Li and Vitányi write C, reserving K for the prefix complexity.

Main results #

References #

Growth #

For every description method and every k, all but finitely many objects have complexity at least k: fewer than 2 ^ k objects have complexity below k.

The plain complexity of natural numbers under the universal method tends to infinity.

The ℕ∞-valued complexity under the universal method does not tend to ⊤, since it is never ⊤; this is why tendsto_complexity_universal is stated for the ℕ-valued complexity.

Every bound is exceeded by the complexity of some natural number.

Upper bounds from computable decoders #

Total computable decoders. If g is computable, the complexity of g p exceeds the length of p by at most a constant: the description method running g is partial recursive, and the universal method is at most a constant worse than it.

K(x) ≤ log₂ x + O(1): a number is described by its binary representation, of length Nat.size x.

Computable maps increase complexity by at most a constant: K(f x) ≤ K(x) + O(1) for every computable f. Composing f with the universal method is a partial recursive description method.

Uncomputability #

theorem Cslib.Kolmogorov.DescriptionMethod.exists_complexity_universal_lt_of_computable {f : ℕ → ℕ} (hf : Computable f) (hunb : ∀ (k : ℕ), ∃ (x : ℕ), k ≤ f x) :
∃ (x : ℕ), universal.complexity x < f x

No computable unbounded lower bound. A computable unbounded function exceeds the plain complexity somewhere. Otherwise the search for the least x with f x ≥ 2 |q| would be a total computable decoder producing, from a program q of length c + 1, a number of complexity at least 2 (c + 1) but at most (c + 1) + c (Berry's paradox).

A computable unbounded function exceeds the plain complexity at infinitely many arguments: beyond any N, apply exists_complexity_universal_lt_of_computable to the function that vanishes below N and agrees with f from N on.