2016-02-23 1 views
0

Supposons que je souhaite allouer un tableau d'entiers pour stocker tous les nombres premiers inférieurs à certains N. J'aurais alors besoin d'une estimation pour la taille du tableau, E(N). Il y a une fonction mathématique qui donne le nombre exact de nombres premiers en dessous de N, c'est le Prime-counting function - pi(n). Cependant, il semble impossible de définir la fonction en termes de fonctions élémentaires.Est-il correct d'utiliser une table de valeurs interpolées de la fonction de comptage principal `pi (x)` comme limite supérieure pour un tableau de nombres premiers?

Il existe quelques approximations de la fonction, mais toutes sont des approximations asymptotiques, donc elles peuvent être soit au-dessus ou au-dessous du vrai nombre de nombres premiers et ne peuvent généralement pas être utilisées comme estimation E(N).

J'ai essayé d'utiliser des valeurs tabulées de pi(n) pour certains n comme power-of-two et d'interpoler entre eux. Cependant, j'ai remarqué que la fonction pi(n) est convexe, de sorte que l'interpolation entre les points de la table clairsemée peut donner accidentellement des valeurs de E(n) sous le vrai pi(n) qui peut entraîner un dépassement de tampon.

Je me suis alors décidé d'exploiter la nature et monotones de pi(n) utiliser les valeurs de la table de pi(2^(n+1)) comme une estimation bien supérieure pour E(2^n) un interpoler entre eux cette fois-ci.

Je ne me sens toujours pas complètement certain que pour certains 2^n < X < 2^(n+1) une interpolation entre pi(2^(n+1)) et pi(2^(n+2)) serait l'estimation supérieure sûre. Est-ce correct? Comment puis-je le prouver?

Répondre

1

Utilisez une limite supérieure. Il y a un certain nombre à choisir, chacun plus compliqué mais plus serré. J'appelle cela prime_count_upper(n) puisque vous voulez une valeur garantie supérieure ou égale au nombre de nombres premiers sous n. Voir Chebyshev, Rosser et Schoenfeld, Dusart 1999, Dusart 2010, Axler 2014, et Büthe 2015. R & S est simple et pas terrible: π(x) <= x/(log(x)-3/2) for x >= 67 mais Dusart donne de meilleurs pour des valeurs plus grandes. De toute façon, pas de tables ou de recherche originale nécessaire.

+0

Il y a aussi un joli 'PrimePi (n) <= (30 * log (113)/113) * n/log (n) pour tout n> 1' dans les commentaires à https://oeis.org/A209883 – mbaitoff

+1

J'appelle le Chebyshev lié, et c'est fini par un énorme 20% à 10^12 (contre 1,8% pour le simple que j'ai montré). Il surestime également à 10^6. La constante peut être réduite au fur et à mesure que x augmente (par exemple 1.1056 pour x> = 96098 ou 1.095 pour x> = 284860), mais c'est toujours une limite très lâche. Panaitopol 1999 a amélioré le résultat R & S à 'x/(log (x) -1.112)' pour x> = 4 et l'erreur à 10^12 tombe à 0.27%. Dusart 1999 est un autre ordre de grandeur, Dusart 2010 encore un autre (quoique pour de grandes valeurs). – DanaJ

2

Vous êtes en train de trop réfléchir. En C, vous utilisez simplement malloc et realloc. Je préférerais 100 fois un algorithme qui fonctionne évidemment au lieu d'un qui nécessite une preuve mathématique profonde.

+0

À l'intérieur d'une boucle interne d'un algorithme traitant des nombres premiers et de la factorisation, ceci introduirait une branche conditionnelle supplémentaire pour tester le débordement de la matrice, ce qui pourrait coûter de la performance. – mbaitoff

+0

@mbaitoff Il semble hautement improbable que cela ait un impact significatif sur les performances. Vous aurez juste besoin de deux variables d'ounter (une pour le nombre d'éléments, une pour le log2 de la taille du tableau) et une vérification de bit par itération. –

1

Le théorème des nombres premiers garantit la n e premier P (n) est sur la plage n log n < P (n) < n log n + n log log n pour n> 5. Comme le suggère DanaJ, des limites plus étroites peuvent être calculées.

Si vous voulez stocker les nombres premiers dans un tableau, vous ne pouvez pas parler de quelque chose de trop grand. Comme vous le suggérez, il n'y a pas de calcul direct de pi (n) en termes de fonctions arithmétiques élémentaires, mais il y a plusieurs méthodes pour calculer exactement (n n'est pas trop gros. Voir this, par exemple.

+0

Votre réponse est à propos de la magnitude si le N'th premier, pas sur le nombre de nombres premiers en dessous de N? Ou vous voulez calculer le nombre de nombres premiers à partir de l'estimation de la magnitude maximale? – mbaitoff

+1

Les deux sont doubles les uns aux autres; donc, P (25) = 97 et pi (97) = 25. – user448810

+0

Je pense qu'une formule de limite supérieure relativement simple est plus appropriée, mais +1 pour noter que les nombres premiers exacts sont beaucoup plus rapides que la plupart des gens ne le pensent. Sans un peu d'optimisation pour phi (x, a), il pourrait s'enliser à de grandes valeurs et semble compliqué à expliquer ou à déboguer. Cela dépend vraiment de l'auteur/l'utilisation. Je m'inquiète du nombre impressionnant d'exemples d'EES brisées que l'on peut trouver sur le Web. Si les gens ne peuvent pas écrire 4 lignes de code qui sont clairement écrites sur Wikipédia, je n'ai pas beaucoup d'espoir de les voir corriger Legendre ou Meissel. – DanaJ