• No se han encontrado resultados

p(b, n) =b n, (b Z, n N) Esta definición matemática, recursiva, proporciona el procedimiento computacional

N/A
N/A
Protected

Academic year: 2021

Share "p(b, n) =b n, (b Z, n N) Esta definición matemática, recursiva, proporciona el procedimiento computacional"

Copied!
11
0
0

Texto completo

(1)

Recursi´

on e iteraci´

on

Se exponen en este apartado diversos ejemplos simples de definiciones de procedimientos que generan procesos recursivos o iterativos. Se comienza precisando algoritmos y sus correspondientes procedimien-tos para el c´alculo de potencias de exponente entero no negativo, primero en el monoide multiplicativo de los enteros y, posteriormente, potencias en un monoide cualquiera. Mediante estos ejemplos sencillos se ilustran definiciones de procedimientos recursivos e iterativos, as´ı como sus correspondientes procesos recursivos e iterativos. Tambi´en se ponen de manifiesto hechos cruciales relativos al consumo de tiempo y de memoria en los procesos computacionales.

[1] Comencemos considerando el concepto de potencia de exponente entero no negativo (se tomar´a, por simplificar, el monoide multiplicativo (Z) de los enteros como dominio base). Deber´a tenerse en cuenta que no van a servir, en principio, definiciones“para andar por casa”al estilo de

bn=b×b×. . .×b;

en lugar de este tipo de definiciones deberemos acudir al concepto matem´aticamente correcto de potencia.

Fijado un n´umero enterob, seapb:NZla funci´on tal que

pb(0) = 1,

pb(n+ 1) = b×pb(n), (n∈N)

(1) Se escribe

bn=pb(n), para todo enterob y todo n´umero naturaln,

y se dice que bn es la potencia de base b y exponente n; queda as´ı definida una

aplicaci´on

p:Z×NZ

p(b, n) =bn, (bZ, nN)

que, de acuerdo con (1), verifica:

b0 = 1

bn = b×bn−1 (b∈Z, n∈N, n >0) (1)

(2)

(define (potencia base exponente) (if (zero? exponente)

1

(* base (potencia base (− exponente 1)))))

(2)

Ejemplo de uso:

> (potencia 3 5)

243

El proceso generado en el c´alculo de(potencia 3 5)se puede esquematizar en la forma:

(potencia 3 5) (* 3 (potencia 3 4)) (* 3 (* 3 (potencia 3 3))) (* 3 (* 3 (* 3 (potencia 3 2)))) (* 3 (* 3 (* 3 (* 3 (potencia 3 1))))) (* 3 (* 3 (* 3 (* 3 (* 3 (potencia 3 0)))))) (* 3 (* 3 (* 3 (* 3 (* 3 1))))) (* 3 (* 3 (* 3 (* 3 3)))) (* 3 (* 3 (* 3 9))) (* 3 (* 3 27)) (* 3 81) 243

El procedimiento potenciagenera procesos recursivos que requieren un n´umero de pasos (tiempo de ejecuci´on) que crece de modo lineal en la talla del exponente y usan memoria tambi´en lineal en la talla del exponente. ¿Es posible mejorar estas cotas?

[2] Atendamos, en primer lugar, al tiempo de ejecuci´on. De la definici´on (1) se derivan propiedades de las potencias que pueden ayudar a disminuir el n´umero de pasos; por ejemplo

bn+m=bn×bm,

de donde, si se tomam=n,

b2×n=bn×bn= (bn)2

Por tanto, el c´alculo de b2×n requiere exactamente una multiplicaci´on m´as que el c´alculo

debn. De ah´ı que, sie >0 es par, entonces

be= (be/2)2 (3)

El c´alculo directo de be seg´un (1) conlleva una multiplicaci´on m´as que el c´alculo debe−1, mientras que usando (3) el n´umero de multiplicaciones requeridas es una m´as que el c´alculo debe/2. Ahora, sie/2 es par se vuelve a usar (3); mientras que sie/2 es impar, se procede

como en (1):

(3)

y e

21 es par, con lo que se le puede aplicar nuevamente la reducci´on (3), etc.

Estas consideraciones conducen a la formulaci´on siguiente: Dado un entero b, para todo entero no negativo nse tiene

b0 = 1

bn = (bn/2)2, sin >0 y nes par bn = b×bn−1, sin >0 y nes impar

(4)

que en t´erminos de procedimientos se expresa

(define (pot base exponente) (cond ((zero? exponente) 1)

((even? exponente) (cuadrado (pot base (/ exponente 2)))) (else (* base (pot base (− exponente 1))))))

