Kolmogorov complexity is defined relative to a chosen description language, so why is the measure not arbitrary?
answer
- a language must be fixed first
- each can interpret the other
- the interpreter is written once
- additive, never multiplicative
- constant fixed before the string is chosen
basics
~20 sBecause any two universal description languages can interpret each other. Writing one interpreter in the other is a fixed cost, so their complexity values for every string differ by at most that one constant, independent of the string.
solid answer
~40 sThe invariance theorem: for universal description languages `U` and `V` there is a constant `c` with `|K_U(s) - K_V(s)| <= c` for every string `s`. The construction is direct - write an interpreter for `V` in `U`, and any `V`-program becomes a `U`-program by prefixing that interpreter, so `K_U(s) <= K_V(s) + |interpreter|`. The same works in the other direction, and `c` is the larger of the two interpreter sizes. Crucially `c` depends on the **pair of languages**, never on `s`. So asymptotic claims - almost all strings of length `n` need about `n` bits, a seeded gigabyte needs a few hundred bytes - survive any change of language. What does not survive is a fine-grained claim about one short string, where the constant can swamp the string's own length.
go deeper
Note one caveat: the measure needs a description language fixed first, and different choices shift the numbers a little. That is why you see bounds rather than exact figures.
Explain the interpreter construction - prefix an interpreter for one language to a program in the other - and say that the resulting difference is additive and fixed by the language pair.
Use it to police claims: accept asymptotic and gross statements, reject bit-exact figures and fine comparisons between similar strings, and say 'up to an additive constant' rather than 'up to a constant factor'.
The pattern worth carrying is a measure well-defined only up to a fixed offset. Decide what such a measure may be used to compare, and keep the reference fixed across teams so recorded numbers stay comparable over time.
## Why there is a choice to make at all `K(s)` was defined as the length of the shortest program printing `s` - but in which notation? A program is only a program relative to something that runs it. Two reasonable people fixing two different description languages get two different numbers for the same string, and one can rig a language to make any single chosen string cost one bit: build 'print that string' in as the meaning of a one-bit program. Left there, the measure would be a matter of taste. ## The interpreter argument The rescue is that description languages capable of expressing arbitrary computation can simulate one another. Let `U` and `V` be two such languages. 1. Write an interpreter for `V` as a program in `U`. Call its length `c(U,V)`. It is one fixed text, written once. 2. Take any `V`-program `p` that prints `s`. Prefix the interpreter and hand it `p` as data. The result is a `U`-program that prints `s`, of length `|p| + c(U,V)`. 3. Take `p` to be the shortest `V`-program for `s`. Then `K_U(s) <= K_V(s) + c(U,V)`. Run the same construction the other way and you get `K_V(s) <= K_U(s) + c(V,U)`. Put them together with `c` the larger of the two interpreter sizes: ``` |K_U(s) - K_V(s)| <= c for every string s ``` The rigged language is not excluded by this - it still charges one bit for its favourite string - but it must pay the constant everywhere, and the constant was fixed before anybody chose a string. ## What the constant is, and what it is not | Claim about the constant | Status | |---|---| | Depends on the pair of languages | True - it is an interpreter's size | | Depends on the string being measured | False - it is fixed before `s` is chosen | | Additive | True | | A multiplicative factor | False - it never scales with `|s|` | | Can be large in absolute terms | True - kilobytes are entirely possible | Being additive and string-independent is exactly what makes the measure usable, because it means the constant becomes negligible as strings grow. On a gigabyte, a kilobyte-sized interpreter is a rounding error. On a 30-byte string it is the whole answer. ## Which claims survive a change of language Survive: - **Asymptotic statements.** 'Almost all strings of length `n` have complexity within `k` bits of `n`' holds in any language once `n` is large relative to `c`. - **Gross comparisons.** A gigabyte generated from a 200-byte seed has complexity a few hundred bytes plus a constant; no change of language turns that into a gigabyte. - **Impossibility results.** The uncomputability argument is unaffected, since it only needs some fixed language. Do not survive: - **Exact values.** There is no such thing as 'the' complexity of a string to the bit, only its complexity in a stated language. - **Fine comparisons between two similar strings.** If two strings' values differ by less than `c`, a different language may order them the other way. - **Any claim about a very short string.** For a 30-byte string the constant can exceed the string itself, so the number says more about the language than the data. ## How this shows up in a discussion When someone objects that the measure is arbitrary because you can always pick a language that favours your example, the answer is precise: yes for one string, no uniformly - the favour costs a fixed constant paid on every other string, and that constant does not grow with input size. The measure is therefore well-defined **up to an additive constant**, which is the standard phrase and worth saying exactly, because 'up to a constant factor' is a different and false claim. It is also why practitioners state results asymptotically and why nobody quotes a bit-exact complexity for a specific file: the only honest form is a bound, in a named reference language, with the constant acknowledged.
- Someone designs a language where one specific gigabyte file is printed by a one-bit program. Does that break the theorem?No. That language is still universal, so it is within a constant of every other one - it simply spends its constant on that file. Every other string pays the interpreter cost, and the constant was fixed before the gigabyte was chosen, which is precisely what the theorem asserts.
- Why do results in this area get stated asymptotically rather than for a named string?Because the additive constant makes any bit-exact figure language-relative. Statements of the form 'complexity is within k bits of n for almost all strings of length n' are true in every universal language once n is large, so they carry across without a reference notation being fixed.
saying these in an interview costs you the question
- Says the measure is arbitrary because the language is chosen
- Describes the invariance bound as a constant factor rather than an additive term
- Thinks the constant grows with the length of the string
- Quotes a bit-exact complexity for a named file
- Compares two strings whose values differ by less than the constant