Sie sind auf Seite 1von 7

Problemas propuestos

Los nmeros combinatorios, mejor conocidos como coeficientes binomiales, provienen de dos mbitos. La primera de ellas es la combinatoria:
responde a cuntos conjuntos de k elementos distintos podemos
hacer si

tenemos n elementos. A este nmero se le denota por nk . Por otro lado,
aparecen en el desarrollo del binomio de Newton
!
n
X
n k nk
n
(x + y) =
x y
k
k =0

La definicin usual es la siguiente:


!
n
n!
=
k
k!(n k)!
Con esta definicin podemos escribir el siguiente programa
from math import factorial
def choose(n,k):
"""
choose(n,k) computes the binomial coefficient
INPUT > two positive integer numbers
OUTPUT > an integer number
"""
return factorial(n)/(factorial(k)*factorial(n-k))

Es evidente que este clculo de los coeficientes binomiales no parece


ser muy eficiente.
1. En el cdigo anterior, el programa calcula k!, (n k!)! y n!. Es fcil ver
que se pueden usar los clculos de uno para calcular los dems: vamos multiplicando los nmeros enteros desde 1 hasta n y en proceso
obtenemos tanto k! como (n k)!. Usar esta estrategia para elaborar
un cdigo ms eficiente.

2. Existe frmulas recursivas para los coeficientes binomiales que podran usarse para calcularlos. En este caso, usamos que
!
!
!
n
n1
n1
=
+
k
k
k 1


con k0 = kk = 1 para cualquier k. Usa estas frmulas para escribir una funcin recursiva que calcule los coeficientes binomiales.
Sabras reprogramar el cdigo para evitar la recursin usando esta
frmula?

3. Supongamos que k > n k. La fraccin que define a nk permite
simplificar a
!
n
n(n 1) (k + 1)
=
(1)
k
(n k) 2 1
Usa esta simplificacin para escribir otro cdigo que calcule el coeficiente binomial.
4. Se puede reescribir (1) como
! Y
k
n
n +1i
.
=
i
k
i=1
Inspirados en este producto, pensamos que es posible escribir el siguiente cdigo
def binomial(n,k):
bin_coeff=1
for i in range(1,k+1):
# Running the integer numbers from 1 to k
bin_coeff*=(n+1-i)/i
return bin_coeff

Pero cuando calculamos binomial(4,3) nos encontramos con que la


computadora devuelve 0, qu es lo que ocurre? por qu razn falla
el cdigo? Sabras qu hay que hacer para arreglar el cdigo?

Page 2

5. Es posible conocer el tiempo que tarda la computadora en realizar los


clculos: existe una librera conocida como time donde te calcula la
diferencia de tiempo entre dos puntos. Por ejemplo, en el cdigo
import time
start
print
end =
print

= time.time()
"hello"
time.time()
end - start

muestra cunto tiempo tarda (en segundos) en imprimir por pantalla


la palabra hello. Toma una serie de casos donde los valores de n y k se
incrementen y crea una lista con los diferentes tiempos que tarda en
calcular el coeficiente binoamial para cada una de las funciones que
has creado para tal propsito. Cul de todos ellos es ms eficiente?
Recordamos la definicin de nmero primo: un nmero entero positivo
n 2 es primo (o irreducible) si los nicos divisores positivos que tiene
son 1 y n. Decidir si un nmero entero es primo o no siguen siendo, a da
de hoy, objeto de estudio. Si el nmero es bajo, cualquier computadora de
hoy en da podra dar una respuesta con un adecuado algoritmo, pero no
as con nmeros con ms de 200 dgitos. No es nuestro propsito crear
un algoritmo que resuelva el problema, pero s escribir algn que otro
algoritmo.
6. A partir de la definicin de nmero primo, escribe una funcin que
devuelva True o False dependiendo si el nmero es primo o no. Es
necesario comprobar con todos los nmeros k = 2, . . . ,n 1 si es o
no divisor de n?
7. Dado un nmero entero positivo n, escribe una funcin que te devuelva una lista con los n primeros nmeros primos.
8. Dado un nmero entero positivo, escribe un programa que devuelva
la factorizacin de n. Dicha factorizacin puede almacenarse en una

Page 3

lista que contenga todos los primos que divida a n repetidos segn su
multiplicidad.
La funcin de Euler o funcin indicatriz de Euler se define sobre los
nmeros naturales. Dado n, (n) es el nmero de enteros menores o iguales
a n que son coprimos1 a n.
9. Escribe una funcin que, dado n entero positivo, calcule (n) a partir
de la definicin. Usa para ello el algoritmo del mximo comn divisor
que aqu presentamos:
def gcd(a, b):
"""Calculate the Greatest Common Divisor of a and b.
Unless b==0, the result will have the same sign as b (so
that when b is divided by it, the result comes out
positive).
"""
while b:
a, b = b, a %b
return a

