Ecco un algoritmo che batte i tentativi banali.
Quanto segue è un fatto noto (Esercizio 1.12 nel libro di O'Donnell): Se f:{−1,1}n→{−1,1} è una funzione booleana che ha grado ≤d come polinomio, quindi ogni coefficiente di Fourier di f , f ( S ) è un multiplo intero di 2 - d . Utilizzando Cauchy-Schwarz e Parseval si ottiene che ci sono al massimo 4 d nonzero coefficienti di Fourier e Σ S | f^(S)2−d4d∑S|f^(S)|≤2d.
Questo suggerisce un metodo di campionamento -
- Scegli numeri interi non negativi casuali aS per tutti gli insiemi S⊆[n] di dimensione al massimo d , che si sommano a ≤4d .
- Sia f(x)=∑SaS2dχS(x).
- Verifica che f sia booleano. In tal caso, restituire f . Altrimenti, torna a 1 .
Si noti che per ogni grado ≤d polinomio f esattamente una scelta di numeri interi casuali nel passaggio 1 genererà il polinomio f . La probabilità di ottenere un grado specifico ≤d polinomio è
1/((n≤d)+4d4d)=1/O(n/d)d4d.
Quindi, dobbiamo ripetere questo processo al massimoO(n/d)d4dvolte, in attesa, prima di interrompere.
Resta da mostrare come eseguire il passaggio 3. Si può definire A=⋃{S:aS≠0} . Verifica che |A|≤d2d (che dovrebbe contenere da Nisan-Szegedy per ogni funzione booleana) e quindi valutare f su tutte le possibili assegnazioni alle variabili A . Questo può essere fatto in tempo 2d2d . Gur e Tamuz offrono un algoritmo randomizzato molto più veloce per questo compito, tuttavia poiché questa parte non domina la complessità temporale questo è sufficiente.
Nel complesso l'algoritmo produce un campione casuale di un grado ≤d polinomiale nel tempo O(nd)d4d. Partendo dal presupposto chen≤d2dla complessità temporale è2O(d24d).
Questo non è un algoritmo di tempo polinomiale di campionamento, anche se è molto più veloce di campionamento di una funzione completamente casuale (nel qual caso la probabilità di ottenere una laurea specifica ≤d polinomio è 1/22n ).