Estudia como varía la densidad de números primos según se avanza en la lista de números primos. Para ello:
Escribe una función multiple(m, n) que devuelva True si el entero m es un múltiplo del entero n (y False en caso contrario).
Escribe una función prime(n) que devuelva True si n es un número primo.
Escribe una función primes(n) que devuelva una lista con todos los primos entre 1 y n.
Escribe una función prime_plot(upto) que dibuje una gráfica con la distancia entre un primo y el anterior en función del valor del primo (para todos los primos menores que upto).
Dibuja un histograma con los números primos entre 0 y un valor máximo. Para ello sigue los siguientes pasos:
Construye una función bins(L, nbins) que, para una lista L de valores no negativos y un número nbins de divisiones, devuelva una lista H de longitud nbins que contenga en H[i] el número de valores de L comprendidos entre (i * m) / nbins y ((i + 1) * m)/nbins, siendo m el valor máximo en L. Por ejemplo, si nbins = 2, H[0] es el número de valores entre 0 y m/2 y H[1] el número de valores en L entre m/2 y m.
Escribe una función histogram(L, nbins) que dibuje un histograma con los valores de una lista L agrupados en nbins intervalos.
Escribe una función prime_histogram(upto) que dibuje un histograma de los primos entre 0 y upto.
Estudia cuántos números primos empiezan por un dígito particular, siguiendo los siguientes pasos:
Escribe una función first_digit(n) que devuelva el primer dígito del entero n.
Escribe una función prime_first_digits(n) que devuelva una lista con los dígitos iniciales de todos los primos entre 1 y n.
Escribe una función stat(L) que dado la lista L devuelva un diccionario que asocie a cada valor en L el número de veces que aparece en la lista.
Escribe una función plot_map(mymap) que, dado un diccionario mymap que asocia enteros con enteros, dibuje una gráfica con un punto (x,y) por cada par de enteros del diccionario, es decir, y = mymap[x].
Haz que la función anterior se superponga la curva predicha por la ley de Benford.
Se coloca una fila de monedas de distintos valores sobre la mesa para que dos jugadores vayan tomado alternativamente cualquiera de las que se encuentra en los extremos de la fila. Queremos saber cuál es la cantidad máxima que obtendrá cada jugador. Para ello:
Escribe una fórmula v(L) que, para un vector L=(L1,L2,...,Ln), exprese el valor total de las monedas que puede conseguir el jugador que juega en primer lugar en función de L y del mejor resultado posible para el adversario. Considera separadamente el caso en el que tome L1 y el caso en que elige Ln. Analiza también en qué casos el problema tiene una solución trivial.
Implementa una función money(L) que devuelva el valor máximo de las monedas que puede conseguir el jugador al que le corresponde jugar si en la mesa hay una fila de n monedas de valores [L1,L2,...,Ln].
Mejora la implementación para que el tiempo de cálculo no crezca exponencialmente en función de n.
Explica cómo se puede modificar al función anterior para que, además del valor obtenido, retorne a qué selección de monedas corresponde dicho valor. La respuesta debe ser una lista de n valores booleanos (True o False).