(5) (define (cuadrado x) (* x x)) Ejemplo de uso: > (pot 2 21) 2097152

El proceso generado en el c´alculo de(pot 2 21)se puede esquematizar en la forma:

(pot 2 21) (* 2 (pot 2 20))

(* 2 (cuadrado (pot 2 10)))

(* 2 (cuadrado (cuadrado (pot 2 5)))) (* 2 (cuadrado (cuadrado (* 2 (pot 2 4)))))

(* 2 (cuadrado (cuadrado (* 2 (cuadrado (pot 2 2))))))

(* 2 (cuadrado (cuadrado (* 2 (cuadrado (cuadrado (pot 2 1))))))) (* 2 (cuadrado (cuadrado (* 2 (cuadrado (cuadrado (* 2 (pot 2 0)))))))) (* 2 (cuadrado (cuadrado (* 2 (cuadrado (cuadrado (* 2 1)))))))

(* 2 (cuadrado (cuadrado (* 2 (cuadrado 4))))) (* 2 (cuadrado (cuadrado (* 2 16))))

(* 2 (cuadrado 1024)) (* 2 1048576)

2097152

El procedimiento pot genera procesos recursivos que requieren un n´umero de pasos que crece logar´ıtmicamente con el exponente. El paso de un tiempo lineal a un tiempo logar´ıtmico es crucial: el c´alculo debelevado a 1048576 (= 220) requerir´ıa 1048575

multi-plicaciones seg´un el procedimientopotenciay solamente 20 = log2(1048576) multiplica-ciones seg´un el procedimientopot.

(4)

[3]Expongamos ahora otro punto de vista, radicalmente distinto al anterior, para el c´alculo de potencias de acuerdo con el siguiente esquema adaptado al caso concreto 35; se comienza

con una variableacon valor inicial1, una variablebcon valor la base (3 en nuestro caso) y una variable ncon valor inicial el exponente (5 en nuestro caso), de modo repetitivo se multiplica apor la b aseba la vez que se disminuyenen una unidad:

a b n 1 3 5 1×3 = 3 3 4 3×3 = 9 3 3 9×3 = 27 3 2 27×3 = 81 3 1 81×3 = 243 3 0

cuandonalcance 0, el valor deaes la potencia buscada.

Formalicemos esta forma de proceder. Dado un n´umero entero b, consideremos la funci´onPb:Z×NZtal que

Pb(a,0) = a, para todo a∈Z Pb(a, n+ 1) = Pb(a×b, n), para todo a∈Z, n∈N (6) Se tiene Pb(a, n) =a×bn (7)

Demostraci´on: Por inducci´on sobren.

Pb(a,0) =a=a×b0, y

Pb(a, n+ 1) =Pb(a×b, n) = (a×b)×bn=a×bn+1

En particular, paraa= 1:

Pb(1, n) =bn (8)

Queda definida una funci´on

P : Z×Z×N Z

(a, b, n) Pb(a, n) y se cumple

P(a, b, n) =a×bn .

Teniendo en cuenta (6), la funci´onP se expresa en la forma

P(a, b,0) = a

(5)

y se tiene

bn =P(1, b, n) (10)

Pasemos a definir los correspondientes procedimientos computacionales. La funci´on

P se implementa, teniendo en cuenta (9), como el procedimientopot2Iter:

(define (pot2Iter a b n) (if (zero? n) a (pot2Iter (* a b) b (− n 1)))) (11) y de (10) se obtiene

(define (pot2 base exponente) (pot2Iter 1 base exponente))

(12)

Ejemplo de uso:

> (pot2 3 5)

243

El proceso generado en la evaluaci´on de(pot2 3 5)es como sigue:

(pot2 3 5)llama apot2Itercon los par´ametrosa, b, nreemplazados por1, 3, 5, respectivamente. Posteriormente, y de modo repetitivo (i.e. iterativo), se eval´uan a * b, b y n − 1, despu´es estos valores pasan a ser (en paralelo) los nuevos valores dea,byn, respectivamente:

(a, b, n)(a * b, b, n − 1)

hasta que el valor densea0en cuyo momento se para el proceso y devuelve243

como valor de(pot2Iter 1 3 5); esto es, como valor de(pot2 3 5).

(6)

(pot2 3 5) = . (pot2Iter 1 3 5) = . . (pot2Iter 3 3 4) = . . . (pot2Iter 9 3 3) = . . . . (pot2Iter 27 3 2) = . . . (pot2Iter 81 3 1) = . . . (pot2Iter 243 3 0) = . . . 243 = . . . 243 = . . . . 243 = . . . 243 = . . 243 = . 243 = 243

