<P> Weak results hinting that the clique problem might be hard to approximate have been known for a long time . Garey & Johnson (1978) observed that, because of the fact that the clique number takes on small integer values and is NP - hard to compute, it cannot have a fully polynomial - time approximation scheme . If too accurate an approximation were available, rounding its value to an integer would give the exact clique number . However, little more was known until the early 1990s, when several authors began to make connections between the approximation of maximum cliques and probabilistically checkable proofs . They used these connections to prove hardness of approximation results for the maximum clique problem . After many improvements to these results it is now known that, for every real number ε> 0, there can be no polynomial time algorithm that approximates the maximum clique to within a factor better than O (n), unless P = NP . </P> <P> The rough idea of these inapproximability results is to form a graph that represents a probabilistically checkable proof system for an NP - complete problem such as the Boolean satisfiability problem . In a probabilistically checkable proof system, a proof is represented as a sequence of bits . An instance of the satisfiability problem should have a valid proof if and only if it is satisfiable . The proof is checked by an algorithm that, after a polynomial - time computation on the input to the satisfiability problem, chooses to examine a small number of randomly chosen positions of the proof string . Depending on what values are found at that sample of bits, the checker will either accept or reject the proof, without looking at the rest of the bits . False negatives are not allowed: a valid proof must always be accepted . However, an invalid proof may sometimes mistakenly be accepted . For every invalid proof, the probability that the checker will accept it must be low . </P> <P> To transform a probabilistically checkable proof system of this type into a clique problem, one forms a graph with a vertex for each possible accepting run of the proof checker . That is, a vertex is defined by one of the possible random choices of sets of positions to examine, and by bit values for those positions that would cause the checker to accept the proof . Two vertices are adjacent, in this graph, if the corresponding two accepting runs see the same bit values at every position they both examine . Each (valid or invalid) proof string corresponds to a clique, the set of accepting runs that see that proof string, and all maximal cliques arise in this way . One of these cliques is large if and only if it corresponds to a proof string that many proof checkers accept . If the original satisfiability instance is satisfiable, it will have a valid proof string, one that is accepted by all runs of the checker, and this string will correspond to a large clique in the graph . However, if the original instance is not satisfiable, then all proof strings are invalid, each proof string has only a small number of checker runs that mistakenly accept it, and all cliques are small . Therefore, if one could distinguish in polynomial time between graphs that have large cliques and graphs in which all cliques are small, or if one could accurately approximate the clique problem, then applying this approximation to the graphs generated from satisfiability instances would allow satisfiable instances to be distinguished from unsatisfiable instances . However, this is not possible unless P = NP . </P>

When is a complete enumeration of solutions used