<jupyter_start><jupyter_text>MAT281 - Laboratorio N°01   Problema 01 a) Calcular el número $\pi$En los siglos XVII y XVIII, <NAME> y <NAME> descubrieron una serie infinita que sirve para calcular $\pi$:$$\displaystyle \pi = 4 \sum_{k=1}^{\infty}\dfrac{(-1)^{k+1}}{2k-1} = 4(1-\dfrac{1}{3}+\dfrac{1}{5}-\dfrac{1}{7} + ...) $$Desarolle un programa para estimar el valor de $\pi$ ocupando el método de Leibniz, donde la entrada del programa debe ser un número entero $n$ que indique cuántos términos de la suma se utilizará.* **Ejemplo**: *calcular_pi(3)* = 3.466666666666667, *calcular_pi(1000)* = 3.140592653839794  Definir Función<jupyter_code>def calcular_pi(n:int)->float:
    
    """
    calcular_pi(n)

    Aproximacion del valor de pi mediante el método de Leibniz

    Parameters
    ----------
    n : int
        Numero de terminos.

    Returns
    -------
    output : float
        Valor aproximado de pi.
        
    Examples
    --------
    >>> calcular_pi(3)
    3.466666666666667
    
    >>> calcular_pi(1000) 
    3.140592653839794
    """
    
    pi = 0 # valor incial 
    for k in range(1,n+1):
        numerador = (-1)**(k+1) # numerador de la iteracion i
        denominador = 2*k-1  # denominador de la iteracion i
        pi+=numerador/denominador # suma hasta el i-esimo termino
    
    return 4*pi
# Acceso a la documentación
help(calcular_pi)<jupyter_output>Help on function calcular_pi in module __main__:

calcular_pi(n: int) -> float
    calcular_pi(n)
    
    Aproximacion del valor de pi mediante el método de Leibniz
    
    Parameters
    ----------
    n : int
        Numero de terminos.
    
    Returns
    -------
    output : float
        Valor aproximado de pi.
        
    Examples
    --------
    >>> calcular_pi(3)
    3.466666666666667
    
    >>> calcular_pi(1000) 
    3.140592653839794<jupyter_text>Verificar ejemplos<jupyter_code># ejemplo 01
assert calcular_pi(3) == 3.466666666666667, "ejemplo 01 incorrecto"
# ejemplo 02
assert calcular_pi(1000) == 3.140592653839794, "ejemplo 02 incorrecto"<jupyter_output><empty_output><jupyter_text>**Observación**:* Note que si corre la línea de comando `calcular_pi(3.0)` le mandará un error ... ¿ por qué ?* En los laboratorio, no se pide ser tan meticuloso con la documentacion.* Lo primero es definir el código, correr los ejemplos  y  luego documentar correctamente.  b) Calcular el número $e$Euler realizó varios aportes en relación a $e$, pero no fue hasta 1748 cuando publicó su **Introductio in analysin infinitorum** que dio un tratamiento definitivo a las ideas sobre $e$. Allí mostró que:En los siglos XVII y XVIII, <NAME> y <NAME> descubrieron una serie infinita que sirve para calcular π:$$\displaystyle e = \sum_{k=0}^{\infty}\dfrac{1}{k!} = 1+\dfrac{1}{2!}+\dfrac{1}{3!}+\dfrac{1}{4!} + ... $$Desarolle un programa para estimar el valor de $e$ ocupando el método de Euler, donde la entrada del programa debe ser un número entero $n$ que indique cuántos términos de la suma se utilizará.* **Ejemplo**: *calcular_e(3)* =2.5, *calcular_e(1000)* = 2.7182818284590455  Definir función<jupyter_code>def calcular_e(n:int):
    
    if n == 1: #1 termino de suma
        e = 1
    
    if n == 2: #2 terminos de suma
        e = 2
        
    if n >= 3: #3 o mas terminos de suma
        e = 2
        factorial = 1 #def de factorial
        for k in range(2,n): #se suma hasta el termino n-1 de pasos, si fuera n+1 se sumaria hasta n pero la suma de e parte desde 0
            factorial = factorial*k #recursion
            suma = 1/factorial
            e = e+suma
    return e