Los procedimientos potencia y pot2 calculan potencias de exponente natural de n´umeros enteros, pero son esencialmente distintos en cuanto a la forma de calcularlos o, con mayor precisi´on, los procesos generados son diferentes:

– La definici´on de potenciaes recursiva en el sentido de que potencia se llama a s´ı mismo [en la definici´on (2)], y el proceso generado por (potencia b n)es estrictamente recursivo en el sentido de que en cada paso queda aplazada una evaluaci´on [el producto (* base (potencia base (− exponente 1)))]

– La definici´on de pot2Iter es recursiva, pot2Iter se llama a s´ı mismo [en la definici´on (11)], pero el proceso generado por(pot2Iter a b n)es esencialmente iterativo en el sentido de que la respuesta se va construyendo mientras el proceso avanza y no quedan (o no deber´ıan quedar) evaluaciones aplazadas.

Una de las ventajas de esta forma recursivo-iterativa de pensar es que el par de definiciones (11), (12) se traduce autom´aticamente a una definici´on de procedimiento que generar´a procesos puramente iterativa; esto se consigue mediante el uso de alguna de las primitivas de iteraci´on expl´ıcita que proporcione el lenguaje o el sistema, por ejemplo,do

en Scheme. Veamos c´omo llevar a cabo esta traducci´on autom´atica mediante una sucesi´on de pasos seg´un se expone seguidamente:

1. la entrada (los datos) es un par(base, exponente) Z×N(primera l´ınea del procedimiento (12)).

2. se invoca pot2Iter con sus par´ametros a, b, n inicializados como 1, base, exponente, respectivamente (segunda l´ınea de (12)).

(7)

4. si nno es0 se efect´ua el cambio(a, b, n) (a * b, b, n − 1) y se repite la evaluaci´on depot2Itercon estos nuevos valores (tercera l´ınea de (11)).

Estamos en condiciones de definir un procedimiento que genere procesos puramente iterativo para el c´alculo de potencias seg´un el esquema indicado:

(define (pot3 base exponente) (do ((a 1 (* a b))

(b base)

(n exponente (− n 1))) ((zero? n) a)))

[4] Combinemos ahora dos puntos de vista tratados previamente: – proceso iterativo del apartado anterior[3]y

– tiempo logar´ıtmico del apartado[2].

Para ello debemos tener en cuenta que sines par, entonces

bn = (bn/2)2= (b2)n/2

Volvamos a usar las funciones Pb yP del apartado [3]. En la situaci´on all´ı contemplada, y sines un entero positivo par, se tiene:

P(a, b, n) =Pb(a, n) =a×bn =(b2)n/2=Pb2(a, n/2) =P(a, b2, n/2)

Por lo tanto las expresiones de (9) se escriben

P(a, b,0) = a P(a, b, n) = P(a, b2, n/2), sines par P(a, b, n) = P(a×b, b, n−1), sines impar (a, b∈Z, n∈N, n >0) (13) y se tiene, v´ease (10), bn =P(1, b, n)

Esto proporciona la siguiente definici´on de procedimiento:

(define (pot4Iter a b n) (cond ((zero? n) a)

((even? n) (pot4Iter a (* b b) (/ n 2))) (else (pot4Iter (* a b) b (− n 1)))))

(define (pot4 base exponente) (pot4Iter 1 base exponente))

(8)

Ejemplo de uso:

> (pot4 5 87)

6462348535570528709932880406796584793482907116413116455078125

El procedimientopot4 iter (recursivo-iterativo) genera procesos (que deber´ıan ser) iterativos con un n´umero de pasos que crece logar´ıtmicamente con el tama˜no deexponente.

Ahora, y como traducci´on directa del procedimiento anterior, veamos la versi´on puramente iterativa:

(define (pot5 base exponente)

(do ((a 1 (if (even? n) a (* a b))) (b base (if (even? n) (* b b) b))

(n exponente (if (even? n) (/ n 2) (− n 1)))) ((zero? n) a)))

(9)

[5] Generalizaci´on mediante procedimientos de orden superior.

La definici´on de potencia de exponente natural en el dominioZde los enteros, vista en (1), se generaliza de modo obvio al caso de un monoide arbitrarioM = (M,•). Recordemos que es una operaci´on binaria enM asociativa y con elemento unidad (necesariamente ´

unico), digamose. La definici´on (1) se expresa ahora:

Fijado un elementob∈M, seapb:M →M la funci´on tal que

