Le tamis Sundarama dans le rĂ©seau est reprĂ©sentĂ© par un grand nombre de sources d'informations brĂšves. NĂ©anmoins, j'ai dĂ©cidĂ© d'Ă©noncer ce que j'aimerais lire moi-mĂȘme au dĂ©but de l'Ă©tude des algorithmes de la thĂ©orie des nombres.
Le tamis de Sundarama est l'une des trois méthodes les plus connues pour générer des nombres premiers. Maintenant, il est habituel de le traiter comme un peu exotique en raison de la faible complexité de calcul: O (N (logN)). Cependant, les asymptotiques sont asymptotiques et, dans la pratique, dans la plage de tamisage 32 bits, Atkin, par exemple, ne dépasse Sundaram qu'avec une optimisation minutieuse.
Les implĂ©mentations du tamis Atkin, circulant sur Internet, ne dĂ©passent pas le tamis Sundaram ni en termes de temps, ni en termes d'efficacitĂ© de mĂ©moire. La mĂ©thode Sundaram peut donc ĂȘtre utilisĂ©e comme outil auxiliaire dans des expĂ©riences avec des algorithmes plus avancĂ©s.
Le tamis de Sundarama trouve tous les nombres premiers dans une plage donnĂ©e de nombres naturels 3 †n †N "filtrant" les composants. Sans perte de gĂ©nĂ©ralitĂ©, la valeur de N peut ĂȘtre considĂ©rĂ©e comme impaire. Si N est pair, alors il est garanti d'ĂȘtre composite, et il peut ĂȘtre exclu de la plage de tamisage en diminuant la valeur de la limite supĂ©rieure d'une unitĂ©.
L'algorithme est basĂ© sur le fait suivant. Tout nombre composite impair n peut ĂȘtre reprĂ©sentĂ© comme le produit de deux nombres impairs naturels supĂ©rieurs Ă un:
(1)
n = (2 * i + 1) * (2 * j + 1),oĂč i et j sont des nombres naturels (zĂ©ro n'est pas un nombre naturel). Il est impossible d'imaginer un nombre premier n sous cette forme, car sinon cela signifierait que n a des diviseurs supplĂ©mentaires en plus de lui et un.
Nous écrivons le n impair sous la forme 2 * m + 1, le substituons dans (1) et obtenons l'expression de m:
(2)
m = 2 * i * j + i + j.Cette transformation conduit directement à l'idée du tamis de Sundaram.
Afin de filtrer les nombres composites d'un intervalle donnĂ©, vous devez utiliser un tableau dans lequel un Ă©lĂ©ment d'index m est reprĂ©sentatif du nombre 2 * m + 1. AprĂšs avoir organisĂ© l'Ă©numĂ©ration des valeurs des variables i et j, nous calculerons l'indice m selon la formule (2), et dans le correspondant les Ă©lĂ©ments du tableau dĂ©finissent la marque "nombre composite". Une fois l'Ă©numĂ©ration terminĂ©e, tous les nombres composites de la plage seront marquĂ©s et les nombres premiers peuvent ĂȘtre sĂ©lectionnĂ©s par l'absence de marque.
Reste à clarifier les détails techniques.
Sur la base du raisonnement précédent, pour représenter la limite supérieure (impaire) de la plage de tamisage N, l'indice m prend sa valeur maximale mmax = (N - 1) / 2. Cela détermine la taille requise de la baie.
Nous énumérerons les valeurs de i et j en deux cycles: une boucle externe pour énumérer les valeurs de i et une boucle interne imbriquée pour les valeurs de j.
La valeur initiale du compteur de boucle externe est i = 1. Ătant donnĂ© la symĂ©trie complĂšte de l'occurrence des variables i et j dans l'expression (2), pour Ă©viter des calculs rĂ©pĂ©tĂ©s en double, le cycle interne doit commencer par la valeur j = i.
Trouvez la valeur maximale pour le compteur de boucle externe imax â„ i. Si la limite de la plage N est un nombre composĂ© impair, alors avec la valeur i = imax, la boucle interne doit ĂȘtre exĂ©cutĂ©e au moins une fois avec la valeur de son paramĂštre j = imax pour supprimer N, et l'expression (2) prendra sa valeur maximale:
mmax = 2 * imax * imax + imax + imax,
imax ^ 2 + imax - mmax / 2 = 0.
En résolvant cette équation quadratique, nous obtenons:
imax = (â (2 * mmax + 1) -1) / 2 = (âN-1) / 2.La restriction pour le compteur du cycle interne jmax â„ j rĂ©sulte de l'inĂ©galitĂ©
mmax â„ 2 * i * j + i + j , d'oĂč nous obtenons:
jmax = (mmax - i) / (2 * i + 1).Les valeurs des limites supĂ©rieures doivent ĂȘtre arrondies Ă la valeur entiĂšre la plus proche, en Ă©liminant la partie fractionnaire.
Ce qui suit est une liste d'une classe Sundaram C # trÚs simple qui implémente la méthode décrite.
using System; using System.Collections; namespace CSh_Sundaram { public class Sundaram { public double dt;
En tant que paramÚtre lors de la création d'un objet de type Sundaram, la limite supérieure de la plage de tamisage est indiquée. Pour le tri, la classe utilise un tableau de type BitArray. Cela augmente le temps d'exécution, mais vous permet de couvrir toute la plage 32 bits du type uint. Le tri est effectué lors de l'accÚs à la méthode Sieve () à partir du constructeur de classe. Une fois terminé, le champ dt contiendra le temps d'exécution de Sieve en secondes.
Lors de l'accÚs à la propriété NextPrime, séquentiellement, à partir de 3, dans l'ordre croissant, les nombres premiers seront retournés. Une fois tous les simples de la plage épuisés, la valeur 0 sera renvoyée.