<jupyter_start><jupyter_text>Ejercicio1Define (5 puntos) una funci&oacute;n de SAGE $frecuencia\_fib(N)$ que tenga como argumento un entero $N$ y devuelva la lista de frecuencias de cada uno de los d&iacute;gitos (1,2,3,4,5,6,7,8,9) como d&iacute;gito dominante (i.e. el primero por la izquierda) de los n&uacute;meros en la sucesi&oacute;n de Fibonacci que empezando en $1$&nbsp; tiene&nbsp; longitud $N$. Representa (1 punto) gr&aacute;ficamente las frecuencias obtenidas. Trata de programar esta funci&oacute;n de la forma m&aacute;s eficiente posible. Denotemos por $F$ la lista que devuelve $frecuencia\_fib(20000)$. Compara (1 punto), usando una funci&oacute;n de SAGE, los valores $F[i]$ con los n&uacute;meros&nbsp; $B[i]:=log_{10}(1+\frac{1}{i+1})$.&nbsp; Decimos que una sucesi&oacute;n cumple la "<NAME>" si la frecuencia del d&iacute;gito $i$ como d&iacute;gito dominante en los t&eacute;rminos de la sucesi&oacute;n es, con "muy buena aproximaci&oacute;n",&nbsp; $B[i].$Modifica (2 puntos) la funci&oacute;n del apartado $1$ para calcular las mismas frecuencias pero para la sucesi&oacute;n de potencias $2^j$ con $j$ recorriendo los enteros en el intervalo $[1,N]$. &iquest;Qu&eacute; observas al calcular las frecuencias con $N=20000$?Modifica (1 punto) la funci&oacute;n del apartado $2$ para calcular las mismas frecuencias pero para  la sucesi&oacute;n de enteros en el  intervalo $[1,N]$, y tambi&eacute;n para la sucesi&oacute;n de&nbsp; cuadrados&nbsp; $j^2$ con $j$ recorriendo los enteros en el  intervalo $[1,N]$. &iquest;Qu&eacute;&nbsp; observas al calcular las frecuencias con $N=20000$?La "<NAME>" se cumple para muchas sucesiones generadas mediante una expresi&oacute;n matem&aacute;tica (NO para todas), y para muchas sucesiones de datos num&eacute;ricos obtenidos del mundo real, por ejemplo, mediante estad&iacute;sticas. &iquest;Cu&aacute;l puede ser la &nbsp; diferencia fundamental entre sucesiones que cumplen bien la Ley <NAME> y las que la cumplen medio bien o no la cumplen?Apartado 1En esta primera celda comprobamos una l&iacute;nea que produce los d&iacute;gitos dominantes de los primeros nueve n&uacute;meros de fibonacci.<jupyter_code>L = [(fibonacci(j)).digits()[-1:][0] for j in srange(1,10)];L<jupyter_output><empty_output><jupyter_text>Empezamos con la lista $L$ de longitud nueve que va a almacenar las frecuencias como una lista de ceros, y para cada $j$ entero en el intervalo $[1,N]$ calculamos el d&iacute;gito dominante del n&uacute;mero de Fibonacci $j$-&eacute;simo e incrementamos la frecuencia del d&iacute;gito resultante en $1/N$. As&iacute; la frecuencia del uno es el primer elemento ($L[0]$) en la lista $L$, una vez que ha terminado el bucle, la frecuencia del dos el segundo ($L[1]$), etc.<jupyter_code>def frecuencia_fibon(N):
    L = [0]*9
    for j in xrange(1,N):
        k = ((fibonacci(j)).digits())[-1:][0]
        L[k-1] += (1/N).n()
    return L
time L = frecuencia_fibon(20000);L
bar_chart(L)<jupyter_output><empty_output><jupyter_text>Apartado 2<jupyter_code>B = [log((1+1/(i+1)),base=10).n() for i in srange(9)];B
DIF = [L[j]-B[j] for j in srange(9)];DIF<jupyter_output><empty_output><jupyter_text>La aproximaci&oacute;n es bastante buena: en todos los casos al menos $4$ cifras decimales iguales. Incluso, podr&iacute;a ocurrir que con $N$ mayores la aproximaci&oacute;n mejorara.Apartado 3<jupyter_code>def frecuencia_pot(N):
    L = [0]*9
    for j in xrange(1,N):
        k = (Integer(2^j).digits())[-1:][0]
        L[k-1] += (1/N).n()
    return L
time L2 = frecuencia_pot(20000);L2<jupyter_output>CPU times: user 6.26 s, sys: 40 ms, total: 6.3 s
Wall time: 6.26 s<jupyter_text>Las frecuencias son muy similares a las producidas para la sucesi&oacute;n de Fibonacci y cumplen muy bien la Ley de Benford:<jupyter_code>DIF2 = [L2[j]-B[j] for j in srange(9)];DIF2<jupyter_output><empty_output><jupyter_text>Apartado 4<jupyter_code>def frecuencia_cuadr(N):
    L = [0]*9
    for j in xrange(1,N):
        k = (Integer(j^2).digits())[-1:][0]
        L[k-1] += (1/N).n()
    return L
time L3 = frecuencia_cuadr(20000);L3
bar_chart(L3)
DIF3 = [L3[j]-B[j] for j in srange(9)];DIF3
def frecuencia_enteros(N):
    L = [0]*9
    for j in xrange(1,N):
        k = (Integer(j).digits())[-1:][0]
        L[k-1] += (1/N).n()
    return L
time L4 = frecuencia_enteros(20000);L4
bar_chart(L4)
DIF4 = [L4[j]-B[j] for j in srange(9)];DIF4
L5 = frecuencia_enteros(10000);print L5<jupyter_output>[0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002, 0.111100000000002]
{'fraction_non_alphanumeric': 0.13415424497731693, 'fraction_numerical': 0.06372866709872543, 'mean_word_length': 5.395027624309392, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 9, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '302969', 'license': 'Apache-2.0', 'n_tokens_mistral': 2077, 'n_tokens_neox': 1882, 'n_words': 525, 'path': '2_Curso/Laboratorio/SAGE-noteb/IPYNB/MISCE/128-Ley-de-Benford.ipynb', 'repo_name': 'AlejandroSantorum/Apuntes_Mat_IngInf', 'size': '4649'}