pb(0) = e,

pb(n+ 1) = b•pb(n), (n∈N)

(14) El resto de la discusi´on es igual con los cambios:

la unidad: 1 porey la operaci´on: ×por;

en particular, las relaciones (13) se escriben:

P(a, b,0) = a P(a, b, n) = P(a, b•b, n/2), sines par P(a, b, n) = P(a•b, b, n−1), sines impar (a, b∈M, n∈N, n >0) (15) y se tiene pb(n) =P(e, b, n), (b∈M, n∈N)

Para implementar (15) es preciso incluir, adem´as de la base y el exponente, la operaci´on binaria (como un procedimiento de dos argumentos) y la unidad e. Por lo dem´as el procedimiento Potenciaes una copia casi exacta del procedimientopot5 de la secci´on previa:

(define (potenciaGeneral base exponente operador unidad)

(do ((a unidad (if (even? n) a (operador a b))) (b base (if (even? n) (operador b b) b))

(n exponente (if (even? n) (/ n 2) (− n 1)))) ((zero? n) a)))

(10)

Ejemplos de uso:

1 En el monoide multiplicativo de los enteros:

> (potenciaGeneral 5 7 * 1)

78125

> (expt 5 7)

78125

2 En el monoide aditivo de los enteros (aqu´ı se dicem´ultiplo en lugar de potencia):

> (potenciaGeneral 123 9876 + 0)

1214748

> (* 123 9876)

1214748

3 En el monoide multiplicativo de los enteros modulo 37. La operaci´on es multiplicaci´on ordinaria de enteros seguida de reducci´on con respecto al m´odulo, 37 en este caso:

> (potenciaGeneral 22 13 (lambda (u v) (remainder (* u v) mod) 1)

17

(define (potenciaModular base exponente mod) (potenciaGeneral base

exponente

(lambda (u v) (remainder (* u v) mod)) 1))

> (potenciaModular 234 567 890)

594

> (potenciaModular −234 567 890)

-594

Obs´ervese que en el ´ultimo ejemplo, utilizando nuestra funci´onPotencia, se obtiene un resultado correcto pero negativo:

(234)567≡ −594(mod 890)

Esta aparente anomal´ıa se debe al funcionamiento de la primitiva remainder de Scheme:

(11)

> (remainder 7 5) 2 > (remainder 7 −5) 2 > (remainder −7 5) -2 > (remainder −7 −5) -2

Como puede verseremainderdevuelve el resto con el signo del dividendo. Si se quiere que los restos sean no negativos, definamos un procedimiento resto que devuelva restos no negativos: (define (resto a b) (let ((r (remainder a b))) (if (>= r 0) r (+ (abs b) r))))

(define (potenciaModular base exponente mod) (potenciaGeneral base

exponente

(lambda (u v) (resto (* u v) mod)) 1))

Ejemplo de uso:

(potenciaModular −22 13 37)

20

Teorema de Fermat. Sipes un entero primo yaes un entero,0≤a < p, entonces

ap ≡a(mod p)

Por tanto, dado un enteron,n >1, si para cualquier enteroa, 1< a < n, ocurre que

an≡a(mod n) entoces nes compuesto.

Referencias

Documento similar

Puesto que la distribución binomial B (n,p) puede considerarse como la suma de variables aleatorias idénticamente distribuidas B (1, p) o variables de Bernoulli, la

Se obtienen todas las ternas primitivas posibles siempre que r,p tengan como divisor común la

El centre, que va passar en gener a formar part de la Xarxa Informàtica de Lectura Pública Valenciana, ha incorporat diverses novetats entre els seus serveis, com ara una ampliació

Dicho plan supone un trabajo de planificación y de análisis definitivo para potenciar las bibliotecas castellano-manchegas, que vienen ya trabajando con iniciativas modernas

|n plus, informa]ia apare \n rom`nq mereu (\n b bo olld d) [i \n valencianq (\n albastru); se oferq de asemenea o transcriere a pronun]q]rii \n valencianq (\n italic)

Que la Subsecretaría de Planificación Ambiental y Desarrollo Sostenible realiza acciones orientadas a promover el desarrollo sostenible de las actividades económicas,

La categoría de los entrelazados no orientados es la categoría donde los objetos son números enteros no negativos, y un morfismo m → n entre los objetos m y n (m, n ∈ Z + ∪ {0})

Ejemplo.. La composici´on de funciones no es una operaci´on conmutativa en general. En algunos textos esta funci´on recibe el nombre de inversa para la multiplicaci´on de f.. Por