# Circuit booléen

En théorie de la complexité, un circuit booléen est un modèle de calcul constitué de portes logiques (fonctions logiques) reliées entre elles. C'est une façon de représenter une fonction booléenne.
Un circuit booléen peut être utilisé pour reconnaître un langage formel, c'est-à-dire décider si un mot appartient ou non à un langage particulier. Les caractéristiques des circuits qui reconnaissent un langage permettent de définir (ou redéfinir) des classes de complexité.
Les circuits booléens sont un modèle utilisé en génie informatique notamment pour la conception des unités arithmétiques et logiques et en informatique théorique notamment pour établir des bornes inférieures.

## Définition formelle

Un circuit booléen est un graphe orienté acyclique (DAG) fini connexe dont les feuilles sont les entrées et l'unique racine est la sortie. Les sommets sont les portes, généralement des portes ET, OU et NON. On peut évaluer la valeur de sortie récursivement à partir des feuilles : pour une porte "ET" par exemple, si les entrées sont positives, la sortie sera positive, sinon la sortie est négative.
Une formule de la logique propositionnelle est un cas particulier de circuit booléen qui est un arbre.
On peut aussi modéliser des circuits par des programmes straight-line : ce sont des programmes sans conditionnelles et sans boucles. Par exemple, le circuit booléen de l'illustration est équivalent au programme straight-line suivant, en appelant x$_1$ et x$_2$ les entrées, et en introduisant les variables y$_1$, y$_2$, y$_3$ pour les trois portes logiques :
    y$_1$ := x$_1$ ou x$_2$
    y$_2$ := non x$_2$
    y$_3$ := y$_1$ et y$_2$

## Famille de circuits et non-uniformité

Les circuits classiques décident des langages codés en binaire : le premier bit du mot est la première entrée, etc. Le mot est accepté si et seulement si la sortie du circuit est vrai. Comme un circuit ne permet de reconnaître que des mots de mêmes tailles, on parle généralement de famille de circuits $(C_{n})_{n}$, où $C_{n}$ reconnaît les mots du langage de taille $n$. Un modèle comme celui-ci, où il y a un circuit différent pour chaque taille de l'entrée, est dit « non uniforme ».

## Classes de complexité

Les circuits booléens, à l'instar d'autres modèles de calcul comme les machines de Turing, permettent de définir des classes de complexité. Une classe de complexité regroupe des problèmes algorithmiques selon l'utilisation de ressources (temps, mémoire, etc.) qu'il faut pour les décider. Les classes présentées ici, qui reposent sur les circuits, définissent des classes de complexité où les ressources sont :
* la taille du circuit, i.e. le nombre de portes logique et d'entrées qu'il y a dans un circuit (par exemple, le circuit en illustration est de taille 5 (2 entrées + 3 portes logiques) ;
* la profondeur du circuit
Voici des exemples de classes de complexité que l'on peut définir avec des circuits.
* La classe P/poly est la classe des langages pouvant être reconnu par des circuits de tailles polynomiales.
* La classe AC$^0$, la classe des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur constante (avec degré entrant non borné)
* La hiérarchie NC, des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant borné)
* La hiérarchie AC, la classe des langages pouvant être reconnu par des circuits de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant non borné)
* La hiérarchie TC, la classe des langages pouvant être reconnu par des circuits avec des portes ET, OU, MAJORITE, de tailles polynomiales et de profondeur polylogarithmique (avec degré entrant non borné)

## Taille des circuits
### Bornes supérieures

Lupanov, en 1952, démontre que toute fonction booléenne sur n variables admet un circuit de taille (1 + o(1))2$^n$/n.

### Bornes inférieures

Shanon, en 1949, démontre que pour tout n > 1, il existe une fonction booléenne à n variables qui n'admet pas de circuit de taille 2$^n$/(10n). Un autre intérêt des circuits booléens est leur simplicité (en comparaison aux machines de Turing) qui permet de prouver certaines bornes inférieures du type : les circuits reconnaissant tel langage doivent être de taille au moins $f(n)$. Ce genre de borne permet de différencier certaines classes. Cependant, trouver de bonnes bornes inférieures pour les circuits est considéré comme difficile, et dans certains cas, on peut prouver que les techniques classiques ne peuvent pas fonctionner, c'est le cas des preuves naturelles pour le problème P=NP. Une borne inférieure connue est que la fonction parité n'appartient pas à AC$^0$.

## Propriétés

Le problème de l'évaluation d'un circuit, qui consiste à décider la sortie du circuit sur des entrées données, est un problème P-complet.