Twierdzenie o prędkości liniowej

W teorii złożoności obliczeniowej twierdzenie o liniowym przyspieszeniu dla maszyn Turinga stwierdza, że ​​przy dowolnym rzeczywistym c > 0 i dowolnej maszynie Turinga z taśmą k rozwiązującej problem w czasie f ( n ), istnieje inna maszyna z taśmą k , która rozwiązuje ten sam problem w czas co najwyżej f ( n )/ c + 2 n + 3 , gdzie k > 1. Jeśli pierwotna maszyna jest niedeterministyczna , to nowa maszyna jest również niedeterministyczna. Stałe 2 i 3 w 2 n + 3 można obniżyć na przykład do n + 2.

Dowód

Konstrukcja polega na spakowaniu kilku symboli taśmowych pierwotnej maszyny M w jeden symbol taśmowy nowej maszyny N . Ma to podobny efekt jak używanie dłuższych słów i poleceń w procesorach: przyspiesza obliczenia, ale zwiększa rozmiar maszyny. To, ile starych symboli zostanie umieszczonych w nowym symbolu, zależy od pożądanego przyspieszenia.

Załóżmy, że nowa maszyna pakuje trzy stare symbole w nowy symbol. Wtedy nowej maszyny to symboli i spakowanych Nowa maszyna ma taką samą liczbę k > 1 taśm. Stan N składa się z następujących elementów:

  • stan M ;
  • dla każdej taśmy trzy upakowane symbole, które opisują upakowany symbol pod nagłówkiem, upakowany symbol po lewej stronie i upakowany symbol po prawej stronie; I
  • dla każdej taśmy, oryginalne położenie głowicy w symbolu opakowania pod nagłówkiem N .

Nowa maszyna N rozpoczyna się od zakodowania danych wejściowych do nowego alfabetu (dlatego jej alfabet musi zawierać ). Na przykład, jeśli wejście do 2-taśmowego M znajduje się po lewej stronie, to po zakodowaniu konfiguracja taśmy N znajduje się po prawej stronie:

[# _ A B B A B B A _ ...]      [# (_,_,_) (_,_,_) (_,_,_) ...]
[# _ _ _ _ _ _ _ _ _ ...]      [# (_,a,b) (b, a, b) (b,a,_) ...]

Nowa maszyna pakuje trzy stare symbole (np. pusty symbol _ , symbol a i symbol b ) w nowy symbol (tutaj (_, a , b )) i kopiuje go na drugiej taśmie, kasując pierwszą taśmę . Pod koniec inicjalizacji nowa maszyna kieruje głowę na początek. Ogólnie wymaga to 2 n + 3 kroków.

Po inicjalizacji stan N to gdzie symbol oznacza, że ​​zostanie on później uzupełniony przez maszynę; symbol oznacza, że ​​​​głowica oryginalnej maszyny wskazuje na pierwsze symbole wewnątrz i . Teraz maszyna zaczyna symulować m = 3 przejścia M używając sześciu własnych przejść (w tym konkretnym przypadku nie będzie przyspieszenia, ale generalnie m może być znacznie większe niż sześć). Niech konfiguracje M i N będą:

[# _ _ B B A B B A _ ...]      [# (_,a,b) (b, a, b) ( b ,_, _) ...]
[# _ A B B A B B _ _ ...]      [# (_,_, b ) (b, a, b) (b,a,_) ...]

gdzie pogrubione symbole wskazują pozycję głowy. Stan N to . Teraz dzieje się co następuje:

  • N porusza się w prawo, w lewo, w lewo, w prawo. Po czterech ruchach maszyna N ma wszystkie swoje wypełniony, a jego stan staje się
  • Teraz N aktualizuje swoje symbole i stan zgodnie z m = 3 przejściami oryginalnej maszyny. Może to wymagać dwóch ruchów (zaktualizuj bieżący symbol i zaktualizuj jeden z sąsiednich symboli). Załóżmy, że oryginalna maszyna porusza się w następujący sposób (z odpowiednią konfiguracją N po prawej):
[# _ _ _ _ _ B B A _ ...]      [# (_,a,b) ( b ,_,_) (_,_,_) ...]
[# _ A B B _ _ _ _ _ ...]      [# (_,_,_) (_,_, b ) (b,a,_) ...]

Zatem stan N staje się .

Złożoność

Inicjalizacja wymaga 2 n + 3 kroków. W symulacji 6 kroków N symuluje m kroków M . Wybór m > 6 do daje czas działania ograniczony przez