\documentclass[a4paper]{article}
\usepackage{amsmath, amssymb, amsfonts}
\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage[a4paper, total={6in, 8in}]{geometry}
\usepackage{minted}
\usepackage{mathpazo}
\usepackage{fancyhdr}
\usepackage{amsthm}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows} % Aggiunto 'arrows' per le frecce nei diagrammi

% Definizione degli ambienti
\newtheorem{theorem}{Teorema}
\newtheorem{definition}{Definizione}
\newtheorem{example}{Esempio}
\newtheorem{lemma}{Lemma}
\newtheorem{proposition}{Proposizione}

\hypersetup{
    pdftitle={Lezione di Informatica Teorica: Classi di Complessità Co-NP, EXP, NEXP},
    pdfauthor={Appunti da Trascrizione AI}
}

\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\textit{Lezione di Informatica Teorica}}
\fancyfoot[C]{\thepage}

\title{Lezione di Informatica Teorica: \\ Classi di Complessità Co-NP, EXP, NEXP}
\author{Appunti da Trascrizione Automatica}
\date{\today}

\begin{document}
\maketitle
\tableofcontents
\newpage

\section{Introduzione alle Classi di Complessità}

Riprendiamo il concetto di classe \textbf{NP}. Ricordiamo che un problema di decisione $L$ appartiene alla classe NP se esiste una Macchina di Turing non deterministica (NTM) che decide $L$ in tempo polinomiale. Intuitivamente, le istanze "sì" di un problema in NP ammettono un "certificato" conciso (polinomiale) che può essere verificato in tempo polinomiale da una Macchina di Turing deterministica.

\subsection{Problema UNSAT}

Consideriamo il problema \textbf{UNSAT}:
Data una formula booleana $f$ in forma normale congiuntiva (CNF), stabilire se $f$ \textit{non è soddisfacibile}.

\begin{definition}[Linguaggio UNSAT]
Il linguaggio UNSAT è l'insieme delle stringhe che codificano formule booleane in CNF che non sono soddisfacibili.
\[
\text{UNSAT} = \{ \langle f \rangle \mid f \text{ è una formula in CNF non soddisfacibile} \}
\]
Una formula non soddisfacibile è una formula per la quale non esiste alcuna assegnazione di verità alle variabili che la renda vera.
\end{definition}

\textbf{Domanda:} UNSAT appartiene alla classe NP?
\textbf{Risposta intuitiva:} No. Per rispondere "sì" (la formula non è soddisfacibile), dovremmo essere sicuri che \textit{nessuna} possibile assegnazione di verità la soddisfa. Non possiamo semplicemente "indovinare" un'assegnazione e verificare che non la soddisfa, perché un'assegnazione che non soddisfa la formula non prova che la formula sia non soddisfacibile; ne servirebbe una che la soddisfa per dire "no".

Se una macchina non deterministica "indovinasse" un'assegnazione di verità per le variabili di $f$, verificasse che tale assegnazione \textit{non} soddisfa $f$, e poi rispondesse "sì", tale macchina deciderebbe in realtà il complemento del linguaggio delle tautologie (formule sempre vere).

\section{La Classe Co-NP}

Introduciamo una nuova classe di complessità, \textbf{Co-NP}, che formalizza il tipo di problemi come UNSAT.

\begin{definition}[Classe Co-NP]
La classe Co-NP è l'insieme dei linguaggi $L$ tali che il loro complemento $\overline{L}$ appartiene alla classe NP.
\[
\text{Co-NP} = \{ L \mid \overline{L} \in \text{NP} \}
\]
\end{definition}

\textbf{Esempio 1: UNSAT}
UNSAT appartiene a Co-NP, poiché il suo complemento $\overline{\text{UNSAT}}$ è il problema SAT (Satisfiability), e SAT è un problema NP-completo, quindi appartiene a NP.

\textbf{Importante:} Co-NP \textit{non} è il complemento di NP. Il complemento di NP conterrebbe tutti i problemi fuori da NP, inclusi problemi indecidibili, problemi non ricorsivamente enumerabili, ecc. Co-NP è invece una classe ben definita di problemi decidibili.

\subsection{Intuizione per Co-NP}
In modo speculare all'intuizione per NP:
\begin{itemize}
    \item Un linguaggio $L$ è in \textbf{NP} se le sue istanze "sì" possono essere verificate efficientemente tramite un certificato conciso.
    \item Un linguaggio $L$ è in \textbf{Co-NP} se le sue istanze "no" possono essere verificate efficientemente tramite un certificato conciso.
