Programme de jugement des nombres premiers le plus rapide C # Java C ++

Un programme qui détermine si un nombre est un nombre premier ou un nombre non primaire. (Prend en charge C #, Java, C ++) Je l'ai fait parce que cela apparaît souvent comme un problème dans les concours de programmation tels que CodeIQ.

Programme de jugement des nombres premiers le plus rapide

Version C

public static bool IsPrime(int num)
{
    if (num < 2) return false;
    else if (num == 2) return true;
    else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance

    double sqrtNum = Math.Sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {
            //Pas un nombre premier
            return false;
        }
    }

    //Est un nombre premier
    return true;
}

Si possible, je veux garder le code dans la plage que je peux comprendre, donc je l'utilise actuellement comme la version la plus rapide. (C'est facile, non?) Cependant, je pense que cette vitesse est suffisante pour résoudre le problème. Si cela ne suffit pas, détrompez-vous.

Version Java

public static boolean isPrime(int num) {
    if (num < 2) return false;
    else if (num == 2) return true;
    else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance

    double sqrtNum = Math.sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {
            //Pas un nombre premier
            return false;
        }
    }

    //Est un nombre premier
    return true;
}

Version C ++

#include <math.h> 

bool IsPrime(int num)
{
	if (num < 2) return false;
	else if (num == 2) return true;
	else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance

	double sqrtNum = sqrt(num);
	for (int i = 3; i <= sqrtNum; i += 2)
	{
		if (num % i == 0)
		{
			//Pas un nombre premier
			return false;
		}
	}

	//Est un nombre premier
	return true;
}

Explication des termes mathématiques

Je vais expliquer brièvement les termes que je n'ai pas compris.

Explication de l'algorithme le plus rapide

Pour l'algorithme mis en œuvre, je me suis principalement référé au contenu de ce site. Jugement du nombre premier|Algorithme et structure des données| Aizu Online Judge

Sur ce site ** Dans le jugement des nombres premiers, la propriété que «le nombre composé x a un facteur premier p qui satisfait p ≤ √ x» peut être utilisée. ** ** Il y a une description, "Le nombre composé x a un facteur premier p qui satisfait p≤√x" = "Si x est un nombre composé, il a une fraction inférieure ou égale à √x" </ u> En d'autres termes, la condition de fin de boucle dépend de Math.Sqrt (num). Par rapport à la simple exécution du calcul du reste jusqu'à num, le nombre de boucles est réduit et la vitesse de traitement est considérablement réduite.

Autres algorithmes

Il semble qu'il existe à peu près deux types d'algorithmes de jugement des nombres premiers. --Méthode de jugement des nombres premiers décisifs

  • Méthode de jugement probabiliste des nombres premiers

La méthode de jugement définitive consiste à juger un nombre premier par une méthode qui ne provoque sûrement pas d'erreur. La méthode de jugement probabiliste est une méthode dans laquelle la vitesse de jugement est considérablement augmentée, bien que des erreurs puissent survenir occasionnellement.

Le représentant de la méthode de jugement définitif des nombres premiers est la "méthode de jugement des nombres premiers AKS" Une méthode typique de jugement de primalité probabiliste est le "test de primalité de Miller-Rabin".

Si vous avez besoin d'une implémentation plus rapide, pensez-y aussi.

prime

La plupart des gens trouveront cette page inutile s'ils connaissent l'algorithme le plus rapide ci-dessus. Veuillez lire ce qui suit uniquement pour ceux qui souhaitent voir le processus de mise en œuvre menant à l'algorithme le plus rapide.

Implémentation simple

Une technique puissante pour vérifier s'il est réellement divisible tout en augmentant le nombre à diviser par un. J'ai trouvé cette méthode moi-même, mais c'était trop lent.

private static bool IsPrime(int num)
{
    if (num < 2) return false;

    for (int i = 2; i < num; i++)
    {
        if (num % i == 0)
        {
            //Pas un nombre premier
            return false;
        }
    }

    //Est un nombre premier
    return true;
}

Une version légèrement améliorée de l'implémentation simple

Avec un peu d'ingéniosité dans une mise en œuvre simple, la vitesse de traitement sera divisée par deux. En termes simples, nous savons que les valeurs égales sont divisibles par 2, alors supprimons-les à l'avance. De même, il semble que les multiples de 3 et 5 peuvent être supprimés à l'avance, mais cela ne semble pas être aussi beaucoup plus rapide.

private static bool IsPrime(int num)
{
    if (num < 2) return false;
    else if (num == 2) return true;
    else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance

    for (int i = 3; i < num; i+=2)
    {
        if (num % i == 0)
        {
            //Pas un nombre premier
            return false;
        }
    }

    //Est un nombre premier
    return true;
}

Source de référence

Premier jugement-Wikipedia Jugement du nombre premier|Algorithme et structure des données| Aizu Online Judge

Recommended Posts

Programme de jugement des nombres premiers le plus rapide C # Java C ++
Jugement des nombres premiers Java
J'ai écrit un programme de jugement des nombres premiers en Java
Échantillon de bibliothèque de tests unitaires Java
[Java] Exemple de cas de test JUnit 4
Collection de méthodes de code de test Java
Test de compétence Java 2018 pour les nouveaux arrivants - Principes de base-
Reproduire l'énumération Java en C #
Histoire de remplacement C # et Java
Implémenter un test piloté par table dans Java 14
Aide-mémoire C # pour les techniciens Java
Tutoriels C, Java, JDBC, JSP, Applet
Java Unit Test Library-Artery-ArValidator valide les objets
Lire le fichier de propriétés Java en C #
Jugement de la date actuelle de la bibliothèque de tests unitaires Java
Java, JavaScript, C # (différence d'affectation)
Une personne écrivant C ++ a essayé d'écrire Java
Contenu du test de l'examen Java SE Bronze
[Java] Tester des méthodes privées avec JUnit
Équivalence bibliothèque de tests unitaires Java-Artery / JUnit4-Array
Crypter avec Java et décrypter avec C #
AtCoder Beginner Contest 167 Problème C (Java)