Semana 16

Semana 16

de ROCUMPAJ DANILO -
Número de respuestas: 1

Buen día,

Lamentablemente no me pude conectar el Jueves proximo pasado que era donde se iba a discutir sobre el ejercicio de la Semana 16.

Estoy tratando de "automatizar" (por placer propio) lo mas que pueda el ejercicio y me surgieron dos dudas que tal vez me puedan ayudar:

  1. ¿Cómo puedo acceder a la posición en una lista sabiendo que elemento busco?. Es decir, tengo una lista de nombre y busco en qué posición esta "pedro", el comando "inverso" a lista[6]
  2. Al utilizar el comando factor(n) devuelve los factores primios, ¿es posible guardar en dos variables distintas estos valores? Ejemplo factor(22) = 11 * 2; de alguna forma guardar en variables distintas variables cada factor (sin hacerlo a mano)

Y con respecto al tema en si,

¿El comando factor(n) es el que es imposible ejecutar en un tiempo aceptable en una situación real (60000 digitos o mas)? ¿sucede los mismo con el comando inverse_mod(a,b)?


Adjunto el archivo de CoCalc que estoy haciendo.

Saludos y Gracias

En respuesta a ROCUMPAJ DANILO

Re: Semana 16

de CHARA MARIA DE LOS ANGELES -
Hola Danilo,

Con respecto a tu pregunta 1) el comando que te encuentra la primera aparición de un elemento en una lista es .index() poniendo adelante el nombre de tu lista. Si por ejemplo defino milista='nos vemos mañana' y pregunto por milista.index('v') me devolverá 4, pues la primera n está en posición 0, el primer espacio en blanco está en la posición 3 y la 'v' está en la posición 4. Pero si quiero hacer lo mismo con la 'n' me dará 0, que es la primera aparición solamente. Si quiero todas las apariciones de la 'n' debería hacer algo como [posi for posi, x in enumerate(milista) if x == 'n'] y eso me devolverá la lista [0, 14] con las dos apariciones de la 'n'. Este último funciona también para el caso en que el elemento no esté en la lista, devolviendo la lista vacía (no como en el caso de .index( ) que devolvería un error)

Con respecto a tu segunda pregunta, si uno directamente pregunta por factor(n) te muestra los dos factores pero internamente lo que calcula es cada factor y su exponente, así si querés la lista de los factores primos de 22 podés hacer [p for p, e in factor(22)] y eso te devuelve la lista con el 2 y el 11. ( o [[p,e] for p, e in factor(22)] para una lista donde cada elemento es la lista con el factor y el exponente)

Finalmente, con respecto a tu pregunta final, una clave real tendría aproximadamente 600 dígitos decimales y no podría usarse el comando factor para encontrar los factores (excepto en casos muy especiales); sin embargo, el inverso sí puede calcularse rápidamente para ese nivel de clave y mayores. El algoritmo para calcular el inverso está basado en el algoritmo de la división de Euclides que corre en tiempo polinomial, por lo que es muy rápido. También el cálculo de potencias módulo n se puede hacer muy rápido. Por eso se elige ese mecanismo para encriptar y por eso es difícil de quebrar.