Oto algorytm, który przewyższa trywialne próby.
Znanym faktem jest (Ćwiczenie 1.12 w książce O'Donnella): Jeśli f:{−1,1}n→{−1,1} jest funkcją logiczną, która ma stopień ≤d jako wielomian, to każdy współczynnik Fouriera z f , C ( S ) jest całkowitą wielokrotnością 2 - d . Używając Cauchy'ego-Schwarza i Parsevala uzyskuje się, że istnieją maksymalnie 4 d niezerowe współczynniki Fouriera i ∑ S | ˆf^(S)2−d4d∑S|f^(S)|≤2d.
Sugeruje to metodę próbkowania -
- Wybierz losowe nieujemne liczby całkowite aS dla wszystkich zbiorów S⊆[n] wielkości co najwyżej d , które sumują się do ≤4d .
- Niech f(x)=∑SaS2dχS(x).
- Sprawdź, czy jest wartością logiczną. Jeśli tak, zwróć . W przeciwnym razie wróć do .ff1
Należy zauważyć, że dla każdego stopnia wielomian dokładnie jeden wybór losowych liczb w kroku 1 wygeneruje wielomianu . Prawdopodobieństwo uzyskania określonego wielomianu wynosi
Dlatego musimy powtórzyć ten proces co najwyżej razy, w oczekiwaniu, przed zatrzymaniem.≤dff≤d1/((n≤d)+4d4d)=1/O(n/d)d4d.
O(n/d)d4d
Pozostaje pokazać, jak wykonać krok 3. Można zdefiniować . Sprawdź, czy (który powinien posiadać według Nisana-Szegedy każdej logicznej funkcji), a następnie ocenić wszystkie możliwe do przypisania w zmiennych . Można to zrobić w czasie . Gur i Tamuz oferują znacznie szybszy randomizowany algorytm do tego zadania, jednak ponieważ ta część nie dominuje złożoności czasowej, to wystarczy.A=⋃{S:aS≠0}|A|≤d2dfA2d2d
Ogólnie algorytm generuje losową próbkę stopnia wielomianu w czasie . Przy założeniu, że złożoność czasowa wynosi .≤dO(nd)d4dn≤d2d2O(d24d)
Nie jest wielomianem czasu próbkowania algorytmu, ale jest o wiele szybsze pobieranie próbek całkowicie funkcji losowej (w tym przypadku prawdopodobieństwo uzyskania stopnia konkretnego wielomian ).≤d1/22n