\end{itemize}
Per i problemi in Co-NP, siamo in grado di rispondere "no" in modo efficiente, fornendo un "certificato di rifiuto".

\begin{example}[UNSAT - Intuizione Co-NP]
Per decidere UNSAT, se la formula $f$ \textit{non è} non soddisfacibile (cioè è soddisfacibile), possiamo fornire un certificato: un'assegnazione di verità che soddisfa $f$. Questo certificato permette di rispondere "no" in tempo polinomiale.
\end{example}

\begin{example}[TAUTOLOGY]
Il problema TAUTOLOGY è decidere se una data formula booleana in CNF è una tautologia (cioè sempre vera per ogni assegnazione di verità).
TAUTOLOGY appartiene a Co-NP. Per rispondere "no" a una formula che \textit{non è} una tautologia, basta fornire un'assegnazione di verità che la renda falsa. Questa verifica è polinomiale.
\end{example}

\section{Relazioni tra P, NP e Co-NP}

Mentre per le classi R e Co-R sappiamo che sono distinte e che la loro intersezione è R ($R \cap \text{Co-R} = R$), per P, NP e Co-NP la situazione è molto meno chiara. La maggior parte delle relazioni sono problemi aperti.

\begin{itemize}
    \item Non sappiamo se $\text{NP} = \text{Co-NP}$ o se $\text{NP} \neq \text{Co-NP}$. Questa è una questione aperta. L'ipotesi corrente è che siano distinte.
    \item Non sappiamo se $\text{P} = \text{NP} \cap \text{Co-NP}$. Sappiamo che $\text{P} \subseteq \text{NP} \cap \text{Co-NP}$.
\end{itemize}

\begin{figure}[h]
\centering
\begin{tikzpicture}[
    scale=0.8,
    cirlce/.style={draw, circle, minimum size=2cm},
    set/.style={circle, draw, minimum size=4cm, fill=blue!10},
    subset/.style={circle, draw, minimum size=2cm, fill=red!10},
    label/.style={font=\bfseries}
]
    % Disegnare gli insiemi principali
    \node[set, label={NP}] (NP) {};
    \node[set, label={Co-NP}] (CoNP) at (2,0) {}; % Spostato per sovrapposizione

    % Aggiungere il sottoinsieme P
    \node[subset, label={P}] (P) at (1,0) {}; % Posizionato nell'intersezione

    % Etichette
    \node at (NP.center) {NP};
    \node at (CoNP.center) {Co-NP};
    \node at (P.center) {P};

    % Linee per indicare l'intersezione e inclusione
    \draw[dashed] (NP.north west) -- (NP.south east); % Rappresentazione schematica
    \draw[dashed] (CoNP.north east) -- (CoNP.south west); % Rappresentazione schematica

    % Rappresentazione di P come sottoinsieme dell'intersezione
    \node[below of=P, yshift=1cm, align=center] {Relazione ipotizzata: \\ $P \subseteq \text{NP} \cap \text{Co-NP}$};
\end{tikzpicture}
\caption{Relazioni ipotizzate tra P, NP e Co-NP.}
\end{figure}

\begin{theorem}[Relazione NP e Co-NP]
$\text{NP} = \text{Co-NP}$ se e solo se esiste un linguaggio $L$ NP-completo tale che $L \in \text{Co-NP}$.
\end{theorem}

\begin{proof}
\textbf{Parte 1: Se $\text{NP} = \text{Co-NP}$ allora esiste $L$ NP-completo tale che $L \in \text{Co-NP}$.}
Se $\text{NP} = \text{Co-NP}$, allora qualsiasi linguaggio $L$ NP-completo (che per definizione appartiene a NP) apparterrà anche a Co-NP. Questa direzione è banale.

\textbf{Parte 2: Se esiste $L$ NP-completo tale che $L \in \text{Co-NP}$ allora $\text{NP} = \text{Co-NP}$.}
Per dimostrare che $\text{NP} = \text{Co-NP}$, dobbiamo mostrare due inclusioni: $\text{NP} \subseteq \text{Co-NP}$ e $\text{Co-NP} \subseteq \text{NP}$.

