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.
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.