Wii! Copado, genial, realmente muy bien, como siempre, un par de críticas constructivas, si me permitis...
1) Comprobar la divisibilidad con los primeros 10.000 primos, te va a tomar bastante tiempo, que realmente no es necesario si utilizas miller rabin. Las comprobaciones que deberías hacer para eliminar rápidamente números compuestos triviales son:
Si es par (num%2 == 0) y si es "2" o menor a "2" (1, 0 o negativos).
Si es par, la respuesta seria obviamente que no es primo, la comprobación de paridad se debe hacer despues de comprobar si es igual a "2" ya que "2" es par y primo (el unico caso). "0" y "1" son valores inválidos o no primos (ya que las condiciones necesarias para que un número sea primo es que sea divisible por 1 y por si mismo, en caso de "1" si mismo es igual a "1" asi que no tiene sentido y "0" no es divisible por si mismo). Si es "2" entonces es primo.
Probar con los primeros 10000 primos, va a disminuir mucho tu cálculo de primos por segundo.
2) Quizas convendría que el número aleatorio, no sea mayor a 1000 o a 500, para disminuir tiempo de cálculo. Total, solo necesitas a lo sumo 10 números.
3) No entendí muy bien algunas partes del código, las tendría que ver con mayor detenimiento, pero quiero ver si entendiste bien el algoritmo, porque me suena que hay algo que no está bien:
a) Si a^d mod n != 1 y != -1 (esto significa n -1). Entonces n es probablemente primo.
b) Hay que probar todos los a^(d^(2*s)) mod n. Siendo "s" la variable que va desde 1 hasta las veces que lo dividiste. Vas incrementando "s" hasta que de -1 o hasta que llegues a las veces que lo dividiste. Si te dio -1 alguna de las potencias, es probablemente primo, sino, es compuesto.
PD: La próxima utilizá los tags [code=cpp
1) Comprobar la divisibilidad con los primeros 10.000 primos, te va a tomar bastante tiempo, que realmente no es necesario si utilizas miller rabin. Las comprobaciones que deberías hacer para eliminar rápidamente números compuestos triviales son:
Si es par (num%2 == 0) y si es "2" o menor a "2" (1, 0 o negativos).
Si es par, la respuesta seria obviamente que no es primo, la comprobación de paridad se debe hacer despues de comprobar si es igual a "2" ya que "2" es par y primo (el unico caso). "0" y "1" son valores inválidos o no primos (ya que las condiciones necesarias para que un número sea primo es que sea divisible por 1 y por si mismo, en caso de "1" si mismo es igual a "1" asi que no tiene sentido y "0" no es divisible por si mismo). Si es "2" entonces es primo.
Probar con los primeros 10000 primos, va a disminuir mucho tu cálculo de primos por segundo.
2) Quizas convendría que el número aleatorio, no sea mayor a 1000 o a 500, para disminuir tiempo de cálculo. Total, solo necesitas a lo sumo 10 números.
3) No entendí muy bien algunas partes del código, las tendría que ver con mayor detenimiento, pero quiero ver si entendiste bien el algoritmo, porque me suena que hay algo que no está bien:
a) Si a^d mod n != 1 y != -1 (esto significa n -1). Entonces n es probablemente primo.
b) Hay que probar todos los a^(d^(2*s)) mod n. Siendo "s" la variable que va desde 1 hasta las veces que lo dividiste. Vas incrementando "s" hasta que de -1 o hasta que llegues a las veces que lo dividiste. Si te dio -1 alguna de las potencias, es probablemente primo, sino, es compuesto.
PD: La próxima utilizá los tags [code=cpp