#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass book \begin_preamble \input{../defs} \end_preamble \use_default_options true \begin_modules algorithm2e \end_modules \maintain_unincluded_children false \language spanish \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style french \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard Un problema es \series bold tratable \series default si se puede resolver de forma suficientemente eficiente, y es \series bold intratable \series default si se puede resolver pero no lo suficientemente rápido como para que la solución sea práctica. \end_layout \begin_layout Section La clase \begin_inset Formula ${\cal P}$ \end_inset \end_layout \begin_layout Standard Un lenguaje es \series bold decidible en tiempo polinómico \series default si está en \begin_inset Formula \[ {\cal P}\coloneqq\bigcup_{k}\text{TIME}(n^{k}). \] \end_inset Los problemas en esta clase se consideran tratables, y el resto intratables. Así, son intratables los problemas con orden de complejidad exponencial, que suelen corresponder a búsqueda exhaustiva o por fuerza bruta del espacio de búsqueda, y que solo se pueden resolver de forma general en casos sencillos. Realmente, si un problema en \begin_inset Formula $\text{TIME}(n^{k})$ \end_inset es tratable depende de \begin_inset Formula $k$ \end_inset y de la aplicación particular, pero la distinción entre tiempo polinómico y exponencial es útil en la práctica. \end_layout \begin_layout Standard Una \series bold función polinómica \series default o \series bold computable en tiempo polinómico \series default es una que una \begin_inset Formula $\text{MT}$ \end_inset puede computar con complejidad en tiempo polinómica. \end_layout \begin_layout Standard \begin_inset Formula ${\cal P}$ \end_inset no es afectada significativamente por las particularidades del modelo de computación, y de hecho es igual para una \begin_inset Formula $\text{MT}$ \end_inset , una \begin_inset Formula $k\text{-MT}$ \end_inset y un ordenador típico (extendido para que sea Turing-completo). Sin embargo, sí es afectada por la representación del problema, pues aunque casi todas las representaciones son equivalentes a este respecto, no todas lo son. \end_layout \begin_layout Standard Una representación es \series bold razonable \series default si existe una función polinómica con inversa polinómica para codificar objetos hacia una representación interna. \begin_inset Foot status open \begin_layout Plain Layout Esto es así pese a que no hemos definido \begin_inset Quotes cld \end_inset representación interna \begin_inset Quotes crd \end_inset y en principio esta depende de la implementación del algoritmo. \end_layout \end_inset Las formas que hemos usado para representar autómatas, grafos, etc. son razonables, pero no lo es la representación unaria de números, pues es exponencialmente más larga que una representación en base 2 o más que sí es razonable. \end_layout \begin_layout Standard \begin_inset Note Comment status open \begin_layout Plain Layout \begin_inset Float algorithm wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash Entrada{Cadena $a$ \backslash textvisiblespace{}$b$, donde $a,b \backslash in \backslash {0,1 \backslash }^*$ son números naturales representados empezando por el bit menos significativ o.} \end_layout \begin_layout Plain Layout \backslash Salida{Número $a+b$ con la misma representación.} \end_layout \begin_layout Plain Layout avanzar hasta \backslash textvisiblespace{}, borrarlo y mover el resto a la cinta 2 \backslash ; \end_layout \begin_layout Plain Layout volver al principio \backslash ; \end_layout \begin_layout Plain Layout $c \backslash gets0$ \backslash ; \end_layout \begin_layout Plain Layout \backslash Mientras{no hay $B$ en ambas cintas}{ \end_layout \begin_layout Plain Layout leer $a$ de cinta 1 y $b$ de 2 \backslash ; \end_layout \begin_layout Plain Layout escribir $a+b+c \backslash bmod 2$ en cinta 1 y B en 2 \backslash ; \end_layout \begin_layout Plain Layout hacer $c \backslash gets[a+b+c \backslash geq2]$ y avanzar \backslash ; \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout volver al principio \backslash ; \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "alg:suma" \end_inset Suma \begin_inset Formula $O(n)$ \end_inset en \begin_inset Formula $\text{2-MT}$ \end_inset . \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Float algorithm wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash Entrada{Como en Algoritmo \backslash ref{alg:suma}.} \end_layout \begin_layout Plain Layout \backslash Salida{$ \backslash max \backslash {a-b,0 \backslash }$.} \end_layout \begin_layout Plain Layout avanzar hasta \backslash textvisiblespace{}, borrarlo y mover el resto a la cinta 2 \backslash ; \end_layout \begin_layout Plain Layout volver al principio \backslash ; \end_layout \begin_layout Plain Layout $c \backslash gets0$ \backslash ; \end_layout \begin_layout Plain Layout \backslash Mientras{no hay $B$ en ambas cintas}{ \end_layout \begin_layout Plain Layout leer $a$ de cinta 1 y $b$ de 2 \backslash ; \end_layout \begin_layout Plain Layout escribir $a-b-c \backslash bmod 2$ en cinta 1 y B en 2 \backslash ; \end_layout \begin_layout Plain Layout hacer $c \backslash gets[a-b-c<0]$ y avanzar \backslash ; \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout \backslash lSSi{$c=1$}{borrar toda la cinta 1 y escribir <<0>>} \end_layout \begin_layout Plain Layout volver al principio \backslash ; \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "alg:resta" \end_inset Resta saturada \begin_inset Formula $O(n)$ \end_inset en \begin_inset Formula $\text{2-MT}$ \end_inset . \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Float algorithm wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash Entrada{Como en Algoritmo \backslash ref{alg:suma}.} \end_layout \begin_layout Plain Layout \backslash Salida{$ab$.} \end_layout \begin_layout Plain Layout tras el final de la cadena escribir \backslash textvisiblespace{} \backslash ; \end_layout \begin_layout Plain Layout \backslash Mientras{haya un símbolo no marcado antes del primer \backslash textvisiblespace{}}{ \end_layout \begin_layout Plain Layout marcarlo y guardarlo en $c$ \backslash ; \end_layout \begin_layout Plain Layout \backslash lSSi{$c=1$}{copiar $b$ al final precedido por \backslash textvisiblespace} \end_layout \begin_layout Plain Layout ir al primer caracter no marcado tras el segundo \backslash textvisiblespace{} \backslash ; \end_layout \begin_layout Plain Layout \backslash lSSi{$c=1$}{ejecutar el Algoritmo \backslash ref{alg:suma} para sumar} \end_layout \begin_layout Plain Layout marcar el caracter actual \backslash ; \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout borrar desde el principio hasta el segundo \backslash textvisiblespace{} desplazando a la izquierda \backslash ; \end_layout \begin_layout Plain Layout eliminar las marcas \backslash ; \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "alg:producto" \end_inset Producto \begin_inset Formula $O(n^{3})$ \end_inset en \begin_inset Formula $\text{MT}$ \end_inset . \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Float algorithm wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash Entrada{Números $a$ y $b$ separados por \backslash textvisiblespace{}, en binario con el bit menos significativo a la izquierda.} \end_layout \begin_layout Plain Layout \backslash Salida{Resto y cociente de $b/a$ separados por \backslash textvisiblespace{}.} \end_layout \begin_layout Plain Layout escribir << \backslash textvisiblespace{}>> al final de la cadena \backslash ; \end_layout \begin_layout Plain Layout \backslash Mientras{$b>a$}{ \end_layout \begin_layout Plain Layout \backslash lMientras{haya un dígito de $a$ sin marcar}{marcar un dígito de $a$ y $b$ más a la derecha que no esté marcado} \end_layout \begin_layout Plain Layout \backslash Mientras{la parte marcada de $b$ es menor que la de $a$}{ \end_layout \begin_layout Plain Layout marcar el dígito sin marcar de $b$ más a la derecha \backslash ; \end_layout \begin_layout Plain Layout insertar un 0 detrás del segundo \backslash textvisiblespace{} \backslash ; \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout copiar la parte marcada de $b$, sin las marcas, al final \backslash ; \end_layout \begin_layout Plain Layout escribir \backslash textvisiblespace{} y hacer lo propio con $a$ \backslash ; \end_layout \begin_layout Plain Layout ejecutar el Algoritmo \backslash ref{alg:resta} para restar \backslash ; \end_layout \begin_layout Plain Layout mover el resultado sobre la parte marcada de $b$, de derecha a izquierda, cambiando el primer caracter de $b$ por 0 si no se había reemplazado \backslash ; \end_layout \begin_layout Plain Layout ir al principio de $b$ \backslash ; \end_layout \begin_layout Plain Layout \backslash lMientras{$0$}{eliminar desplazando lo de detrás a la izquierda} \end_layout \begin_layout Plain Layout insertar un 1 detrás del segundo \backslash textvisiblespace{} \backslash ; \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout eliminar $a$ \backslash textvisiblespace{} desplazando lo de detrás a la izquierda \backslash ; \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "alg:cociente" \end_inset Cociente entero \begin_inset Formula $O(n^{3})$ \end_inset en \begin_inset Formula $\text{MT}$ \end_inset , usando que comparar dos números claramente se puede hacer en \begin_inset Formula $O(n^{2})$ \end_inset . Aunque esta comparación se hace en un bucle dentro de otro, a cada comparación le corresponde la inserción de un dígito en el cociente y hay \begin_inset Formula $O(n)$ \end_inset de estas inserciones. \end_layout \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float algorithm wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status open \begin_layout Plain Layout \backslash Entrada{Gramática $G=(V, \backslash Sigma,{ \backslash cal R},S)$ en forma normal de Chomsky y cadena $w_1 \backslash cdots w_n \backslash in \backslash Sigma$.} \end_layout \begin_layout Plain Layout \backslash Salida{Acepta si $w \backslash in L(G)$, rechaza en otro caso.} \end_layout \begin_layout Plain Layout \backslash SSi{$w= \backslash epsilon$}{ \end_layout \begin_layout Plain Layout \backslash lSSi{$S \backslash to \backslash epsilon \backslash in{ \backslash cal R}$}{aceptar} \end_layout \begin_layout Plain Layout \backslash lEnOtroCaso{rechazar} \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout $T \backslash gets \backslash {((i,j), \backslash emptyset) \backslash }_{1 \backslash leq i \backslash leq j \backslash leq n}$ \end_layout \begin_layout Plain Layout \backslash tcp*{{ \backslash rm $T(i,j)$ contiene las variables que generan $w_i \backslash cdots w_j$.}} \end_layout \begin_layout Plain Layout \backslash Para{$i \backslash gets1$ \backslash KwA $n$}{ \end_layout \begin_layout Plain Layout \backslash lPara{$A \backslash in V$ con $A \backslash to w_i \backslash in{ \backslash cal R}$}{añadir $A$ a $T(i,i)$} \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout \backslash Para{$l \backslash gets2$ \backslash KwA $n$}{ \end_layout \begin_layout Plain Layout \backslash Para{$i=1$ \backslash KwA $n-l+1$}{ \end_layout \begin_layout Plain Layout $j \backslash gets i+l-1$ \backslash ; \end_layout \begin_layout Plain Layout \backslash Para{$k \backslash gets i$ \backslash KwA $j-1$}{ \end_layout \begin_layout Plain Layout \backslash Para{$A \backslash to BC \backslash in{ \backslash cal R}$}{ \end_layout \begin_layout Plain Layout \backslash lSSi{$B \backslash in T(i,k)$ y $C \backslash in T(k+1,j)$}{añadir $A$ a $T(i,j)$} \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout \backslash lSSi{$S \backslash in T(1,n)$}{aceptar} \end_layout \begin_layout Plain Layout \backslash lEnOtroCaso{rechazar} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "alg:cyk" \end_inset Algoritmo CYK de programación dinámica para establecer si una cadena está en un cierto lenguaje libre de contexto en tiempo polinómico. \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset Están en \begin_inset Formula ${\cal P}$ \end_inset : \end_layout \begin_layout Enumerate La suma, resta saturada, producto, cociente entero y resto de números naturales. \end_layout \begin_layout Enumerate \begin_inset Formula $\text{RELPRIM}\coloneqq\{\langle x,y\rangle\mid x,y\in\mathbb{N}\text{ son primos relativos}\}$ \end_inset . \end_layout \begin_deeper \begin_layout Standard Una forma de comprobarlo es usar el algoritmo de Euclides para ver que \begin_inset Formula $\gcd\{x,y\}=1$ \end_inset , repitiendo \begin_inset Formula $(x,y)\gets(y,x\bmod y)$ \end_inset hasta que \begin_inset Formula $y=0$ \end_inset . La operación más cara en un paso es el módulo, \begin_inset Note Comment status open \begin_layout Plain Layout \begin_inset Formula $O(n^{3})$ \end_inset con el Algoritmo \begin_inset CommandInset ref LatexCommand ref reference "alg:cociente" plural "false" caps "false" noprefix "false" \end_inset , \end_layout \end_inset y basta ver que el número de pasos es polinómico respecto al tamaño de la entrada, para lo que vemos que, excluyendo el primer paso, cada 2 pasos \begin_inset Formula $x$ \end_inset se divide al menos por la mitad. En efecto, tras el primer paso \begin_inset Formula $x>y$ \end_inset , de modo que si \begin_inset Formula $\frac{x}{2}\geq y$ \end_inset , \begin_inset Formula $x\bmod y