Turbo nombres premiers

Programmation d'applications complexes
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Petite modif en ASM (petite map dans un registre)

La petite séquence ASM permet de comprendre que la p-factorielle 5 (qui est égale à 2*3*5) est la seule p-factorielle à s'adapter à l'architecture 64 bits : son cycle de 8 nombres susceptibles d'être premier tient dans un seul registre. Pour que la p-factorielle 7 soit envisageable, il faut attendre l'optimisation matérielle de l'instruction machine LZCNT.

Code : Tout sélectionner

#P2 = 25 ; on passe de 2^24 à 2^25 pour garder notre durée...
#sMax = 1 << (#P2 - 3) - 1

Macro sGet(K0, M0)
  ((s(K0) >> M0) & 1)
EndMacro

Macro sSet(K0, M0)
  s(K0) | (1 << M0)
EndMacro

Define.I i, modu ; <--- les minuscules sont importantes en ASM
Define.I sqrMax = Sqr((#sMax + 1) * 30)
Dim s.a(#sMax) ; le crible...
s(0) = 1 ; réglage du 1 comme composite...
Dim M.I(7) ; ce tableau ne sera plus nécessaire...
M(0) = 1 ; cette liste non plus...
M(1) = 7
M(2) = 11
M(3) = 13
M(4) = 17
M(5) = 19
M(6) = 23
M(7) = 29
Dim gap.I(7)
gap(0) = 6
gap(1) = 4
gap(2) = 2
gap(3) = 4
gap(4) = 2
gap(5) = 4
gap(6) = 6
gap(7) = 2

K = 0
i0 = 1

t0 = ElapsedMilliseconds()

Repeat
  K30 = 30 * K
  N = K30 + M(i0)
  If sGet(K, i0) = 0
    N2 = N * N
    If N2 >= (#sMax + 1) * 30
      Break
    EndIf
    i1 = i0
    Repeat
      K_30 = N2 / 30
      modu = N2 % 30
      ! mov rcx, [v_modu]
      ! mov rax, $1C0181500C804000 ; <--- la liste est compactée ici
      ! shl rcx, 1
      ! shr rax, cl
      ! and rax, 7
      ! mov [v_i], rax
      sSet(K_30, I)
      N2 + N * gap(i1)
      i1 + 1
      i1 & 7
    Until N2 >= (#sMax + 1) * 30
  EndIf
  i0 + 1
  If i0 > 7
    i0 = 0
    K + 1
  EndIf
Until N > sqrMax
t1 = ElapsedMilliseconds()
Delay(1)


For I = 0 to #sMax
  For J = 0 To 7
    If s(I) >> J & 1 = 0
      P + 1
    EndIf
  Next
Next

; On affiche quantités et durée de notre algo
MessageRequester(Str((#sMax + 1) * 30) + " nb testés", Str(t1 - t0) + " ms" + Chr(10) + Str(P) + " nbs 1ers")
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Ce qui est bien quand on convertit en ASM, c'est que si l'algo est faux, ça se voit, et là...
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Turbo nombres premiers

Message par PAPIPP »

Bonjour ollivier

Dans ma réflexion je n’avais pas d’option technique pour mémoriser les nb premiers
Mais effectivement la p_factorielle 5 avec ses 30 colonnes et ses 8 colonnes susceptibles de contenir des nb premiers peut convenir.
Donc avec un gain de 22/30 =0,73333 ou 73,33% et pour un même niveau les nb appartenant aux 8 colonnes peuvent être mémorisés dans un registre 64 ou un octet de 8 bits
Dans un premier temps j’avais pensé à utiliser un tableau par colonne car la gestion est plus facile avec une table par colonne mais si l’on peut gérer facilement le registre 64 bits ou les 8 bits de l’octet pourquoi pas puisque au même niveau avec le vecteur cyclique 6 4 2 4 2 4 6 2 on n’a aucune difficulté à déterminer le nb premier s’il existe.
Le niveau = Nb à étudier /30 et la colonne = Nb à étudier % 30

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Salut Papipp, ta remarque est sympa. Mais... Je me suis gamelé : je t'ai fait un clafouti de nombres premiers qui sont composites en réalité !

J'ai juste comparé mes statistiques avec celles disponibles en ligne, et je trouve plus de nombres premiers que la réalité !

Or, c'est mon code source en pureBasic, 3 codes plus haut qui foire, alors même que je n'optimise pas le criblage. Et bien sûr, je n'ai pas fait une interface pour décompiler les nombres obtenus dans un tableau et ainsi pouvoir être vérifié facilement.

En plus, j'ai peu de temps à consacrer pendant ces prochains jours. Je peux faire des erreurs en programmation : c'est juste une passion (délicieuse). Mais il y a d'autres domaines où je dois être parfaitement concentré pendant quelques jours.

Ça laisse le temps à manababel de possiblement sophistiquer son algos pour se défendre de ma prochaine "contre-attaque" !!! En toute bonne ambiance.

Ce qui est surprenant avec les nombres premiers, c'est qu'il s'agit d'un très petit ensemble de chemins logiques pour parvenir à débusquer les nombres premiers. On se retrouve donc facilement à imaginer des algos qui se ressemblent, alors qu'on a passé un temps significatif dans un contexte solitaire pour augmenter la puissance de recherche.

A bientôt !
Avatar de l’utilisateur
Guillot
Messages : 532
Inscription : jeu. 25/juin/2015 16:18

Re: Turbo nombres premiers

Message par Guillot »

bon les gars, je présume que derrière ces codes concernant les nombres 1er vous avez l'espoir de trouver la suite qui vous donnera directe le nombre 1er suivant et de devenir ainsi le plus grand génie de l'humanité
là, je vous trouve un tantinet optimiste
ça doit bien faire 3000 ans qu'on se casse les dents la dessus
(je dois avouer que moi aussi j'ai perdu un peu temps avec ça (mais bon, c'était du temps que je piquais à mon patron, donc ça comptait pas)

alors si vous avez rien de mieux à foutre, moi j'ai du boulot pour vous !
y'a qu'à demander y'en aura pour tout le monde
- refaire la vector lib sous opengl
- refaire window3d via les sprites (j'avais commencer le taf)
- faire des fonction pour la synthese de son
...
donc si y'a des désœuvré qui souhaiterai faire des trucs utils à tous on pourrait ouvrir un forum
trouver une liste de fonction/pg à développer
disuter sur la meilleur façon de faire
et ce mettre au boulot !!
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

@Guillot

Peut-être un sujet pour chacune de tes 3 demandes. Ça permettrait de mettre des liens vers ce qui existe déjà, et ce qui est à faire... Après, l'histoire des génies de l'humanité et tout ça : je n'adhère pas. Et je pense que tu dis ça sur un coup de colère. Alors, pour te calmer (et te marrer un peu), teste le dernier code plus haut, et dis-toi qu'il m'affiche 1053 millisecondes, sans débogueur. Essaie, tu vas voir, ça va te donner le sourire... (j'en ai un sur le forum anglais, il me faudrait 60 ordinateurs pour rivaliser avec son ordinateur !)

Comme dit le proverbe << Une bonne bouze, ça tient chaud >>. Et c'est appréciable que tu ne trouves plus utile de piquer du temps à ton patron : question de point de vue, moi le dernier que j'ai vu faire ça, c'était il y a 17 ans. Ça l'amusait de montrer une femme-fontaine à ses subalternes. Tu vois : chacun ses délires.

@Papipp

Cette routine est à ajouter en fin de programme. Elle stocke les nombres sensés être premier dans le tableau pn(). Je pense que c'est une sécurité "hors limite" qui est trop sensible.

Code : Tout sélectionner

Dim pn((#sMax + 1) * 8 - 1 + 3)
pn(0) = 2
pn(1) = 3
pn(2) = 5
K30 = 0
N = 3
For I = 0 to #sMax
  For J = 0 To 7
    If s(I) >> J & 1 = 0
      pn(N) = K30 + M(J)
      N + 1
    EndIf
  Next
  K30 + 30
Next
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Turbo nombres premiers

Message par PAPIPP »

A MAITRE Guillot

Dans la mesure où nous respectons toutes les règles de ce forum.
J’ignorais que sur ce forum nous étions soumis à un contrôle de l’utilité de notre travail dans le domaine de PureBasic ou de l’informatique en général.
Et j’ignorais aussi que MAITRE ou CHEF de projet Guillot soit responsable de l’utilité des propositions informatiques fournies ici et que de ce fait nous ne soyons pas libre de discuter de PureBasic ou de problèmes informatiques qui nous intéressent.

C’est une tentative d’atteinte à la liberté.
La liberté est l’état de quelqu'un qui n'est pas soumis à un maître.
Elle se définit, négativement, comme l'absence de contrainte; positivement comme l'état de celui qui fait ce qu'il veut.

Maintenant pour rafraichir la mémoire de Maitre Guillot en matière de nombres premiers.

par PAPIPP » mar. 11/oct./2016 10:36
Une petite info.
La nouvelle ne va peut-être pas bouleverser votre vie, mais elle est en train de faire sensation dans le monde
habituellement calme des mathématiques. Shinichi Mochizuki de l’université de Kyoto au Japon
affirme avoir démontré la «conjecture abc», un problème important de la théorie des nombres
proposé par David Masser et Joseph Oesterle en 1985 et qui porte sur le lien entre les nombres premiers
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37...), rapporte la revue scientifique Nature.

Pour sa démonstration, Mochizuki a développé des techniques que très peu d’autres mathématiciens comprennent complètement
et qui utilisent de nouveaux «objets» mathématiques. «A ce stade, il est probablement le seul à les connaitre tous» estime Goldfeld.
Et pour cause: la démonstration du Japonais est détaillée dans quatre articles scientifiques, qui reposent chacun sur d’autres longs articles. Brian Conrad de l’université de Stanford, explique:

Ici les 4 articles de Juillet 2016 à septembre 2016 en anglais.

http://www.kurims.kyoto-u.ac.jp/~motizu ... ry%20I.pdf
http://www.kurims.kyoto-u.ac.jp/~motizu ... y%20II.pdf
http://www.kurims.kyoto-u.ac.jp/~motizu ... %20III.pdf
http://www.kurims.kyoto-u.ac.jp/~motizu ... y%20IV.pdf

@ Ollivier

merci pour ce complément de prg

A+
Dernière modification par PAPIPP le ven. 02/juil./2021 22:46, modifié 2 fois.
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Papipp a écrit :merci pour ce complément de prg
Ah ouai, si jamais tu vois où est-ce que j'ai bugué : ça commence dans le code du 28 Juin 19H20. Il n'y a pas encore l'optimisation du criblage dans ce code : ce code crible tous les multiples des nbs 1ers trouvés bêtement et méchamment, et pourtant il bugue.

Et là, j'ai vite fait tenté un algo classique (test simple des facteurs) pour vérifier, et je suis incapable même de pondre ce sumple algo de vérif sans bug : jusqu'à 2^18, je trouve pile poil 23000 nombres premiers, ce qui, à mon avis est complètement faux. Ça ne peut pas être un chiffre aussi rond...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Ou alors je me trompe : peut-être qu'il existe un nombre premier qui ouvre un bal infini dans lequel il est nécessaire de cribler aussi dans le sens décroissant de N*N vers 2N, en plus du crible croissant de N*N vers l'infini... Si c'est le cas, l'optimisation ASM reste la même à un sens de décalage de bits près...
manababel
Messages : 136
Inscription : jeu. 14/mai/2020 7:40

Re: Turbo nombres premiers

Message par manababel »

quand j'ai posé mes premiers messages sur les nombres premiers , j'ai fait quelques recherches sur internet.
il existe de nombreuses façons de les calculer.( vous le saviez déjà)
sur le "papier" il y a des méthodes bien plus rapide de calculer un nombre premier, utilisant des divisions ou/et des modulo
c'est plus rapide car il y a moins d'opérations.

le problème avec les Pc , d'une division ou modulo demande énormément de cycle d'horloge, là ou l'addition en demande très peu.

le programme que j'ai posté arrive à sa limite d'optimisation . son problème, est l'accès à la mémoire (problème en temps) et la mémoire qu'il utilise.
(j'ai reussi à l'optimise avec les commandes SSE, mais c'est insignifiant)

si vous voulez un programme plus rapide, il faut s'orienter vers un autre algorithme .(optimisé pour Pc mais pas pour "mathématiciens")
le peu que j'ai testé étaient plus lent, ou trop complexe pour que je les programme.

bon courage.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

C'est une très bonne synthèse, manababel.

En l'état, le crible d'Eratosthène n'est pas optimisable en SSE (SIMD) : les SIMDs sont faites pour ratisser très rapidement de manière continue, tandis que le crible d'Eratosthène est strictement et purement discontinu, d'une part, et cette discontinuité balaye toute l'échelle de la mémoire allouée : il y a besoin de traiter depuis de petits pas (2, 3, 5, etc...) jusqu'à d'immenses pas, et ceci dans une variation graduée.

Le parfait ennemi des SIMDs, en l'état. C'est au point tel que même les tests par division pourraient mieux convenir aux SIMDs, mais le crible simple resterait, à mon avis, plus rapide.

Je vérifierai prochainement, où est mon bug. En tout cas, merci et bravo pour ce tests des threads.
Avatar de l’utilisateur
Guillot
Messages : 532
Inscription : jeu. 25/juin/2015 16:18

Re: Turbo nombres premiers

Message par Guillot »

@ Ollivier et PAPIPP:
z'inquitez pas les gars, y'a pas de colère, je décorne !
c'est juste que le sujet attire pas mal de programmeurs expérimentés
je voulais testé si certains seraient tenté par le développement de fonctionnalité utile à la communauté

je sors...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Ah non non non, eh, tu sors pas ! Déjà, on a besoin de toi pour les prochains timing !
Ensuite, si Papipp ne te l'a pas dit en mp, l'utilité des nombres premiers, elle est majeure en calculs formel. C'est presque te dire que Fred pourrait en faire une fonction native en math, avec, comme Delay(), WaitThread(), WaitWindowEvent(), un délai limite en millisecondes pour définir le nombre premier le plus grand atteignable, et son rang.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Et puis ça tombe bien : ton avatar montre le professeur shadoko qui pointe sur des calculs formels !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Turbo nombres premiers

Message par Ollivier »

Bon alors... Déjà, 1ère vérif : il y a bien 23000 nombres premiers pile poil entre 0 et 2^18...

Ensuite, 2ème vérif : il y a bien 40883 nombres premiers entre 0 et 491520. Mon algo affiche 40880, mais c'est parce que j'ignore 2, 3 et 5... Donc, il marche impeccablement, au moins jusqu'à 491520...
Répondre