Dos personas respondieron la pregunta y ambas son una solución demasiado ingenua.
Hay muchos algoritmos disponibles para pruebas principales.
1. Pequeño teorema de Fermat.
2. Pruebas Miller Rabin.
y muchos más.
Aquí Miller Rabin está disponible en varios idiomas.
Prueba de primalidad de Miller-Rabin
Aquí explicaré a Miller Rabin.
Prueba de primalidad de Miller-Rabin
Ideas y conceptos clave
- Según el pequeño teorema de Fermat, si p es un número primo y a es un número entero positivo menor que p, entonces
a ^ p = a (mod p) o alternativamente: a ^ (p-1) = 1 (mod p) - Si p es primo y x ^ 2 = 1 (mod p), entonces x = +1 o -1 (mod p). Podríamos probar esto de la siguiente manera: x ^ 2 = 1 (mod p) x ^ 2 – 1 = 0 (mod p)
- (x-1) (x + 1) = 0 (mod p)
Ahora bien, si p no divide tanto (x-1) como (x + 1) y divide su producto, entonces no puede ser un primo, lo cual es una contradicción. Por lo tanto, p dividirá (x-1) o dividirá (x + 1), entonces x = +1 o -1 (mod p).
Supongamos que p – 1 = 2d * s donde s es impar yd> = 0. Si p es primo, entonces, ya sea como = 1 (mod p) como en este caso, la cuadratura repetida de como siempre producirá 1, entonces (a (p-1))% p será 1; o a (s * (2r)) = -1 (mod p) para alguna r tal que 0 <= r <d, ya que la cuadratura repetida siempre dará 1 y finalmente a (p-1) = 1 (mod p ) Si ninguno de estos es cierto, a (p-1) no será 1 para ningún número primo a (de lo contrario, habrá una contradicción con el hecho # 2).
La complejidad es el número de O (iteraciones * log n);
- ¿Por qué tomó tanto tiempo demostrar la conjetura de que las matemáticas elípticas son duales a las matemáticas modulares?
- ¿En qué otras formas puedo escribir a ^ n + b ^ n y a ^ n – b ^ n?
- Si el término Mth de un GP es N y el término Nth es M, ¿cuál sería el término (M + N)?
- ¿Cuál es el número total de divisores de 600?
- ¿A qué magnitud podemos decir que el recuento primo por intervalo cuadrático disminuirá absolutamente?
y este algoritmo funcionará para grandes números 10 ^ 18.
Espero que esto ayude.
#include #include long long mul(long long a,long long b,long long c); long long mod(long long a,long long b,long long c){ long long x=1,y=a; while(b > 0){ if(b%2 == 1){ x=mul(x,y,c); } y = mul(y,y,c); b /= 2; } return x%c; } long long mul(long long a,long long b,long long c){ long long x = 0,y=a%c; while(b > 0){ if(b%2 == 1){ x = (x+y)%c; } y = (y*2)%c; b /= 2; } return x%c; } int Miller(long long p,long long it){ if(p<2){ return 0; } if(p!=2 && p%2==0){ return 0; } long long s=p-1; while(s%2==0){ s/=2; } long long i; for(i=0;i<it;i++){ long long a=rand()%(p-1)+1,tt=s; long long md=mod(a,tt,p); while(tt!=p-1 && md!=1 && md!=p-1){ md=mul(md,md,p); tt *= 2; } if(md!=p-1 && tt%2==0){ return 0; } } return 1; } int main() { long long test , n; scanf("%lld" , &n); int fl = Miller(n , 20); if(fl) printf("YES number is Prime\n"); else printf("NO Number is not Prime\n"); return 0; }