Introduction / Contexte
Lors d'une récente discussion dans le chat crypto, j'ai été mis au défi de discuter / aider avec le test de primalité de Fermat et les nombres de Carmichael. Ce test est basé sur la prémisse qui a^(p-1) mod p==1
sera toujours valable pour les nombres premiers p
, mais pas toujours pour les composites. Maintenant, un nombre carmichael est essentiellement le pire ennemi du test de Fermat: un nombre pour lequel vous devez choisir a
de ne pas être co-amorcé avec p
pour obtenir a^(p-1) mod p!=1
. Maintenant, si ce a
n'est pas co-premier, vous avez essentiellement trouvé un facteur non trivial dep
et comme nous le savons tous, l'affacturage peut être assez difficile. Surtout si tous les facteurs sont suffisamment importants. Vous pouvez maintenant comprendre pourquoi le test de Fermat n'est pas utilisé dans la pratique aussi souvent (eh bien, il y a de meilleurs algorithmes), c'est parce qu'il y a des chiffres pour lesquels vous, en tant que défenseur (en termes de sécurité), devriez effectuer une quantité de travail similaire à un attaquant (à savoir factoriser le nombre).
Alors maintenant que nous savons pourquoi ces chiffres sont quelque peu fascinants, nous allons les générer le plus rapidement possible, afin que nous puissions simplement mémoriser le code de génération si nous en avons besoin!
Les numéros de Carmichael sont également connus sous le nom de A002997 sur OEIS .
Il existe déjà un défi connexe , mais les entrées à partir de là ne sont pas compétitives ici car elles sont optimisées pour la vitesse plutôt que pour la taille. Le même argument vaut pour la direction inverse, les entrées ici sont susceptibles de faire des compromis contre la vitesse en faveur de la taille.
spécification
Contribution
Il s'agit d'un défi de séquence standard , vous devez donc prendre un entier positif ou non négatif n
en entrée. n
peut être indexé 0 ou 1 selon vos préférences (veuillez l'indiquer).
Production
Votre sortie sera soit le n
-ième numéro de carmichael ou les premiers n
numéros de carmichael, comme vous préférez (veuillez l'indiquer).
spécification
Un entier x
est un nombre de Carmichael si et seulement si x
est composite et pour tous les entiers y
avec gcd(x,y)=1
, il le tient y^(x-1) mod x==1
.
Qui gagne?
C'est le code-golf , donc le code le plus court en octets gagne!
Les règles standard d'E / S et d'échappatoires s'appliquent.
Cas de test
Les premiers numéros de carmichael sont:
561,1105,1729,2465,2821,6601,8911,10585,15841,
29341,41041,46657,52633,62745,63973,75361,101101,
115921,126217,162401,172081,188461,252601,278545,
294409,314821,334153,340561,399001,410041,449065,
488881,512461