Asimismo explica porqu razn este algoritmo del mximo comn


divisor funciona.
La funcin de Euler tiene una serie de propiedades importantes
1. (a b) = (a)(b) si a y b son coprimos.
2. Si a y b no son coprimos, entonces la frmula aparece un factor:
d
(a b) = (a)(b) (d
) donde d es el mximo comn divisor de a
y b.
3. (nr ) = nr 1(n) para cualquier n y r positivos.
10. Deduce a partir de las propiedades anteriores que si la descomposicin en factores primos de n es
n = p1k1 p2k2 prkr ,

Page 4

entonces
(n) = (p1 1)p1k1 1 (p2 1)p2k2 1 (pr 1)prkr .

(2)

11. Dado un nmero entero n, escribe una funcin que te devuelva (n)
usando la frmula del problema anterior.
12. Tambin existe otra frmula:
(n) = n

Y
p|n

1
p

donde el smbolo p|n debe leerse p divide a n. Escribe una funcin


en Python que, dado un entero positivo, calcule (n) usando esta frmula.
Sea la siguiente sucesin. Dado el primer trmino de la sucesin x 0 , que
debe ser un entero positivo, definimos la sucesin de manera recursiva
como sigue

x n1 /2
si x n1 es par,
xn =
3x n1 + 1 si x n1 es impar.

Si x 0 = 12, entonces los siguientes trminos de la sucesin seran


12, 6, 3, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, . . .
Si x 0 = 11, tendramos la sucesin
11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, . . .
Observamos que en ambos casos acabamos repitiendo la misma secuencia
4, 2, 1, 4, 2, 1, . . . La conjetura de Collatz afirma que partiendo de cualquier
x 0 , la sucesin siempre acabar en algn momento repitiendo esta secuencia. Como toda conjetura, actualmente no est demostrado que eso
suceda realmente.
13. Escribe un programa que dado el primer trmino de la sucesin x 0 y
un entero n, la funcin devuelva los primeros n trminos de la sucesin.

Page 5

14. Si la conjetura de Collatz es cierta, dado un x 0 entero positivo existir


un N tal que x N sea el primer elemento de la sucesin que vale 1.
Escribe un programa que dado el trmino inicial de la sucesin x 0
devuelva dicho N .
15. Observamos el siguiente hecho: la sucesin acaba en la secuencia
4, 2, 1, . . . en el momento en el que algn trmino de la sucesin x N
sea 2r para algn r . Por ejemplo, en el caso de x 0 = 11, el trmino
x 10 = 16 = 24 . Escribe una funcin para que, dado el trmino inicial,
devuelva la potencia ms grande de 2 que forma parte de la sucesin.
Qu conclusiones sacas?
Nuestra notacin numrica es posicional: si escribimos 143, lo que realmente estamos escribiendo es
1 102 + 4 101 + 3 100 ;
tambin 4106 = 4103 +1102 +0101 +6100 . Decimos que la base de nuestra numeracin es 10. De este modo, los dgitos van desde 0 hasta 9. Sin
embargo, los ordenadores escriben sus nmeros en base 2 y por lo tanto
slo maneja dos dgitos: el 0 y el 1. En este sentido, para un ordenador el
nmero 100101 es 37:
100101 = 1 25 + 0 24 + 0 23 + 1 22 + 0 21 + 1 20 = 32 + 4 + 1 = 37
16. Sea b 2. Escribe un programa en el que dado un nmero n, devuelva
una lista con los dgitos correspondientes al nmero escrito en base b.

Page 6


n
Dados x y n, existe una forma de
aproximar x. Por ejemplo, se sabe
que los babilonios aproximaron 2 mediante el siguiente procedimiento:
comenzaban con un nmero, pongamos por ejemplo 2, y definimos la
sucesin de manera recursiva
2x n
x n2 2

donde x 0 = 2; dicha sucesin converge a 2. Si queremos calcular la raz


cuadrada de a, la sucesin sera
x n+1 = x n

x n+1 = x n

x n2 a
2x n

con x 0 = a.
17. Escribe una funcin en Python que calcule la raz cuadrada de un
nmero x dado. El problema es dar un test de parada, es decir, dar una
condicin para que el programa termine y d un resultado. En este
caso, puedes tomar que |x n x n+1 | sea menor que un nmero pequeo
(digamos 106 ) y, al ocurrir esto, la computadora te devuelve x n+1 .
Es posible generalizar este mtodo para calcular la raz k-sima de un
nmero a R. Slo hay que modificar la sucesin a
x n+1 = x n

x nk a
kx nk1

donde
x 0 = a, aunque se puede tomar uno ms cercano al valor aproximado n a.
18. Escribe una funcin anloga al anterior donde calcule la raz k-sima
de un nmero a. El test de parada seguira siendo el mismo.

Page 7

Das könnte Ihnen auch gefallen