Turing machine
From Scholarpedia
| Paul M.B. Vitanyi (2009), Scholarpedia, 4(3):6240. | revision #66075 [link to/cite this article] | |||||||||||||||||||
Curator: Dr. Paul M.B. Vitanyi, CWI and Computer Science, University of Amsterdam, The Netherlands
A Turing machine refers to a hypothetical machine proposed by Alan M. Turing (1912--1954) in 1936 whose computations are intended to give an operational and formal definition of the intuitive notion of computability in the discrete domain. It is a digital device and sufficiently simple to be amenable to theoretical analysis and sufficiently powerful to embrace everything in the discrete domain that is intuitively computable. As if that were not enough, in the theory of computation many major complexity classes can be easily characterized by an appropriately restricted Turing machine; notably the important classes P and NP and consequently the major question whether P equals NP.
Turing gave a brilliant demonstration that everything that can be reasonably said to be computed by a human computer using a fixed procedure can be computed by such a machine. As Turing claimed, any process that can be naturally called an effective procedure is realized by a Turing machine. This is known as Turing's thesis. Enter Alonzo Church (1903--1995). Over the years, all serious attempts to give precise yet intuitively satisfactory definitions of a notion of effective procedure (what Church called effectively calculable function) in the widest possible sense have turned out to be equivalent---to define essentially the same class of processes. In his original paper, Turing established the equivalence of his notion of effective procedure with his automatic machine (a-machine) now called a Turing machine. Turing then showed the formal equivalence of Turing machines with λ-definable functions, the formalism in which Church and Kleene first worked from 1931–1934, and the formalism in which Church first stated his thesis in 1934 privately and informally to Goedel. The Church-Turing thesis states that a function on the positive integers is effectively calculable if and only if it is computable. An informal accumulation of the tradition in S. C. Kleene (1952) has transformed it to the Computability thesis: there is an objective notion of effective computability independent of a particular formalization. The informal arguments Turing sets forth in his 1936 paper are as lucid and convincing now as they were then. To us it seems that it is the best introduction to the subject, and we refer the reader to this superior piece of expository writing.
Contents |
Formal definition of Turing machine
We formalize Turing's description as follows:
A
Turing machine
consists of a finite program,
called the
finite control,
capable
of manipulating a linear list of cells,
called the
tape,
using one access
pointer, called the
head.
We refer to the two directions on the tape as
`right'
and
`left.'
The finite
control can be in any one of a finite set of
states
, and each tape cell can contain
a 0, a 1, or a
`blank'
.
Time is discrete
and the time instants are ordered
with
0 the time at which the machine starts its computation.
At any time, the head is positioned over a particular cell,
which it is said to
`scan.'
At time 0 the head is situated on a distinguished cell
on the tape called the
`start cell,' and
the finite control is in a distinguished state
. At time 0
all cells contain
's,
except for a contiguous finite sequence of cells, extending
from the start cell to the right, which contain 0's and 1's.
This binary sequence is called the `input.'
The device can perform the following basic operations:
- it can write an element from
in the cell it scans; and
- it can shift the head one cell left or right.
When the device is active it executes these operations
at the rate of one operation per time unit (a
`step').
At the conclusion of each step, the finite control
takes on a state from
. The device
is constructed so that it behaves according to a finite
list of
rules.
These rules determine, from the current state of the finite
control and the symbol contained in the cell under scan,
the operation to be performed next and the state to enter
at the end of the next operation execution.
The rules have format
:
is the
current state of the finite control;
is the symbol
under scan;
is the next operation to be executed
of type (1) or (2)
designated in the obvious sense by an element from
; and
is the state of the finite control
to be entered at the end of this step.
For now, we assume that
there are no two distinct quadruples that have their first
two elements identical, the device is
deterministic.
Not every possible combination of the first two elements has to be
in the set; in this way we permit the device
to perform `no' operation. In this case we say that the device
halts.
Hence, we can define a Turing machine
by a mapping from a finite subset of
into
.
Given a Turing machine and an input, the Turing machine carries
out a uniquely determined succession of operations,
which may or may not terminate in a finite number of steps.
Strings and natural numbers are occasionally identified according to the pairing
where
denotes the empty string (with no bits).
In the following we need the notion of a 'self-delimiting' code of a binary string. If
is a string of
bits, then its self-delimiting code is
. Clearly, the length
. Encoding a binary string self-delimitingly enables a machine to determine where the string ends reading it from left to right in a single pass and without reading past the last bit of the code.
Computable functions
We can associate a partial function with each Turing
machine in the following way: The input to the Turing
machine is presented as an
-tuple
consisting of self-delimiting versions of the
's.
The integer represented by the
maximal binary string (bordered by blanks) of which some bit is scanned,
or 0 if a blank is scanned,
by the time the machine halts,
is called the `output' of the computation.
Under this convention for inputs and outputs,
each Turing machine defines a partial function
from
-tuples of integers onto the integers,
.
We call such a function
partial computable.
If
the Turing machine halts for all inputs,
then the function computed is defined
for all arguments and
we call it
total computable. (Instead of `computable' the more ambiguous
`recursive' has also been used.)
We call a function
with range
a
`predicate',
with the interpretation that the predicate of an
-tuple of values is `true' if the corresponding
function assumes value 1 for that
-tuple of
values for its arguments and is `false' or `undefined' otherwise.
Hence, we can talk about `partial
(total) computable predicates'.
Examples of computable functions
Consider
as a binary string.
It is easy to see that the functions
,
,
, and
are partial
computable. Functions
and
are not total since the value
for input
is not defined. The function
defined as 1 if
and
as 0 if
is a computable predicate.
Consider
as an integer.
The following functions are basic
-place total
computable functions: the
`successor'
function
,
the `zero' function
, and
the
`projection'
function
(
).
The function
is a total computable
one-to-one mapping from pairs of natural numbers into the natural numbers.
We can easily extend this scheme to
obtain a total computable one-to-one mapping from
-tuples of integers
into the integers, for each fixed
.
Define
.
Another total recursive one-to-one mapping from
-tuples of integers
into
the integers is
.
Computability thesis
The class of algorithmically computable numerical functions (in the intuitive sense) coincides with the class of partial computable functions. Originally intended as a proposal to henceforth supply intuitive terms such as `computable' and `effective procedure' with a precise meaning, the Computability thesis has come into use as shorthand for a claim that from a given description of a procedure in terms of an informal set of instructions we can derive a formal one in terms of Turing machines.
Universal Turing machine
It is possible to give an effective (computable) one-to-one pairing between natural numbers and Turing machines. This is called an effective enumeration. One way to do this is to encode the table of rules of each Turing machine in binary, in a canonical way.
The only thing we have to do for every Turing
machine is to encode the
defining mapping
from
into
.
Giving each element of
a unique binary code
requires
bits for each such element,
with
. Denote the encoding function
by
. Then the quadruple
is encoded as
.
If the number of rules is
, then
. We agree to
consider the state of the first rule as the start state.
The entire list of quadruples,
is encoded as
Note that
. (Moreover,
is self-delimiting, which is convenient
in situations in which we want to recognize the
substring
as prefix of a larger string.)
We order the resulting
binary strings lexicographically
(according to increasing length).
We assign an index,
or Goedel number,
to each
Turing machine
by defining
if
is the
th element in the lexicographic order of Turing machine
codes. This
yields a sequence of Turing machines
that constitutes the
effective enumeration.
One can construct a Turing machine
to decide whether a given binary string
encodes a Turing machine, by checking whether it
can be decoded according
to the scheme above, that the tuple elements belong to
,
followed by a check whether any
two different rules start with the same two elements.
This observation enables us to construct
`universal' Turing machines.
A
universal
Turing machine
is a Turing machine that
can imitate the behavior of any other Turing machine
. It is a fundamental result that such machines exist
and can be constructed effectively.
Only a suitable description of
's finite
program and input
needs to be entered on
's tape initially.
To execute the consecutive actions that
would
perform on its
own
tape,
uses
's description
to simulate
's actions
on a representation of
's tape contents.
Such a machine
is also called `computation universal.'
In fact, there are infinitely many such
's.
We focus on a universal Turing machine
that uses the encoding above.
It is not difficult, but tedious,
to define a Turing machine in quadruple format
that expects inputs of the format
and is undefined for inputs not of that form.
The machine
starts to execute the successive operations of
using
as input and the description
of
it has found so that
for every
and
. We omit the explicit construction of
.
For the contemporary reader there should be nothing
mysterious in the concept of a general-purpose computer which can
perform any computation when supplied with an appropriate program.
The surprising thing is that a general-purpose computer can
be
very simple:
Marvin Minsky has been shown
that four tape symbols and
seven states suffice easily in the above scheme.
This machine can be changed to,
in the sense of being simulated by, our
format using tape symbols
at the cost
of an increase in the number
of states. The last reference contains an excellent discussion of Turing machines, their computations, and related machines.
The effective enumeration of Turing machines
determines an effective enumeration of partial computable
functions
such that
is the function computed by
, for all
.
It is important to distinguish between a
function
and a
name
for
. A name for
can be
an
algorithm
that computes
, in the form
of a Turing machine
. It can also be a natural
number
such that
equals
in the above list. We call
an
index
for
. Thus, each partial computable
occurs many times in the given effective enumeration,
that is, it has many indices.
Universal partial computable function
The partial computable function
computed
by the universal Turing machine
is called the
universal partial computable function.
The generalization to
-place functions is straightforward.
A partial computable function
is
universal
for all
-place partial computable
functions if for each partial computable function
there exists
an
such that the mapping
with
the first argument fixed to
is identical to the mapping
.
Here
is an index of
with respect to
.
For each
, we fix a partial computable
-place function that is universal for all
-place
partial computable functions.
Enumeration theorem
for
-place partial
computable functions. Here
is the index of the universal
function.
For each
there exists an index
such that for all
and
,
if
is defined, then
,
and
is undefined otherwise.
(
is a universal partial computable function
that enumerates the partial computable functions of
variables.)
Computably enumerable sets
A set
is
computably enumerable
if it is empty or the range
of some total computable function
.
We say that
`enumerates'
.
The intuition behind this definition is that there
is a Turing machine for listing
the elements of
in some arbitrary order with
repetitions allowed. An equivalent definition is that
is computably
enumerable if it is accepted by a Turing machine. That is,
for each element in
, the Turing machine halts
in a distinguished accepting state, and for each element not in
the machine either halts in a nonaccepting state or computes forever.
A set
is
computable
if it possesses a computable
characteristic function.
That is,
is computable iff
there exists a computable function
such that
for all
, if
, then
, and
if
, then
(
is the
complement of
). An equivalent definition is that
is computable if
is accepted by a Turing machine
that always halts.
Obviously, all computable sets are computably enumerable.
The following sets are computable: (i) the set of odd
integers; (ii) the set of natural numbers; (iii) the empty set;
(iv) the set of primes; (v) every finite set; (vi)
every set with a finite complement. The following
sets are computably enumerable: (i) every computable set;
(ii) the set of indices
such that the range
of
is nonempty; (iii)
the set
a run of at least
consecutive 0's
occurs in
,
where
Theorem
- A set
is computable iff both
and its complement
are computably enumerable.
- An infinite set
is computable iff it is computably enumerable in increasing order. (Here we have postulated a total order on the elements of
. For instance, if
(a subset of the natural numbers) with the usual order, then
enumerates
in increasing order if
, for all
.)
- Every infinite computably enumerable set contains an infinite computable subset.
The equivalent statements hold for computable and computably
enumerable sets of
-tuples.
Undecidability of the Halting Problem
Turing's paper, and more so Kurt Goedel's paper, where such a result first appeared, are celebrated for showing that certain well-defined questions in the mathematical domain cannot be settled by any effective procedure for answering questions. The following 'machine form' of this undecidability result is due to Turing and Church: `which machine computations eventually terminate with a definite result, and which machine computations go on forever without a definite conclusion?' This is sometimes called the halting problem.
Since all machines can be simulated by the universal Turing machine
,
this question cannot be decided in the case of the single machine
,
or more generally for
any other
individual universal machine.
The following theorem
due to Turing in 1936,
formalizes this discussion.
Let
be the standard enumeration of
partial computable
functions and write
if
is defined and write
otherwise.
Define
as the
halting set.
Theorem.
The halting set
is
not computable.
The trick used in the proof is called
diagonalization to show that
there is no computable function
such that for all
, we have
if
is defined,
and
otherwise.
It is easy to see that
is computably enumerable. The halting set is so ubiquitous
that it merits the standard notation
.
We shall also use
the
diagonal halting set
.
Just like
, the diagonal halting set is computably enumerable;
and
is also not a computable set.
The theorem of Turing on the incomputability of the halting set was preceded by (and was intended as an alternative way to show)
the famous (first) incompleteness
theorem of
Kurt Goedel in 1931. Recall that a
formal theory
consists of a set of well-formed formulas,
formulas
for short. For convenience these
formulas are taken to be finite binary strings.
Invariably, the formulas are specified in such
a way that an effective procedure exists that
decides which strings are formulas and which strings are
not.
The formulas are the objects of interest of the theory and constitute the meaningful statements. With each theory we associate a set of true formulas and a set of provable formulas. The set of true formulas is `true' according to some (often nonconstructive) criterion of truth. The set of provable formulas is `provable' according to some (usually effective) syntactic notion of proof.
A theory
is simply any set of
formulas. A theory is
axiomatizable
if
it can be effectively enumerated. For instance,
its axioms (initial formulas) can be effectively enumerated and
there is an effective procedure that enumerates all proofs
for formulas in
from the axioms. A theory is
decidable
if it is a recursive set.
A theory
is
consistent
if not
both formula
and and its negation
are in
.
A theory
is
sound
if each formula
in
is true (with respect to the
standard model of the natural numbers).
Hence, soundness implies consistency. A particularly important example of an axiomatizable theory is Peano arithmetic, which axiomatizes the standard elementary theory of the natural numbers.
Theorem
There is a computably enumerable set, say the set
defined above,
such that for every axiomatizable
theory
that is sound and extends
Peano arithmetic,
there is a number
such that the formula `
' is true but not provable
in
.
In his original proof, Goedel uses diagonalization
to prove the incompleteness of
any sufficiently rich logical theory
with
a computably enumerable axiom system,
such as Peano arithmetic. By his
technique he exhibits for such a theory
an explicit construction of an undecidable
statement
that says of itself `I am
unprovable in
.'
The formulation in terms of computable function
theory is due to A. Church and S.C. Kleene.
Turing's idea was to give a formal meaning to the notion of `giving a proof.' Intuitively, a proof is a sort of computation where every step follows (and follows logically) from the previous one, starting from the input. To put everything as broad as possible, Turing analyses the notion of `computation' from an `input' to an `output' and uses this to give an alternative proof of Goedel's theorem.
Semicomputable functions
The notion of computable functions can be extended from integer functions to real valued functions of rational arguments, and to weaker types of computability, using the framework explained above.
We consider partial computable functions
and write
, with
nonnegative integers.
The extension to negative arguments and values
is straightforward.
The interpretation is that
is a
rational-valued
function of a rational argument and a nonnegative integer argument.
A partial function
from the rational numbers to the real numbers is
upper semicomputable
if it is defined by a rational-valued partial computable
function
with
a rational number
and
a nonnegative integer
such that
for every
and
.
This means
that
can be computably approximated from above.
A function
is
lower semicomputable
if
is upper semicomputable.
A function is called
semicomputable
if it is either upper semicomputable or lower semicomputable or both.
If a function
is both upper semicomputable and
lower semicomputable on its domain,
then we call
computable
(equivalent to computable
if the domain
is integer or rational). The total function versions are
defined similarly.
Thus, a total real function
is
computable
iff
there is a total computable function
such that
.
In this way, we extend the
notion of integer
computable functions to real-valued computable functions
with rational arguments, and to real-valued semicomputable functions
with rational arguments.
The idea is that a semicomputable function can be approximated
from one side by a computable function with rational values,
but we may never know how close we are
to the real value. A computable real function
can be approximated
to any degree of precision by a computable function with rational values.
A function
is
lower semicomputable
iff the
set
is computably enumerable. Therefore, a lower semicomputable
function is `computably enumerable from below,'
and an upper semicomputable function is
`computably enumerable from above.'
An example of a lower semicomputable function
that is not computable.
Let
be the diagonal halting
set. Define
if
, and
otherwise. We first show that
is lower semicomputable.
Define
if the Turing machine computing
halts in at most
steps on input
,
and
otherwise. Obviously,
is
a rational-valued computable function. Moreover, for all
and
we have
,
and
. Hence,
is
lower semicomputable. However,
if
were computable, then the set
,
that is, the diagonal halting set
,
would be computable. But we have seen above that it is not.
Prominent examples are the Kolmogorov complexity function that is upper semicomputable but not computable (and hence not lower semicomputable), and the universal algorithmic probability function that is lower semicomputable but not computable (and hence not upper semicomputable). These are the fundamental notions in M. Li and P. Vitanyi (2008) and, among others, A. Nies (2009).
Theory of computation
Theoretically, every intuitively computable (effectively calculable) function is computable by a personal computer or by a
Turing machine.
But a computation that takes
steps
on an input of length
would not be regarded as practical
or feasible. No computer would ever finish
such a computation in the lifetime of the universe
even with
merely
.
For example,
if we have
processors each taking
steps/second,
then we can execute
steps/year. Computational complexity theory tries to identify
problems that are feasibly computable.
In computational complexity theory, we are often concerned with languages. A
language over a finite
alphabet
is simply a subset of
.
We say that a Turing machine
accepts a language
if it outputs 1
when the input is a member of
and outputs 0 otherwise. That is,
the Turing machine computes a predicate.
Let
be a Turing machine.
For each input of length
, if
makes at most
moves
before it stops, then we say that
runs in time
, or has
time complexity
.
If
uses at most
tape cells in the above computation,
then we say that
uses
space, or has
space complexity
.
For convenience, we often give the Turing machine in
the figure above
a few more work tapes and designate one tape as a read-only input tape.
Thus, each transition rule will be of the form
, where
contains the scanned
symbols on all the tapes, and
are as above,
except that an operation now involves
moving maybe more than one head.
We sometimes also make a Turing machine nondeterministic by allowing two distinct transition rules to have identical first two components. That is, a nondeterministic Turing machine may have different alternative moves at each step. Such a machine accepts if one accepting path leads to acceptance. Turing machines are deterministic unless it is explicitly stated otherwise.
Complexity classes
It is a fundamental and easy result that any
-tape Turing machine running in
time can be simulated by a Turing machine with just one work
tape running in
time.
(As an aside, it is more difficult to show that some multitape Turing machines require
time when they are simulated by a one-work-tape Turing machine, which is a result by M. Li, W. Maass, and P.M.B. Vitanyi (1985, 1988). Every multitape Turing machine can be simulated by a Turing machine with two work tapes in time
by a result of F.C. Hennie and R.E. Stearns (1966) and this is optimal. It is also possible to put multiple heads on the same work tape. By a result of T. Jiang, J. Seiferas and P.M.B. Vitanyi, two heads on the same work tape are more powerful than two work tapes with one head per tape.)
Every Turing machine using
space can be simulated by a Turing machine with just one work
tape using
space. For each
, if a language is
accepted by a
-tape Turing machine running in
time
(space
), then it can also be accepted
by another
-tape Turing machine running in time
(space
), for every constant
(by just increasing the number of tape symbols, so this is not a `deep' theorem but a trivial one).
This leads to the following definitions
of complexity classes, see M.R. Garey and D.S. Johnson:
-
is the set
of languages accepted by multitape
deterministic Turing machines in time
;
-
is the set of languages accepted by multitape
nondeterministic Turing machines in time
;
-
is the set of languages accepted by multitape
deterministic Turing machines
in
space;
-
is the set of languages accepted by multitape
nondeterministic Turing machines in
space. With
running through the natural numbers:
- P is the complexity class
;
- NP is the complexity class
;
- PSPACE is the complexity class
.
Languages in P, that is, languages acceptable in polynomial
time, are considered feasibly computable.
The nondeterministic version for PSPACE
turns out to be identical to PSPACE by Savitch's Theorem (due to W.J. Savitch in 1970) which states that
.
The following relationships hold trivially,
It is one of the most fundamental open questions in
computer science and
mathematics to prove whether either of the above inclusions is proper.
Research in computational complexity theory
focuses on these questions. In order to solve these problems,
one can identify the hardest problems in NP or PSPACE.
P versus NP
A Turing machine
with an oracle
, where
is a language over
's work tape
alphabet, is denoted by
.
Such a machine operates as a
normal Turing machine with the exception that after it has
computed a finite string
it can
enter a special oracle state and ask whether
.
The machine
gets the correct `yes/no' answer in one step.
An oracle machine can use this feature one or more times during
each computation.
A language
is called polynomial-time Turing-reducible to a
language
, denoted by
,
if given
as an oracle, there is a
deterministic Turing machine that
accepts
in polynomial time. That is, we can accept
in
polynomial time given answers to membership in
for free.
A language
is called polynomial-time many-to-one reducible to a
language
, denoted by
, if there is a function
that is
polynomial-time computable, and for every
,
iff
.
In both cases, if
, then so is
.
A language
is NP-hard if all languages in NP
are Turing polynomial-time (equivalently, many-to-one
polynomial-time) reducible to
.
Consequently, if any NP-hard language is in P, then
.
If
is NP-hard and
, then we say that
is NP-complete.
"NP is the set of problems for which it is easy to show (give a certificate) that the answer is `yes,' and P is the set of `yes/no' problems for which it is easy to find the answer. The technical sense of `easy' is `doable by a deterministic Turing machine in polynomial time.' The `P versus NP' question can be understood as whether problems for which it is easy to certify the answer are the same problems for which it is easy to find the answer. The relevance is this:
Normally, we do not ask questions unless we can recognize easily in a certain sense when we have been handed the correct answer. We are not normally interested in questions for which it would take a lifetime of work to check whether you got the answer you wanted. NP is about those questions that we are likely to want answers to."
This excellent explanation was given by one of the inventors of the notions P and NP, J.E. Edmonds in an interview in FAUW Forum, University of Waterloo, January 1993.
SAT
The most famous example of an NP-complete problem is the following. A Boolean formula is in conjunctive normal form if it is a conjunction of disjunctions. For example,
is in conjunctive normal form, and
is
not in conjunctive normal form. A Boolean formula
is satisfiable if
there is a Boolean-valued truth assignment
such that
.
Let SAT be the set of satisfiable Boolean formulas in conjunctive
normal form. The SAT problem is to decide whether
a given Boolean formula is in SAT.
This problem was the first natural problem shown to be
NP-complete. Many practical issues seem to depend on fast solutions to
this problem. Given a Boolean formula, a nondeterministic
Turing machine can guess a correct truth assignment, and verify it.
This takes only linear time. However, if we have
to deterministically search for a satisfying truth assignment,
there are
Boolean vectors to test.
Intuitively, and as far as is known now, a deterministic Turing machine cannot do much better than simply searching through these Boolean vectors one by one, using an exponential amount of time. The Bible of this area is M.R. Garey and D.S. Johnson.
Importance of the Turing machine
In the last three-quarter of a century the Turing machine model has proven to be of priceless value for the development of the science of dataprocessing. All theory development reaches back to this format. The model has become so dominant that new other models that are not polynomial-time reducible to Turing machines are viewed as not realistic (the so-called polynomial-time Computability thesis). Without explaining terms, the `random access machine' (RAM) which is a more precise model for current computers is viewed realstic, while the `parallel random access machine' (PRAM) is not so viewed. New notions, such as randomized computations as in R. Motwani and P. Raghavan (like the fast primality tests used in Internet cryptographical protocols) are analysed using `probabilistic' Turing machines. In 1980 the Nobelist Richard Feynman proposed a `quantum computer', in effect an `analogous' version of a quantum system. Contrary to digital computers (classical, quantum, or otherwise), an analogue computer works with continuous varables and simulates the system we want to solve directly: for example, a windtunnel with a model aircraft simulates the aeroflow and in particular nonlaminar turbulence of the aimed-for actual aircraft. In practice, analogue computers have worked only for special problems. In contrast, the digital computer, where everything is expressed in bits, has proven to be universally applicable. Feynman's innovative idea was without issue until D. Deutsch put the proposal in the form of a quantum Turing machine, that is, a digital quantum computer. This digital development exploded the area both theoretically and applied to the great area of `quantum computing'.
References
- D. Deutsch, Quantum theory, the Church-Turing principle and the universal quantum computer, Proceedings of the Royal Society of London A, 400(1985), 97-117.
- M.R. Garey and D.S. Johnson, Computers and Intractability: A Guide to the Theory of NP-Completeness, W.H. Freeman, 1979.
- K. Goedel, Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme, I, Monatshefte für Mathematik und Physik, 38(1931), 173-198.
- S. C. Kleene, Introduction to Metamathematics, Van Nostrand, New York, 1952.
- M. Li and P. Vitanyi, An Introduction to Kolmogorov Complexity and Its Applications, Springer-Verlag, New York, Third edition, 2008.
- M. Minsky, Computation: Finite and Infinite Machines, Prentice-Hall, Inc. Englewood Cliffs, NJ, 1967.
- A. Nies, Computability and Randomness, Oxford Univ. Press, USA, 2009.
- R. Motwani and P. Raghavan, Randomized Algorithms, Cambridge Univ. Press, 1995.
- A.M. Turing, On Computable Numbers, with an Application to the Entscheidungsproblem, Proceedings of the London Mathematical Society, 2, 42: 230-265, 1936, "Correction", 43: 544-546, 1937.
Internal references
- Marcus Hutter, Shane Legg, Paul M.B. Vitanyi (2007) Algorithmic probability. Scholarpedia, 2(8):2572.
- Olaf Sporns (2007) Complexity. Scholarpedia, 2(10):1623.
- James Murdock (2006) Normal forms. Scholarpedia, 1(10):1902.
See also
| Paul M.B. Vitanyi (2009) Turing machine. Scholarpedia, 4(3):6240, (go to the first approved version) Created: 11 January 2008, reviewed: 18 March 2009, accepted: 19 March 2009 |