\begin{enumerate}
    \item \textbf{Dimostriamo $\text{NP} \subseteq \text{Co-NP}$:}
    Sia $L'$ un linguaggio qualsiasi in NP. Il nostro obiettivo è mostrare che $L' \in \text{Co-NP}$, il che significa $\overline{L'} \in \text{NP}$.
    \begin{itemize}
        \item Poiché $L' \in \text{NP}$ e $L$ è NP-completo per ipotesi, sappiamo che $L'$ si riduce polinomialmente a $L$ (cioè $L' \le_P L$). Questo significa che esiste una funzione di trasformazione $f$ calcolabile in tempo polinomiale tale che per ogni stringa $w$:
        $w \in L' \iff f(w) \in L$
        \item Questa equivalenza può essere riscritta in termini di complementi:
        $w \notin L' \iff f(w) \notin L$
        Ciò implica:
        $w \in \overline{L'} \iff f(w) \in \overline{L}$
        Questa relazione mostra che $\overline{L'}$ si riduce polinomialmente a $\overline{L}$ (cioè $\overline{L'} \le_P \overline{L}$).
        \item Per ipotesi, $L \in \text{Co-NP}$. Per definizione di Co-NP, questo significa che $\overline{L} \in \text{NP}$.
        \item Poiché $\overline{L'}$ si riduce a $\overline{L}$ (che è in NP), e la classe NP è chiusa rispetto a riduzioni polinomiali (se $A \le_P B$ e $B \in \text{NP}$ allora $A \in \text{NP}$), allora $\overline{L'} \in \text{NP}$.
        \item Dato che $\overline{L'} \in \text{NP}$, per definizione di Co-NP, $L' \in \text{Co-NP}$.
    \end{itemize}
    Abbiamo quindi dimostrato che qualsiasi $L' \in \text{NP}$ è anche in $\text{Co-NP}$, da cui $\text{NP} \subseteq \text{Co-NP}$.

    \item \textbf{Dimostriamo $\text{Co-NP} \subseteq \text{NP}$:}
    Sia $L'$ un linguaggio qualsiasi in Co-NP. Il nostro obiettivo è mostrare che $L' \in \text{NP}$.
    \begin{itemize}
        \item Poiché $L' \in \text{Co-NP}$, per definizione, $\overline{L'} \in \text{NP}$.
        \item Per ipotesi, $L$ è un linguaggio NP-completo. Poiché $\overline{L'} \in \text{NP}$ e $L$ è NP-completo, sappiamo che $\overline{L'}$ si riduce polinomialmente a $L$ (cioè $\overline{L'} \le_P L$).
        \item Similmente al punto precedente, questa riduzione implica che $L'$ si riduce polinomialmente a $\overline{L}$ (cioè $L' \le_P \overline{L}$).
        \item Per ipotesi, $L \in \text{Co-NP}$, il che significa $\overline{L} \in \text{NP}$.
        \item Poiché $L'$ si riduce a $\overline{L}$ (che è in NP), e NP è chiusa rispetto a riduzioni polinomiali, allora $L' \in \text{NP}$.
    \end{itemize}
    Abbiamo quindi dimostrato che qualsiasi $L' \in \text{Co-NP}$ è anche in $\text{NP}$, da cui $\text{Co-NP} \subseteq \text{NP}$.
\end{enumerate}
Dato che $\text{NP} \subseteq \text{Co-NP}$ e $\text{Co-NP} \subseteq \text{NP}$, concludiamo che $\text{NP} = \text{Co-NP}$.
\end{proof}

\subsection{Problemi Co-NP-hard}
Analogamente a NP-hard, definiamo Co-NP-hard.
\begin{definition}[Co-NP-hard]
Un problema $L$ è \textbf{Co-NP-hard} se $\overline{L}$ è NP-hard.
\end{definition}
I problemi Co-NP-hard sono almeno difficili quanto tutti i problemi in Co-NP. UNSAT è un esempio di problema Co-NP-completo.

\section{Il Problema della Fattorizzazione (FACTOR)}

Il problema della fattorizzazione di numeri interi è un problema centrale in crittografia. Sebbene il problema di "produrre la fattorizzazione" non sia un problema di decisione, possiamo definirne una versione decisionale.

\begin{definition}[Linguaggio FACTOR]
Il linguaggio FACTOR è l'insieme delle coppie $\langle n, k \rangle$ tali che $n$ è un intero naturale e $n$ ha almeno un fattore primo $p$ tale che $p \le k$.
\[
\text{FACTOR} = \{ \langle n, k \rangle \mid n \in \mathbb{N}, \exists p \in \mathbb{P} \text{ t.c. } p \le k \text{ e } p \text{ divide } n \}
\]
\end{definition}

\begin{example}
\begin{itemize}
    \item $\langle 175, 6 \rangle \in \text{FACTOR}$ perché $175 = 5 \cdot 5 \cdot 7$. Il fattore primo $5 \le 6$, e $5$ divide $175$.
    \item $\langle 175, 4 \rangle \notin \text{FACTOR}$ perché nessuno dei fattori primi di $175$ ($5, 7$) è minore o uguale a $4$.
\end{itemize}
\end{example}

\begin{theorem}
$\text{FACTOR} \in \text{NP} \cap \text{Co-NP}$.
\end{theorem}

\begin{proof}
\textbf{Parte 1: $\text{FACTOR} \in \text{NP}$}
Per dimostrare che FACTOR è in NP, dobbiamo mostrare che esiste una NTM che lo decide in tempo polinomiale.
\begin{itemize}
    \item \textbf{Guess:} La NTM "indovina" un numero primo candidato $p$. Dato che $p \le k$ (e $k \le n$), $p$ non può essere "troppo grande" rispetto alla dimensione dell'input $\langle n, k \rangle$, quindi il guess ha una dimensione polinomiale rispetto all'input.
    \item \textbf{Verifica (Check):}
    \begin{enumerate}
        \item Verificare che $p \le k$. (Tempo polinomiale).
        \item Verificare che $p$ sia un numero primo. L'algoritmo AKS (Agrawal-Kayal-Saxena, 2003) testa la primalità in tempo polinomiale deterministico.
        \item Verificare che $p$ divida $n$ (cioè $n \pmod p = 0$). La divisione tra interi può essere eseguita in tempo polinomiale rispetto alla dimensione (numero di bit) degli operandi.
    \end{enumerate}
    Tutti i passaggi di verifica sono polinomiali, quindi $\text{FACTOR} \in \text{NP}$.

\textbf{Parte 2: $\text{FACTOR} \in \text{Co-NP}$}
Per dimostrare che FACTOR è in Co-NP, dobbiamo mostrare che il suo complemento $\overline{\text{FACTOR}}$ è in NP.

\begin{definition}[Linguaggio $\overline{\text{FACTOR}}$]
$\overline{\text{FACTOR}}$ è l'insieme delle coppie $\langle n, k \rangle$ tali che $n$ è un intero naturale e \textit{tutti} i fattori primi $p$ di $n$ sono maggiori di $k$.
\[
\overline{\text{FACTOR}} = \{ \langle n, k \rangle \mid n \in \mathbb{N}, \forall p \in \mathbb{P} \text{ t.c. } p \text{ divide } n \implies p > k \}
\]
\end{definition}

Per dimostrare che $\overline{\text{FACTOR}} \in \text{NP}$:
\begin{itemize}
    \item \textbf{Guess:} La NTM "indovina" l'intera fattorizzazione prima di $n$: $p_1, p_2, \dots, p_m$. Il numero di fattori $m$ è al più logaritmico rispetto a $n$ (poiché $2^m \le n \implies m \le \log_2 n$). Quindi la dimensione del guess è polinomiale nella dimensione dell'input.
    \item \textbf{Verifica (Check):}
    \begin{enumerate}
        \item Verificare che $p_i > k$ per ogni $i=1, \dots, m$. (Tempo polinomiale).
        \item Verificare che ogni $p_i$ sia un numero primo (con l'algoritmo AKS). Questo richiede $m$ test di primalità, per un costo totale polinomiale.
        \item Verificare che il prodotto $p_1 \cdot p_2 \cdot \dots \cdot p_m$ sia uguale a $n$. La moltiplicazione di $m$ numeri può essere eseguita in tempo polinomiale.
    \end{enumerate}
    Tutti i passaggi di verifica sono polinomiali, quindi $\overline{\text{FACTOR}} \in \text{NP}$.
\end{itemize}
Poiché $\overline{\text{FACTOR}} \in \text{NP}$, per definizione, $\text{FACTOR} \in \text{Co-NP}$.

Combinando le due parti, $\text{FACTOR} \in \text{NP} \cap \text{Co-NP}$.
\end{proof}

\subsection{Implicazioni del posizionamento di FACTOR}
Il problema della fattorizzazione è fondamentale per la crittografia (e.g., RSA si basa sulla sua presunta difficoltà).
\begin{itemize}
    \item $\text{FACTOR} \notin \text{P}$ (ipotesi): Nessuno è ancora riuscito a trovare un algoritmo polinomiale deterministico per la fattorizzazione. Se lo fosse, molti schemi crittografici sarebbero compromessi.
    \item $\text{FACTOR} \notin \text{NP-completo}$ (ipotesi): Poiché $\text{FACTOR} \in \text{NP} \cap \text{Co-NP}$, se fosse NP-completo, implicherebbe $\text{NP} = \text{Co-NP}$ (per il teorema precedente). Dato che si ipotizza $\text{NP} \neq \text{Co-NP}$, si ipotizza anche che $\text{FACTOR}$ non sia NP-completo.
\end{itemize}
Questo colloca FACTOR in una "terra di mezzo": un problema che si presume non sia in P (non semplice) ma nemmeno NP-completo (non il più difficile in NP).

\textbf{Nota sui computer quantistici:} L'algoritmo di Shor per macchine quantistiche risolve FACTOR in tempo polinomiale. Questo non implica che $\text{P} = \text{NP}$ o che i problemi NP-completi siano risolvibili in tempo polinomiale da macchine quantistiche. L'algoritmo di Shor dimostra che FACTOR non è "intrinsecamente" difficile per tutte le classi di calcolo (come quella quantistica), ma non confuta le congetture sulla difficoltà dei problemi NP-completi per i computer classici.

\section{Classi di Complessità Superiori: EXP e NEXP}

Oltre alle classi P, NP, e Co-NP, esistono classi di complessità che considerano tempi di esecuzione maggiori, in particolare esponenziali.

\subsection{Classe EXP (Exponential Time)}
\begin{definition}[Classe EXP]
La classe \textbf{EXP} (o \textbf{EXPTIME}) è l'insieme dei linguaggi che possono essere decisi da una Macchina di Turing deterministica in tempo esponenziale, ovvero $O(2^{n^c})$ per qualche costante $c \ge 1$.
\[
\text{EXP} = \bigcup_{c \ge 1} \text{DTIME}(2^{n^c})
\]
\end{definition}

\textbf{Relazioni:}
\begin{itemize}
    \item $\text{P} \subseteq \text{EXP}$: Ovvio, poiché un tempo polinomiale è anche un tempo esponenziale.
    \item $\text{P} \neq \text{EXP}$: Questo è un risultato dimostrato dal Teorema della Gerarchia Temporale (Time Hierarchy Theorem). Ci sono problemi risolvibili in tempo esponenziale che non sono risolvibili in tempo polinomiale.
    \item $\text{NP} \subseteq \text{EXP}$: Una Macchina di Turing non deterministica che opera in tempo polinomiale può essere simulata da una Macchina di Turing deterministica in tempo esponenziale (esplorando l'albero di computazione).
    \item $\text{Co-NP} \subseteq \text{EXP}$: Se $L \in \text{Co-NP}$, allora $\overline{L} \in \text{NP}$. Poiché $\text{NP} \subseteq \text{EXP}$, allora $\overline{L} \in \text{EXP}$. Le classi deterministiche come EXP sono chiuse sotto complemento (se un problema è in EXP, anche il suo complemento lo è), quindi $L \in \text{EXP}$.
    \item $\text{NP}$ vs $\text{EXP}$: È un problema aperto se $\text{NP} = \text{EXP}$ o $\text{NP} \neq \text{EXP}$. Si ipotizza che siano distinte.
\end{itemize}

\subsection{Classe NEXP (Non-deterministic Exponential Time)}
\begin{definition}[Classe NEXP]
La classe \textbf{NEXP} (o \textbf{NEXPTIME}) è l'insieme dei linguaggi che possono essere decisi da una Macchina di Turing non deterministica in tempo esponenziale, ovvero $O(2^{n^c})$ per qualche costante $c \ge 1$.
\[
\text{NEXP} = \bigcup_{c \ge 1} \text{NTIME}(2^{n^c})
\]
\end{definition}

\textbf{Relazioni:}
\begin{itemize}
    \item $\text{EXP} \subseteq \text{NEXP}$: Una DTM è un caso speciale di NTM.
    \item $\text{EXP}$ vs $\text{NEXP}$: È un problema aperto se $\text{EXP} = \text{NEXP}$ o $\text{EXP} \neq \text{NEXP}$.
    \item $\text{NP} \subsetneq \text{NEXP}$: Il Teorema della Gerarchia Temporale implica che le classi temporali non deterministiche con differenze esponenziali sono distinte.
\end{itemize}

\subsection{Caratterizzazione di NEXP basata sui Certificati}
Similmente a NP, NEXP può essere caratterizzata in termini di certificati.
\begin{definition}[Caratterizzazione Certificata di NEXP]
Un linguaggio $L$ appartiene a \textbf{NEXP} se le sue istanze "sì" sono caratterizzate da certificati di \textit{taglia esponenziale} (rispetto alla dimensione dell'input) che possono essere verificati da una Macchina di Turing deterministica in \textit{tempo polinomiale} nella taglia combinata dell'input e del certificato.
\end{definition}
Formalmente, per un linguaggio $L$, se $w \in L$, esiste un certificato $C$ tale che:
\begin{itemize}
    \item $|C| = O(2^{|w|^k})$ per qualche $k \ge 1$.
    \item Esiste una DTM che accetta $\langle w, C \rangle$ in tempo $P(|w| + |C|)$ per qualche polinomio $P$.
\end{itemize}
Questa è la ragione per cui la verifica è polinomiale nella taglia combinata: se fosse esponenziale nella taglia del certificato, il costo totale sarebbe doppiamente esponenziale rispetto all'input.

\section{Riepilogo delle Relazioni tra Classi di Complessità}

Le relazioni tra le classi di complessità sono in gran parte ancora problemi aperti, ma ci sono alcune inclusioni e separazioni note o ipotizzate.

\begin{figure}[h]
\centering
\begin{tikzpicture}[
    scale=0.8,
    circle/.style={draw, circle, minimum size=2cm},
    set/.style={draw, minimum size=3cm, ellipse, fill=blue!10},
    subset/.style={draw, minimum size=2cm, ellipse, fill=red!10},
    label/.style={font=\bfseries}
]
    % Disegnare gli insiemi principali come ellissi
    \node[set, minimum size=6cm, label={NEXP}] (NEXP) at (0,0) {};
    \node[set, minimum size=5cm, label={EXP}] (EXP) at (0,0) {};
    \node[set, minimum size=4cm, label={NP}] (NP) at (-1,0) {}; % Spostato a sinistra
    \node[set, minimum size=4cm, label={Co-NP}] (CoNP) at (1,0) {}; % Spostato a destra

    % P nell'intersezione di NP e Co-NP
    \node[subset, minimum size=2.5cm, label={P}] (P) at (0,0) {};

    % Etichette
    \node at (NEXP.north west) {NEXP};
    \node at (EXP.north west) {EXP};
    \node at (NP.north west) {NP};
    \node at (CoNP.north east) {Co-NP};
    \node at (P.center) {P};

    % Illustrare inclusioni (schematico)
    \draw[->, dotted] (P.south) -- +(0,-0.5) node[below] {$P \subseteq \text{NP} \cap \text{Co-NP}$};
    \draw[->, dotted] (NP.south) -- +(0,-0.5) node[below] {$NP \subseteq EXP$};
    \draw[->, dotted] (CoNP.south) -- +(0,-0.5) node[below] {$CoNP \subseteq EXP$};
    \draw[->, dotted] (EXP.south) -- +(0,-0.5) node[below] {$EXP \subseteq NEXP$};

    % Linee per indicare sovrapposizione e aree aperte
    \draw[dashed] (NP.center) -- (CoNP.center); % Intersezione
    \node at (0,-2.5) {\tiny (Relazioni precise incerte, basate su congetture)};
\end{tikzpicture}
\caption{Panoramica delle relazioni tra le classi di complessità (ipotesi correnti).}
\end{figure}

\begin{itemize}
    \item $\text{P} \subseteq \text{NP} \subseteq \text{EXP} \subseteq \text{NEXP}$.
    \item $\text{P} \subseteq \text{NP} \cap \text{Co-NP}$.
    \item $\text{P} \neq \text{EXP}$ (confermato dal Teorema della Gerarchia Temporale).
    \item $\text{NP} \neq \text{NEXP}$ (confermato dal Teorema della Gerarchia Temporale).
    \item Le relazioni $\text{P}$ vs $\text{NP}$, $\text{NP}$ vs $\text{Co-NP}$, $\text{NP}$ vs $\text{EXP}$, $\text{EXP}$ vs $\text{NEXP}$ sono tutte problemi aperti. Le congetture più comuni sono che siano tutte inclusioni strette ($\neq$).
\end{itemize}

Le classi di complessità temporale deterministiche (come P, EXP) sono chiuse sotto complemento, mentre quelle non deterministiche (come NP, NEXP) non si sa con certezza.

\end{document}