print(calcular_e(100))<jupyter_output>2.7182818284590455<jupyter_text>Verificar ejemplos<jupyter_code># ejemplo 01
assert calcular_e(3) == 2.5, "ejemplo 01 incorrecto"
# ejemplo 02
assert calcular_e(1000) ==  2.7182818284590455, "ejemplo 02 incorrecto"<jupyter_output><empty_output><jupyter_text>Problema 02Sea $\sigma(n)$ definido como la suma de los divisores propios de $n$ (números menores que n que se dividen en $n$).Los [números amigos](https://en.wikipedia.org/wiki/Amicable_numbers) son  enteros positivos $n_1$ y $n_2$ tales que la suma de los divisores propios de uno es igual al otro número y viceversa, es decir, $\sigma(n_1)=\sigma(n_2)$ y $\sigma(n_2)=\sigma(n_1)$.Por ejemplo, los números 220 y 284 son números amigos.* los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110; por lo tanto $\sigma(220) = 284$. * los divisores propios de 284 son 1, 2, 4, 71 y 142; entonces $\sigma(284) = 220$.Implemente una función llamada `amigos` cuyo input sean dos números naturales $n_1$ y $n_2$, cuyo output sea verifique si los números son amigos o no.* **Ejemplo**: *amigos(220,284)* = True, *amigos(6,5)* = False  Definir Función<jupyter_code>def amigos(n1:int, n2:int):
    suma1 = 0 #definicion de las cantidades a sumar
    suma2 = 0
    
    for i in range(1,n1+1):
        if n1%i == 0: #Verificador de divisores propios
            suma1 = i+suma1 #Se agrega a la suma si es divisor propio
    
    for i in range(1,n2+1):
        if n2%i == 0: #Verificador de divisores propios
            suma2 = i+suma2 #Se agrega a la suma si es divisor propio
    
    if suma1==suma2: #Son amigos si ambas sumas son iguales 
        return True
    
    else: #Caso contrario no lo son
        return False<jupyter_output><empty_output><jupyter_text>Verificar ejemplos<jupyter_code># ejemplo 01
assert amigos(220,284) == True, "ejemplo 01 incorrecto"
# ejemplo 02
assert amigos(6,5) == False, "ejemplo 02 incorrecto"<jupyter_output><empty_output><jupyter_text>Problema 03La [conjetura de Collatz](https://en.wikipedia.org/wiki/Collatz_conjecture), conocida también como conjetura $3n+1$ o conjetura de Ulam (entre otros nombres), fue enunciada por el matemático <NAME> en 1937, y a la fecha no se ha resuelto.Sea la siguiente operación, aplicable a cualquier número entero positivo:* Si el número es par, se divide entre 2.* Si el número es impar, se multiplica por 3 y se suma 1.La conjetura dice que siempre alcanzaremos el 1 (y por tanto el ciclo 4, 2, 1) para cualquier número con el que comencemos. Implemente una función llamada `collatz` cuyo input sea un número natural positivo $N$ y como output devulva la secuencia de números hasta llegar a 1.* **Ejemplo**: *collatz(9)* = [9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]  Definir Función<jupyter_code>def collatz(N:int):
    paso = N #paso inicial
    numeros = [N] #lista donde se guardaran los numeros recorridos 
    while paso != 1:
        
        if paso%2 == 0: #Verificacion si el numero en el que estamos es par
            paso = paso//2 #Calculo del paso
            numeros.append(paso) #Se agrega a la lista de pasos
        
        else: #Si no es par, es impar 
            paso = paso*3 + 1 #Calculo del paso
            numeros.append(paso) #Se agrega a la lista de pasos
       
    return numeros 
### Verificar ejemplos
# ejemplo 01
assert collatz(9) == [9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1], "ejemplo 01 incorrecto"<jupyter_output><empty_output><jupyter_text>Problema 04La [conjetura de Goldbach](https://en.wikipedia.org/wiki/Goldbach%27s_conjecture) es uno de los problemas abiertos más antiguos en matemáticas. Concretamente, <NAME>, en 1921, en su famoso discurso pronunciado en la Sociedad Matemática de Copenhague, comentó que probablemente la conjetura de Goldbach no es solo uno de los problemas no resueltos más difíciles de la teoría de números, sino de todas las matemáticas. Su enunciado es el siguiente:$$\textrm{Todo número par mayor que 2 puede escribirse como suma de dos números primos - <NAME> (1742)}$$Implemente una función llamada `goldbach` cuyo input sea un número natural positivo $N$ y como output devuelva la suma de dos primos ($N1$ y $N2$) tal que: $N1+N2=N$.  * **Ejemplo**: goldbash(4) = (2,2), goldbash(6) = (3,3) , goldbash(8) = (3,5)  Definir función<jupyter_code>def goldbach(N:int):
    if N == 2:
        return "Error"
    suma = 0 #cantidad a comparar
    primos = [2] #lista para guardar numeros primos
    N1 = 0 
    N2 = 0
    
    for i in range(3,N+1): #ciclo para encontrar todos los numeros primos entre 3 y N
        for j in range(2,i): #comparacion numero a numero
            if (i % j) == 0: #si i tiene un divisor, no es primo
                break 
        else: #si no tiene divisores, i es un numero primo y se agrega a la lista
            primos.append(i)
    
    for i in primos: #ciclo para encontrar la suma de primos que de N
        for j in primos: #se fija un numero en la lista y se recorre denuevo
            if (i+j) == N: #si se encuentra una suma de primos que de N, se asignan a N1 y N2 los primos correspondientes
                N1 = j
                N2 = i
                break
    
    return((N1,N2)) #se devuelven los primos encontrados en forma de tupla<jupyter_output><empty_output><jupyter_text>Verificar ejemplos<jupyter_code># ejemplo 01
assert  goldbach(4) == (2,2), "ejemplo 01 incorrecto"
# ejemplo 02
assert goldbach(6) == (3,3), "ejemplo 02 incorrecto"
# ejemplo 03
assert goldbach(8) == (3,5), "ejemplo 03 incorrecto"
#<NAME>; ROL: 201610519-0
import time
start_time = time.time()
print(goldbach(1000000))
print("--- %s seconds ---" % (time.time() - start_time))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10680650684931507, 'fraction_numerical': 0.06142979452054795, 'mean_word_length': 3.234254644313548, 'pattern_counts': {'":': 0, '<': 43, '<?xml version=': 0, '>': 58, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 4, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '4491', 'license': 'MIT', 'n_tokens_mistral': 3738, 'n_tokens_neox': 3342, 'n_words': 1162, 'path': 'labs/lab_01_Cristobal_Lobos.ipynb', 'repo_name': 'CristobalLobos/MAT281_Portafolio_CristobalLobos', 'size': '9413'}