Loading AI tools
De Wikipédia, l'encyclopédie libre
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.
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[1]. 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[2] : 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 x1 et x2 les entrées, et en introduisant les variables y1, y2, y3 pour les trois portes logiques :
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 , où reconnaît les mots du langage de taille . 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 ».
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 :
Voici des exemples de classes de complexité que l'on peut définir avec des circuits.
Lupanov, en 1952, démontre que toute fonction booléenne sur n variables admet un circuit de taille (1 + o(1))2n/n[3].
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 2n/(10n)[4]. 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 . 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[5]. Une borne inférieure connue est que la fonction parité n'appartient pas à AC0.
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.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.