Compresión de Datos en las Comunicaciones 1 Introducción ! " # $ % & ' % % # # % ( ( ( ( % )% * • + , $ ( # / ( . # • 0 # ( ( & $ # ( ( # ( 1 333 /# . / . ( 1 3332 #12 " % # # % # # ( 4 . ( #( # 1 5533 + ( / % + ( % % & 4 ( * ρ= ρ + + = + = . /# . /# # ( $ # 6 + ( $ * $ . $ / ( # # * 7 ( ( ## / " . ρ ( 1 # " $ & ρ ;1 # # 91 6:# # % # ρ % 38# " ( % ( # ( & < + - # # # = +! ( "# $ & # # < # ( & ( % # ( % ( + % > # " ( # > ? # % # & ( + # # # & " ? # # + ( # * $ + " 3@ 3 3A3 ' * B ( % ( # ( ( # # B %# ( ( # . # ( / + $ # # 4 # # # 4 + # ( " # ( ( ( ( ( ( ( # ( # ( ( # ( # ( ( # . # & / & ( # # ( # # # %# # ( 1 C5D# 4 ( ( " # # * = =− ( ( # < ( $ # # ( % ( = * = =− = " = $ $ :# & # % " ( ( # $ # ( 4 # +E,#F ( ( ( # # * +E@ @ #+E@D# #( #2& =#G& =# %# * $ # . 4 ( + # # # ( /# ( H $ $ # ( # . / # ( # * • ' # ( . / " $ # ( • ' ( ( + " ( % # # > # / " ? . $ 2 Compresión lossless % % $%4 % & % $ & " #4 I % $ ' % # ( F % * 6 • ' • ' - 4 ( % ( ( ( . ( / ( * ( ( ( 4 ( ( / # # ( . 3 1 / ( # # ( ( . 4 J ( ( 4 ( " $ ( " ( % # # ( # & ( $ # ( " * %4 ( # ' % ( # # ' % 0 # $ > # ( %? 2% 4 $ ( ( ( & ( # "'K K D ( ( ( % ( .:8L / $ ( . # # " / . # $ ( "'K K / ( . ( " # / $ % * • ' • ' • ' ! "# $ % ( ( % # $ ( # ( ( $ % # 3 1 $ - # ( F( ( # " ( I # $ % ( $ ( # & + ( ( # % ( % % # $ % M % ( # # ( ( F * % ( ( ( % % #F ( ( " % I # ' #F ( ( % ' % %( $ %4 $ # %# ( 4 + $ J % $ 4 'NN % + 0. $ % : / J * // Crear el heap que contendrá en principio los mensajes a codificar heap<nodo> h(nMsg * 2); // mayor número de nodos del árbol // Insertar en el heap los mensajes a codificar for (i=0;i<nMsg;i++) if (msg[i]->freq != 0) // Sólo los que hayan salido h.insert(msg[i]); // Cuando sólo quede uno, será el nodo que debajo contiene a todos // los mensajes. El árbol ya está construído. La raíz será h.get(). while (h.numElem() != 1) { // Construir un nuevo nodo que será el padre de los dos nodos // menores nodoTmp = new nodo(0); // Nuevo nodo, frecuencia 0 // Recuperar el hijo izquierdo tmpSon = h.get(); // Coger el menor tmpSon->dad = nodoTmp; // Actualizar su padre tmpSon->branch = 0; // Y su rama (para el camino) nodoTmp->lson = tmpSon; // Actualizar el hijo izquierdo nodoTmp->freq += tmpSon->freq; // Recuperar el hijo derecho tmpSon = h.get(); // Coger el menor tmpSon->dad = nodoTmp; // Actualizar su padre tmpSon->branch = 1; // Y su rama (para el camino) nodoTmp->rson = tmpSon; // Actualizar el hijo derecho nodoTmp->freq += tmpSon->freq; // Insertar el nuevo nodo padre h.insert(nodoTmp); } · · · · // Procesar el árbol, es decir, construir los códigos para // cada mensaje y codificar la entrada. delete h.get(); // Borra todos los nodos } #" I # . 4 / *3 1 ( % # % # ' % ' # % % ( % " % # J " % A (1/2) F( ( A (1/2) B (1/4) F( ( C (1/4) % * •(1/2) 0/ \1 (1/4)B C(1/4) • 0/ \1 A • 0/ \1 B C ) ' % ( * 93#)91 3 '91 1. . D 6 #18 P#)P 'P/ $ ( $ / ( . / # O # ( ' / . # % ( # # # J "Q# % M ( % = R+ J " $ () *" (+ , 0 # % % % F & $ % % * % . % & % # ' % % ( # % # ' % #/# % % # # % % % % F( ( ( # ( " ( # # $ J 4 % 0 % 1 L S LT "Q ' # # %4 % %> "Q ? # # ( % ( # " ( % ( S 3# 1 T / ( ( .U/ 9:6A " . % " #U V# % .V/ 91 6A U# ( # # S 3# 1 T :6A < S 3#:6AT ( # V# # S :6A#1 T :6A ( ( # " # # % ' # # ( # ( J # ( * 1 +-----------+-----------+-----------+ | |8/9 YY | Detail |<| +-----------+-----------+<| Y | | too small |<|2/3 | YX | for text |<+-----------+-----------+-----------+ 31/32 15/16 14/16 6/8 Codewords /-----\ .11111 .1111 .1110 .110 | | |16/27 XYY |<| | +-----------+ | | XY | | | | | XYX |<| |4/9 | | | +-----------+-----------+ | | | | | X | | XXY |<| | |8/27 | | | +-----------+ | | XX | | | | | |<| | | XXX | | | | | |0 | | | +-----------+-----------+-----------+ + >' R ? ( % .1010 4/8 .100 3/8 .011 1/4 .01 -./ 0 ( ( % $ #UUV# 10/16 < 31 1 / A6D. # $% # # % % * 31 1 # :6A ( ( ( U" :6A ( U# # # < S 3#:6AT # # UU " #A6D. 31 1 / S 3#56CT # I & + % V UUV W ' ( X ( # # # + ( > ?+ . $ / % ( & 1 2 1 $ ((13.( ( 1 $/# ( % + # # & . ( " $ # # / " ( % # # % ( % % % 4 & * # $ % $ # 6 7 $ # # $ % # # # " # # %# ( * $ % ( ( / Q $ % 1 CD@ < S 1 ATI Y &&& & (6 ( J J': . ." ( $ % % " Y G ZZ < # J 1 CCA [< # ' & Y. ( *66 ( 4 33 4 / % M " * % $ :8L\ :8L & S#T "'K K ' # # 1 : ' ( # % S1 #:T" # 1 ( # # Y #( < Z# I # K 6 % # 9 S1 #:T # . /# # % # " # % $ * 3# %# $ S1 #:T9 ' $ $ ( $ # 1 # $ ( " # % % 3# $ & % # $ $ %# * # $ ( ( "'K K3 $ 4 $ $ ( * // Comprime el stream de entrada en el de salida int PREDICTORCompress(stream in,stream out) { char c; // Carácter actual a predecir char p1 = ‘\0’; // Último carácter de la entrada char p2 = ‘\0’; // Penúltimo carácter de la entrada // Inicialmente ambos se suponen ‘\0’ char matriz[256][256]; // Matriz de predicción. Se supone // inicializada a ‘\0’ // Procesar toda la entrada while (!in.eof()) { // c es el carácter a predecir c = in.getNextChar(); // ¿Se predice? if (c != matriz[p1][p2]) { // No, la salida es un bit a 0 y el carácter out.putBit(0); out.putChar(c); // La siguiente vez irá mejor matriz[p1][p2] = c; } else { // Se ha predicho. Sólo se saca un bit out.putBit(1); } // // p2 p1 El carácter que era el último pasa al penúltimo y el último es el c = p1; = c; } // Todo bien return 0; } // Descomprime el stream de entrada en el de salida int PREDICTORDecompress(stream in, stream out) { char c; // Carácter actual char p1 = ‘\0’; // Último carácter de la char p2 = ‘\0’; // Penúltimo carácter de // Inicialmente ambos se char matriz[256][256]; // Matriz de predicción. // inicializada a ‘\0’ salida la salida suponen ‘\0’ Se supone // Procesar toda la entrada while (!in.eof()) { // Se ha predicho if (in.getNextBit()) c = matriz[p1][p2]; else // No predicho { c = in.getNextChar(); // Ajustar la matriz para sincronizar matriz[p1][p2] = c; } // Salida: el carácter actual out.putChar(c); // Rotar p2 = p1 p1 = c; } // Todo bien return 0; } ' # ( > % + # ?" # ( # % # # ( '022 -H'02 2"H0"L:3 55D1 D# # 4 # 8L8AC @ C] # # F >M % .# () *" ( + , ' / % % # ' ? ' ( $ ( # J ( S @T & # # & >M $ $ $# ? # M+ .4 5 $ 6 / & J ( ( " ( . "'K K % / % ( % # % # % ( < # ( # K # 456# 1 # +E@D 5*7 +E@@ 7 '() # % $ %# % $ ( 4 < # # > % U - ? # * % " M+ $ $ % ( 1 # B ( ( % % < # # % % " 2 # % # $ B # 2 % % ( # 4 % + % # % %# % # W ( X # % 56# & H+ # 3. ( H+ # H+ #3. # ( # % % # H+ # / F * # % / $ $ % ( H+ 7 ? A ( ' ( :88 H+ # 3#H+ # 1 H+ # : H+ / " % M+ * ^ 1 P ^ :P ^ 5P ^ :P . . $ H+ # / A # ( . # ^P ^ )P ^ )P ^ )P ^ )P ^ )P ^ )P ^ )P ^ )P ^ )P ^ 'P ^ 'P ^ 'P ^ 'P '< "'K K # . % > ^ 1 P^ :P^ 5P ^ :P. /5^ 'P > % # $ . /3 ^P. / # ( / ( % H+ ? "'K K # $# / + ( . % /C ^ )P. / "'K K 3J ( H+ % 0 ( &'U % $ M+ $ > % $ $ % % ? ( % ( ( + ( # % .: % 1 :@/# % # " $ 1 3 % ( # * . /L^ 1 P^ :P^ 5P^ :P. /H+ ^P. /.34D3NC/ ^ )P. /.34D3N5/ ^ 'P 3+ % 1 ( # H+ _# # $ (*+,-(*. $ + ( + # ( Z E % ( % % % # +E@@ +E@D +E@@ # # 1 C@ @ 1 C@ DB < # # +E@ D +E@ D* +E, G $ %( # ( 3 # + % 89" : # & # S 5T ; < ( , # 2, VS DT # J-K "V"# S DT S :T . / +E@ D +E, S C#1 3T ( . / ( # % # % # 4 + # ( % . ( /# * % 1 # "'K K / . $ set w = NIL loop read a character K if wK exists in the dictionary w = wK else output the code for w add wK to the string table w = K endloop #:8L * ' # % % ' ' %9" 5& ') %)# % #)< # ' %) ')< %))< # '# ( % #)# ') ( ' :8L % :8@ . D / ( C % ( # $ "'K K # 1 ( # % # C H # ( % ' # ( ( # >6;!6=6;!6> * K wK existe diccionario salida (9 bits) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ E E Sí S ES No ES (256) 069 (E) T ST No ST (257) 083 (S) E TE No TE (258) 084 (T) O EO No EO (259) 069 (E) E OE No OE (260) 079 (O) S ES Sí T EST No EST(261) 256 (ES) E TE Sí - # > "<? # # ( # ( + - % C :L1" % % $ ( # 2 # % # # # :8L# % > "? : : : % : 4 *: :# ( : ( ( .: : ' : : + 4 :/ /# # # : . # ( .: /# # # 4 % # # ( J * Read OLD_CODE output OLD_CODE WHILE there are still input characters DO Read New_CODE // ¿Caso especial? IF NEW_CODE is not in the dictionary THEN STRING = get string of OLD_CODE STRING = STRING+CHARACTER ELSE STRING = get string of NEW_CODE ENDIF output STRING CHARACTER = first character in STRING add OLD_CODE+CHARACTER to dictionary OLD_CODE = NEW_CODE END WHILE F % ( # " # ( # % $% . % # ( . 1 LAD5 %# ( % 1 : 1 5 # % /# % # % / J $ 53CL & > ? % ! ( " * ( ( % # B $ % > ? # # $ >; 2 $> $ () *" ( + , S @ T J-K US 1 :T 3 0 $ % # # # # # < 53CL ( # % < " # # ( # # . % 4 1 L / % # % 4 # 53CL # LT # A: A: # & " # $S 1 1 # # / % % . $ ( . / . / >6;!> # % >!? # # :L1J $ ( >6;> $ $% ( + % ( ' % # % # Tabla Hash | .... | | ES (256) , T (84) | .... | | ---------+--------| .... | | | | .... | | | | .... | | | +-------------+ | .... | | | | Función | | .... | | +--+ Hash +-----> yyy | 261 -+----+ | +-------------+ | .... | | | | .... | +->261| | .... | | Tabla Cadenas ............... ............... ............... ............... ............... ............... ............... ............... ............... (256 << 8) + 84 ............... | | | | | | | | | | | (261 es la siguiente entrada consecutiva en el diccionario ^) & $* # #&&&# ( . # / + 4 S 1 1 T ( 3 $ $ $ $ ( # +# . % ( & % / $ S 1 1 TS 1 :T ( < % % J H . # $ % & #( S AT / J ( +E, < # % % ( S DT . +E,* /#2, . ; 2 , ( / V +E,# # 2,# ( % $ % % # ' % # #& & $ # ( ' $ # % # # # % +E, $ ? > & > & % # ( # % # + % % % % (*++ +E@ @ % ( H + +E@ @ # 4 +E@D & # # # Y Y Y Y # ( Y ( ( ## @ ( Y+ Y 2 $ # % Y Y" ( . % Y $ /# $ % ' %Y . / Y Y # A # " & # $ . # $ $ Y # $ / % $ Y+ ( * (p-n) actually here | (p) +-------------------------------------|--------------------+ |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-------------------------------------|--------------------+ | | | |<------- History = n bytes --------->|<-lookahead->| | | (bytes already processed) |<----Still to go--->| |<---------------------- INPUT DATA ---------------------->| ! 5*47B 04 9+7 + # # % # %( . A 0 $ /# Y ## Y % $ A # 4 +E@D# % # $ $ $ * # # & % . C S AT % ( / 0 ( D + S 8T # . / + ( ( ( % ( ( ( ( $ + " & ( ( S 3#. 1 /T + S# .: 1 /T $ ( . $ $ ( ( ( % # S 1 #T+ % $ / # # # $ # ( ( ( $ $ * buffer: +----------------------------+---------------------------+ | ||||||||||||||||||||||||||||| +----------------------------+---------------------------+ 0 n 2n-1 |<-------- Ventana --------->|<--- Bloque de Entrada --->| |<------------------------- 2n ------------------------->| ' % . A /# $ # $ ' 1 /T / $ $ % ' .S#.: # ( # ( (# F ( # ( ( ( ( ( % % 2 + $ % 2 . % # 2 $ % / . ( # # % / ( * % % $ % % A # 0 $ " . / " $ # $ & # % ( ( Y + Y # % % # ( ( + ! % ( # ( & % # # $ ( ( # # $ # # $ ( ( & # # % "( # + $ H $ * // Se calcula el hash de la cadena a la entrada $ "( nHash = funcionHash(pInPos); // La primera posición para encontrar una coincidencia es la cabeza // de la lista de las cadenas con hash 'nHash' comparePos = head[ nHash ]; while (comparePos != NIL && inWindow( comparePos ) ) { obtenerLongitudCoincidencia( pInPos , comparePos ); // Ir al siguiente elemento de la lista para comparar // la siguiente cadena comparePos = prev[ comparePos mod n ]; (*) } $ % + # # # . $ / & # ( (# !+ . # /# A # # .\ /# $ 4 E ( (* .. / X* # / W & 4 % # # + $ ' & 4 " # % , # ( (# # # * prev[ x mod n ] = head[ nHash ]; head[ nHash ] = x; Q $ < ( " # ( # . # $ & # % # # $ ( (/ ( % $ ( ( F $ $# %# # $ # % # + . $ -K +/ ' ( $ ( ( < $ % % # ( # " % 0 > A & S 8T ? $ " ( % % . 4 % # / ' S 1 5T 6 ; M , +E@@ + ..4F#() *" (#4.4# $ 5*47 $ %/ 5*47B & # H B # # % ; # ( % $ ( # ( - H Y ( Y # % %4 # % $ ( . ( A # 0 $ / # A % # % # % # % ( " % % # A . % % ( / ( A %# # % $ A ( 5 J 53CL % 4 . A .1 8 1 : / B % 4 ! /# $ 1 D# 1 L " # A %# ( $ # $ ( ( ( $ + ( $ # ( % / #& % ( +E@ @ ( 7 ( / . . A /# 0 $ ( ( # + ( F( ( " I ( +E@ @ * # ( ' # ( # $ .F ( ( $ " S 1 8T I / # $ $ % ( +E@ @# ( F( ( % % < # % $ 2 F ( ( . $ # # ## % $ # 2 % / 0 $ % # > ?S 1 LT ( * • "#$% "&+E@@NF ( ( % • '( )*+&+E@@N" I .K /#≈+E, ." Z / • '( ) ,+ !- &+E@ @NF ( ( % F( ( % .H ( / • "&&&2'.2 2 Z 5` # # / • . ,&+E@@NF ( ( % N > $# ?+ ( ." ( / ' % $ % # • * 0 • • • * # # K & L/# EK & =E # # ( / # % , R -<#12 % . # J 4# # & • 3 ) • ( 4 . , # ) " ( R / ) # # # % % J % & $ +E@@# % % 5*47 % 0) J $ %* ( - # $ + " " # # % # % # # & 4 # ' # % % & % # 2& = :# # 1(6 'H# & B# # $ D 1 3 Compresión lossy $ ( + # ( $ < # # # ( ( ( # & # # % ( / % ( ( R # / ( ( # # $. . % R H # ( # 2 ( & ( % # ( # # + ' ( # # ( % # J ( 6 # # ( # ( # # # 4 ( ( > ?. ?. > ' 4 / " / + # # ( + * + # # ( ( ( ( ( ( # " ( # / . # # M+ .M / a ( $ # # % " # # ( ( // & * + . % . A1 8333333333333D58D@1 1 1 1 1 1 1 1 1 1 1 1 1 LA85L@53333333333333333333333 L8 " # ( * A1 8 31 :D58D@ 1 1 A1 LA85L@5 3::L8 M+ + # # ( # # ( < ( ( & ( # b 2 Q b ( .' + ZJ < 4 % / ' # % ( ( ::5 ( % ( ( " J ( @ LD # # # :8L $ :8L M=) 4 M=) ( ( ( ( '+J< M=) A 4 % + ( ( ( %. / # . + 2 ( / # ( .H ( ( ( ( ( & ' / ( 4 ( % + # ( ( % ( ( ( - J ( + ( ( % ( J ( ( 2 ( H # N1 c1 * ( < J ( # %( % H ( ( ' # # ( 4 # ( ( I ( # H # # # ( + ( + ( " % 5× 5 $ ( " ( $ # 4 ( ( ( # & 5 ( ( 5 c@ N@ 3 :88 .cD/ D ( J ( H'<.H ' % < ( # / # ( ( G A # % H'< " ( $ /# % # % / ( % . " % . 2/ ' % % # ( % . % # % % $ % . /# % ' # # J % $ % + 331 3::3A::33533 ( ' ( ( " $ '+J< & < + $ ( + # ( . / ( 4 + + $ ( 0 $ # ( ( . . / 4 ) / 1 % 2 )3 G& = .G & % . ( 4 ( /( ( % ( # % ( #2& =# % # ( % G& = = # 1 3C1 D 4 % 1 M=) ( & :5 4 / 4 K <J#K "0 K ' 4 # % ( G& = 4 G& = % ( % # & ( % # G& = % ( M=) ( ( # 4 # . / :5 ( % G& = G& = % ( M=) # 2% J . % / # ( 7 #K Q. $ + % ( #V# ( * # -<"'/# V93AMN38C=N31 1 ) K93L3Mc 3:D=c 3A:) Q93:1 Mc 38:=N3A1 ) & & +# J ( "' 2 7 " 3 :88 H 4 A:3× :53 K Q # ( 3 D× D + # : $V G& = @ :33 ( ( # # $D× D ( -<"' & + V#K Q# H ( 1 :D I 5D33 ( # B H'< % # ( + H'<.3# 3/ $ 1 :33 H'< # + % H'< ( % # % # ( ( #.3# 3/# % # ( J # ( D× D $ ( / . # ( J $ H'<# H'< A G& =# $ ( " 1 # & $H'< ( % % ( # ( + $ # % H'< $ G& = ' 5 $ / .3# 3/ . ( $ % ' # # ( ( 8 + H'B $ L5 % # # AD ' M M+ $ $ ( .3# 3/ $ $ $ $ # AD ( ( . ( / L ( G& = ( F( ( # :3*1 ( # G& = #G& = H ( * ( ( H'<# ( $ / & ( # 2& = ) I & % . 1 4 )3 # 4 $ = % / a % #2& = B % 2& = .2 % 1 CCA ' # % # % 1 1 1 @:/ H .A8: × :53 % 2& = ( $ ( 2& = 1. -<"'/ % 1: 2 5@: 2 # # ' 1: 2 2& = 1 $ 2& = 1 ( 'H M02 'H 7 % ( 2& = ( 2& = : . % 1 AD1 D/# ( ( 5 L2 # -<"' & + 2% #2& = ( 4 # FH<7 2& = 5 ( .1 3( 6 / .L5Z / ( - MH"K) ' % %2& = D % # 4 0 2& = A FH<7# FH<7 2& = : + % ( 2& = 1 # ( & 2& = 1 2& = : 4 #2& = : #( 2& = 1 % ( % ( # K "0 4 # ( # 'H M02 2& = : 2& = 1 2& = 1 + ( " 2& = : * # % # # $ C3[F$ ( ( AA # :5 ( $ 2& = # + 551ZF$ 5DZF$ & / " ( A: ZF$ # # . /# $ 4 . % # % : 'H M02 $ # . # % H'' + + ( # / + $ 1 A " ( # $ + F( ( ( $ 2& = 'H ( # & ZP CLZ Z^ 1 :DZ # Z^ . % / + I ( % ( ( ( ( A: # ' # ( 2& = 1 4 A: Z 55DZ % * 2& = 1 4 2& = 1 ( 4 ( # $ $ G& = H D 1 32 $ " % # ( $ # A 5 ( # # % ( / H + ( . @ 8( ( ( ( G& = & % # ( ( $ 4 # H ( ( # ( 2& =B + ( % ( G& = % # ( + ( G& = 2& = ( 2& = 1 1I K.K /* K % : I ( AI &.& /* H ( ) .) * % ( G& = /* H ( ( 5I % H .H' /* 2 + ( K % % $ $ & ( % G& =# ( #2& = 1 % # K " ( ( ( ( # " ( ( < # # ( # ( # ( K # ( ( & $ + ( # ( &# # # D× D ( ( J K ( ( 1 L× 1 L 4 J ( % & ( ( % 4 ( " ( ( ( ( + # % # ( % 2& = 1 ( & # # # ( ( ( ±∆, # , + ( ±∆& & & $ % # H & % " % # # ( # ( ( ( . ( ( M+ H'<# ( F( ( # . " ( ' $ ( G& =# $ G& = % /# F( ( / # ( # ( K # J ( $% & " # > $ 2& = 1 4 ( ( # 4 ( $ ? # 2& = 1 % ( ( G& = G& = ( ( ( ( H ( 2& = 1 ( % G& = H ( ( ( ( ( ( ( ( ( + ( ) ( ( ( # ( ( H ( ( ( ( K & ( &#4 # & ( ( % ( ( )# $ * ( ( # ) # + ( H $ % 2& = 1 ( H ( H ( % F ( )+ ( $ F ( % % % # % ( $ ' ( # ( # ( 2& = 1 # % 2& = : + ( ( 2& = 1 # ( K #& H < # ( 1 3× 1 3 D× D# 83 % ( # ' 2& = : ( 'H M02# % # $ # 2& = 1 < ( % #2& = : * .A8: × :53/# . / .@ :3× 5D3/# 1 553.1 553× 1 1 8:/# .1 C:3× 1 3D3/ + 7'M % 2& = 1+ ( -<"' + FH<7 % #2& = : ( ' ( % % ( % . / # % $ ( ( #4 4 ( )# (R ( ( %( % + % ( ( ( ( FH<7 2& = : 2& = 1 H ( # $ ' a FH<7 + )# ( % ( % % ( ( A2 1 332 A 52 4 # # # J ( + " / ' # ( &" A3 # # + 4 'M' &" " $ 4 # # + 2& = 1 + & " .& Z $ ( # # 2& = : . + ( 2& = : " + " / ( 4 ( .1 DD /# %( % < - ( ( G& = ( % ( 2& =# # J 4 ( % ( . H'<# . % ( / / " % # ( $ # ( Z 4 Bibliografía 1.8 K < : .$ 3 < 3 & #1 CDD = H1 ! # # 9 8= "# A * #[ JR M L5 # 3 + I ' & " # M#= #G #HF# #' . ( / Z#"#)V< #2 #M ), #G 1 CC1 () *" (+ ,& + , 0 G #H G CGE d .+E@ D/ # - ,"/ + , 8 A I+ , 2 Z K 2 Z @.((9=!6+ !:! D ? ) . ' 7 '2 A:# 5.1 CDC/ ( 5 " 3 #E G#+ #:A# A#1 C@@.+E@ @ / ; G -./ G + A ' # K( $ # #K < & J ? K( < $> # :5#1 C@D 1 3 .! ' G # $ ( # #1 @# L#G 1 CD5 .+E,/ 1 16 G [ #H 1 : 3 H #[ $ # ! , 3 K( 1 5- 5*47 1 8 1 CDC # +K +" " " H 3 #< # & LG + L5 " , < #G 0 #H 8 , M+ 0# < Z R Z#G , 1 A( ' ( , 3 & $M #1 CD@ M & 5*47B +M .$ 1 L . ' # ; ( 1 @3 1 CCL 9 ' 2 +! + < #G# '2 #1 CC1 5 3 1 CDD# % 6 #< -, # 5.43 & ! '2# #G 2 [ #" 2 Z#1 CC1 F Z 0Z H # , G CCL R" < & F