OK, entonces su objetivo es mostrar que basándose en C L A S S 1 [ g ( n ) ] = C L A S S 2 [ h ( n ) ]doL A SS1[ g( f( n ) ) ] = CL A SS2[ h ( f( n ) ) ]doL A SS1[ g( n ) ] = CL A SS2[ h ( n ) ](no especificamos qué son exactamente estas clases, solo sabemos que de alguna manera están parametrizadas con el tamaño de entrada). Tenemos un lenguaje , decidido por algún algoritmo A . Ahora hacemos un lenguaje L ′ rellenando cada palabra en x ∈ L , de modo que su longitud ahora sea f ( n ) , y vemos que está contenida en C L A S S 1 [ gL ∈ CL A SS1[ g( f( n ) ) ]UNAL′x ∈ LF( n ) (nuestro nuevo algoritmo A ' básicamente ignora los ceros agregados y ejecuta A en la entrada corta real).doL A SS1[ g( n ) ]UNA′UNA
Lo que hacemos es: tomamos un lenguaje de la clase más grande y lo rellenamos, para que pueda resolverse mediante un algoritmo más débil que nos da contención en la clase más pequeña; el algoritmo más débil puede hacerlo, porque tiene la misma cantidad de 'trabajo real' para hacer como antes, pero tiene sus restricciones (que son una función de la longitud de entrada) levantadas al extender la entrada.
Ahora sabemos que y, por lo tanto, L ′ ∈ C L A S S 2 [ h ( n ) ] (decidido por algún algoritmo B ′ ). Nos gustaría llegar de aquí a L ∈ C L A S S 2 [ h ( f ( n ) ) ]L′∈ CL A SS1[ g( n ) ]L′∈ CL A SS2[ h ( n ) ]si′L ∈ CL A SS2[ h ( f( n ) ) ]. Pero eso es sencillo: el algoritmo decide que L simplemente rellena la entrada en consecuencia y ejecuta B ' en la entrada acolchada.siLB′
Este paso puede resumirse de la siguiente manera: queremos decidir en la clase más grande y con más recursos. Usando nuestros recursos adicionales, rellenamos la entrada y ejecutamos el algoritmo para decidir el idioma rellenadoL .
Por supuesto, hay algunos detalles técnicos involucrados aquí (por ejemplo, debemos asegurarnos de que el relleno se pueda implementar en las clases que consideramos), pero simplemente los ignoro para dar una intuición general.