Voici un prg basé sur la partition en fonction du p_fact(x)=Modulo.
Comme il a été démontré précédemment. On peut créer une matrice de tous les nombres naturels =>0 en prenant le reste de la division par modulo comme Numéro de colonne et la partie entière comme numéro de ligne.. Ici nous n’aurons pas besoin du numéro de ligne ou plutôt le numéro de ligne sera fictif. Cela nous permet d’optimiser la place.
Pour contracter encore le vecteur de la première ligne nous ne prendrons que les différences entre colonnes contenant éventuellement des nombres premiers.
Le vecteur des différences entre colonnes ainsi créé peut servir pour passer d’un nombre à l’autre mais aussi pour déterminer l’ensemble des diviseurs.
Pour commencer il faut déterminer le choix d’un nombre susceptible de contenir un nombre premier.
Comme le vecteur des différences est cyclique. Il faut rechercher la première colonne susceptible de contenir un nombre premier
Exemple soit Nb_dep le premier nombre dont nous voulons savoir s’il est premier.
1) Il faut choisir un modulo= p_fact(13)= 30030 on peut choisir un autre p_fact 2 ou 3 ou 5 ou 7 ou 11 ou 13.
Pour utiliser les p-fact 17 et 19 il faudra utiliser le prg de génération du vecteur des différences car ces vecteurs sont trop longs pour être placés dans le prg ci-dessous.
2) prenons le reste de la division nb_rest= Nb_dep%modulo. Celui-ci correspond à une colonne de la matrice
3) Ce nombre doit être comparé à un numéro de colonne pour savoir ci celle-ci contient éventuellement un nombre premier. Si cette colonne ne contient pas de nombre premier nous prendrons la première colonne suivante contenant éventuellement un nombre premier C’est ce que j’ai appelé la synchronisation.
4) A partir de ce nombre ou de cette colonne on applique tous les diviseurs susceptibles d’être premiers en commençant par le premier nombre susceptible d’être premier après le dernier nombre premier utilisé dans p_fact ex : si p_fact(13) le premier nombre suivant 13 susceptible d’être premier est 17
5) Comme ce nombre est synchronisé avec la colonne de 1 nous passons de ce diviseur au diviseur suivant en additionnant la différence pour obtenir la prochaine colonne et ainsi de suite jusqu’à la fin du vecteur où nous reprenons l’indice à 1 jusqu’à ce qu’il ne reste plus de diviseur avec arrêt si diviseur> pow(nb_dep,0,5) la racine carré de nb_dep. Nous avons donc trouvé un nombre premier ou alors nous arrêtons les diviseurs si le reste de la division NB_dep%diviseur =0 c'est-à-dire que lun des diviseurs et un diviseur de Nb_dep donc Nb_dep n’est pas premier
6) Il faut maintenant incrémenter Nb_dep d’une colonne susceptible de contenir un nombre premier avec le vecteur des différences et en suite nous reprenons au 4)
Code : Tout sélectionner
; algorithme de recherche des nombres PREMIERS par zones
; ATTENTION ENTRE 1E2-1E1 =90 entre 1E3-1E2=900 entre 1E4-1E3=9000 entre 1E12-1E11= 900000000000
; Le nombre 1 n'est pas par convention un nombre premier.
EnableExplicit
; DisableDebugger
structure divp
DIF.l
i_ind.l
endstructure
Structure DIV
PREMDIV.l
NBSEQ.l
Array TDIF.l(2000000)
array SDIF.L(2000000)
; array prem.divp(600000)
EndStructure
Global nbs.l,NBSEQ.l,MODULO.l,result$,rest
Define SEQD.div
; Define nb$,nb.q,l2nb.d,nbl2.q,nbMAX.q,NBREC.q,DIV.l,i,pas,fact_prem$,j,deb.q,mess$,quotient.q,reste.l,quotientp.q,*Tab,ind.l,idiv,SEQD.div,AA$,MDIV,MPAS
; Procedure choixdiv ( *EL.DIV )
Procedure choix_div ( *EL.DIV)
Protected mess$, nb$, ELEM, ipas, i, i_prem
;********************************************* Choix du filtre à tester *********************************
nbs=7
; Goto FINSAISIE0 ;;;; si vous ne désirez plus choisir les multiples des nb premiers à éliminer commentez cette ligne et imposer nbs juste au dessus
mess$=""
SAISIE0:
mess$+"p_fact=Filtre de réduction des diviseurs"
If Len(mess$)>120
MessageRequester("Erreur","Donnez p_fact avec <= à 2 3 5 7 11 13 17 19 23"+#CR$+"Relancez le prg") ;
End
EndIf
nb$=InputRequester(mess$,"Donnez p_fact <= à 2 3 5 7 11 13 17 19","13") ;
If Len(nb$)>Len("13")
Goto SAISIE0
EndIf
nbs=Val(nb$)
If nbs<1 Or nbs>19
Goto SAISIE0
EndIf
rest=nbs%30
if rest=2 or rest=3 or rest=5 or rest=7 or rest=11 or rest=13 or rest=17 or rest=19 ;or rest=23 or rest=29
else
Goto SAISIE0
endif
FINSAISIE0:
; *************************** Chargement de la séquence à tester ******************************
Select nbs
Case 1,2
modulo=2
result$="2 "
Restore DIV_02
Case 3,4
MODULO=6
result$="2 3 "
Restore DIV_03
Case 5,6
modulo=30
result$="2 3 5 "
Restore DIV_05
Case 7 To 9
modulo=210
result$="2 3 5 7 "
Restore DIV_07
Case 10 To 11
modulo=210*11
result$="2 3 5 7 11 "
Restore DIV_011
Case 12 To 13
modulo=210*11*13
result$="2 3 5 7 11 13 "
Restore DIV_013
Case 14 To 17
; messagerequester(" ATTENTION", " Pour utiliser le p_fact(17) ou p_fact(19)il faut générer le fichier DIV0_17.pb ou DIV0_19.pb"+#CRLF$+" avec le prg GENERATEUR_DU_VECTEUR_DES_DIFFERENCES ")
; End
;;; si vous avez généré le fichier DIV0_17.pb commentez les 2 lignes précédentes et decommentez la ligne ; IncludeFile "DIV0_17.pb"
modulo=210*11*13*17
result$="2 3 5 7 11 13 17 "
Restore DIV_017
Case 18 To 19
; messagerequester(" ATTENTION", " Pour utiliser le p_fact(17) ou p_fact(19)il faut générer le fichier DIV0_17.pb ou DIV0_19.pb"+#CRLF$+" avec le prg GENERATEUR_DU_VECTEUR_DES_DIFFERENCES ")
; end
;;; si vous avez généré le fichier DIV0_19.pb commentez les 2 lignes précédentes et decommentez la ligne ; IncludeFile "DIV0_19.pb"
modulo=210*11*13*17*19
result$="2 3 5 7 11 13 17 19 "
Restore DIV_019
; Case 20 To 23 ; trop grand pour le bénéfice à en tirer
; Restore DIV_023
EndSelect
Read.l *EL\PREMDIV
i_prem=*EL\PREMDIV
i=0
*el\SDIF(0)=1
Repeat
Read.l ELEM
If ELEM<>0
*EL\TDIF(I+1)=elem
*el\SDIF(I+1)=i_prem
; *el\prem(i_prem)\i_ind=I+1
; *el\prem(i_prem)\DIF=elem
i_prem+elem
; *EL\TDIF(I)=elem
i+1
EndIf
Until ELEM=0
*el\TDIF(0)=*EL\TDIF(I)
*EL\NBSEQ=I
NBSEQ=I
ipas=0
;************************************* Utilisation de la table TDIF ******************************
; PREMDIV.l NBSEQ.l
; L'exploitation de cette table est réalisée sur NBSEQ avec :
; de 1 à 8 avec le premier nombre PREMDIV
; ou de 0 à 7 avec le premier nombre si le reste de la division est 1
DataSection
DIV_02:
; IncludeFile "DIV0_2.pb"
DATA.L 3,2,0 ;
;; Modulo=2 Nb d'éléments dans vecteur=1 GAin=50%
div_03:
; IncludeFile "DIV0_3.pb"
DATA.L 5,2,4,0 ;
;; Modulo=6 Nb d'éléments dans vecteur=2 GAin=67%
DIV_05:
; IncludeFile "DIV0_5.pb"
DATA.L 7,4,2,4,2,4,6,2,6,0 ;
;; Modulo=30 Nb d'éléments dans vecteur=8 GAin=73%
DIV_07:
; IncludeFile "DIV_7.pb"
DATA.L 11,2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,2,10,0 ;
;; Modulo=210 Nb d'éléments dans vecteur=48 GAin=77%
div_011:
; IncludeFile "DIV_11.pb"
DATA.L 13,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6,6,4,2,4,6,2,10,2,4,2,12,10,2,4,2,4,6,2,6,4,6,6,6,2,6,4,2,6,4,6,8,4,2,4,6,8,6,10,2,4,6,2,6,6,4,2,4,6,2,6,4,2,6,10,2,10,2,4,2,4,6,8,4,2,4,12,2,6,4,2
Data.L 6,4,6,12,2,4,2,4,8,6,4,6,2,4,6,2,6,10,2,4,6,2,6,4,2,4,2,10,2,10,2,4,6,6,2,6,6,4,6,6,2,6,4,2,6,4,6,8,4,2,6,4,8,6,4,6,2,4,6,8,6,4,2,10,2,6,4,2,4,2,10,2,10,2,4,2,4,8,6,4,2,4,6,6,2,6,4,8,4,6,8,4,2,4,2,4,8,6,4,6,6
Data.L 6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,2,10,2,6,4,6,2,6,4,2,4,6,6,8,4,2,6,10,8,4,2,4,2,4,8,10,6,2,4,8,6,6,4,2,4,6,2,6,4,6,2,10,2,10,2,4,2,4,6,2,6,4,2,4,6,6,2,6,6,6,4,6,8,4,2,4,2,4,8,6,4,8,4,6,2,6,6,4,2,4,6,8,4,2,4,2
Data.L 10,2,10,2,4,2,4,6,2,10,2,4,6,8,6,4,2,6,4,6,8,4,6,2,4,8,6,4,6,2,4,6,2,6,6,4,6,6,2,6,6,4,2,10,2,10,2,4,2,4,6,2,6,4,2,10,6,2,6,4,2,6,4,6,8,4,2,4,2,12,6,4,6,2,4,6,2,12,4,2,4,8,6,4,2,4,2,10,2,10,6,2,4,6,2,6,4,2,4,6,6
Data.L 2,6,4,2,10,6,8,6,4,2,4,8,6,4,6,2,4,6,2,6,6,6,4,6,2,6,4,2,4,2,10,12,2,4,2,10,2,6,4,2,4,6,6,2,10,2,6,4,14,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,12,2,12,0 ;
;; Modulo=2310 Nb d'éléments dans vecteur=480 GAin=79%
;***************************************************************************************************************************************************************************
;********* A partir de p_fact(13) sous div_013 le vecteur généré et trop important pour être placer ici ************
;********* pour générer le vecteur dans le même répertoire sous forme de fichier utiliser le prg GENERATEUR_DE_VECTEURS_DES_DIFFERENCES pour 13 17 et 19 ************
;***************************************************************************************************************************************************************************
div_013:
; IncludeFile "DIV0_13.pb"
DATA.L 17,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6,6,4,6,6,2,10,2,4,2,12,12,4,2,4,6,2,10,6,6,6,2,6,4,2,6,4,14,4,2,4,6,8,6,10,2,4,6,2,6,6,6,4,6,2,6,4,8,10,2,10,2,4,2,4,6,8,4,2,4,12,8,4,2,6,4,6,12,2,4,2,12
Data.L 6,4,6,6,6,2,6,10,2,4,6,2,6,6,4,2,10,2,10,2,4,6,6,2,6,6,4,6,8,6,4,2,6,4,6,8,4,2,6,4,8,6,4,8,4,6,8,10,2,10,2,6,4,2,4,2,10,2,10,2,4,2,4,14,4,2,4,6,6,2,6,4,8,10,8,4,2,4,6,8,6,4,6,6,6,2,6,6,4,2,4,6,2,10,2,4,2,10,2,10,2
Data.L 6,4,8,6,4,2,4,6,6,8,4,2,6,10,8,4,2,6,4,8,10,6,2,4,8,6,6,4,2,4,6,2,6,4,6,2,10,12,2,4,2,4,6,2,6,4,2,4,12,2,6,6,10,6,8,4,2,4,2,4,8,6,12,4,6,2,12,4,2,4,6,8,4,2,4,2,12,10,2,4,2,4,6,2,10,2,4,6,8,6,4,2,6,4,6,8,4,6,2,4,8
Data.L 6,4,6,2,4,6,2,6,6,4,6,6,8,6,4,2,10,2,10,2,4,2,10,2,6,4,2,10,6,2,6,4,2,6,4,6,8,6,4,2,12,10,6,2,4,6,2,12,4,2,4,8,6,4,2,4,2,10,2,10,6,2,4,6,2,6,4,2,10,6,2,6,4,12,6,8,6,4,2,4,8,6,4,6,2,4,6,8,6,6,4,6,2,6,4,2,4,2,10,12,2
Data.L 4,12,2,6,4,2,4,6,6,2,12,6,4,18,2,4,2,4,8,6,4,6,2,4,8,6,6,4,2,4,6,2,6,4,2,4,12,2,12,6,4,6,2,6,4,6,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6,6,4,2,10,2,10,2,4,14,10,2,4,2,4,6,2,6,10,6,6,2,10,2,6,4,6,8,4,2,4,6,8,6
Data.L 10,2,4,6,2,6,6,4,2,4,6,2,6,4,2,6,10,2,10,6,2,4,6,8,4,2,4,12,2,6,4,2,6,4,6,12,2,4,2,4,8,6,4,6,2,10,2,6,10,6,6,2,6,4,2,4,2,10,2,12,4,6,6,2,12,4,6,6,2,6,4,2,6,4,14,4,2,6,4,8,6,4,6,2,4,6,8,6,6,10,2,6,4,6,2,10,2,10,2,4,2
Data.L 4,8,6,4,2,4,6,6,8,4,8,4,6,8,4,2,4,2,12,6,4,6,6,6,2,6,6,4,2,4,6,2,6,6,4,2,10,2,10,2,6,4,6,2,6,4,2,4,6,14,4,2,6,10,8,4,2,4,2,4,8,10,8,4,8,6,10,2,4,6,2,6,4,6,2,10,2,10,2,4,2,4,6,8,4,2,4,6,6,2,6,6,6,10,8,4,2,4,6,8,6
Data.L 4,8,4,6,2,6,6,4,2,4,6,12,2,4,2,10,2,10,2,4,2,4,8,10,2,4,6,8,6,4,2,6,4,6,8,4,8,4,8,6,4,6,2,4,6,2,6,6,4,6,6,2,6,6,4,2,10,12,2,4,2,4,6,2,6,4,2,16,2,6,4,2,10,6,8,4,2,4,2,12,6,10,2,4,6,2,12,4,2,4,8,6,4,2,4,2,12,10,6,2,4
Data.L 6,2,6,4,2,4,6,6,2,6,4,2,10,6,8,10,2,4,8,6,4,6,2,4,6,2,6,6,6,4,6,8,4,2,4,2,10,12,2,4,2,10,2,6,4,2,4,6,6,2,10,2,6,4,14,6,4,2,4,8,10,6,2,4,6,2,6,6,4,2,4,8,6,4,2,4,12,2,12,4,2,4,6,2,6,4,2,10,6,2,6,4,8,4,6,8,4,2,4,2,4
Data.L 14,4,6,2,10,8,6,4,2,4,6,2,10,2,4,2,12,10,2,4,6,6,2,6,4,6,6,6,2,6,6,6,4,6,12,2,4,6,8,6,10,2,4,8,6,6,4,2,4,6,2,6,4,2,6,10,2,10,2,6,4,6,8,4,6,12,2,6,4,2,6,4,6,12,2,4,2,4,14,4,6,2,4,6,2,6,10,2,10,2,6,4,2,4,12,2,10,2,4,6,6
Data.L 2,6,6,4,6,6,2,10,2,6,4,6,8,4,2,6,4,8,6,4,6,2,4,6,8,6,4,2,10,2,6,4,2,6,10,2,10,6,2,4,8,6,4,2,4,6,6,2,6,4,8,4,6,8,4,2,4,2,4,8,6,4,6,12,2,6,6,4,6,6,2,6,4,2,4,2,10,2,12,6,4,6,2,10,2,4,6,6,8,4,2,6,18,4,2,4,2,4,8,10,6
Data.L 2,4,8,6,6,6,4,6,2,6,4,6,2,10,2,10,2,4,2,4,6,2,6,4,2,4,6,6,8,6,6,4,6,8,4,2,4,2,12,6,4,12,6,2,6,6,4,2,4,6,8,6,4,2,10,2,10,2,4,2,4,6,2,10,2,4,6,8,6,4,2,6,4,6,8,4,6,2,4,8,6,4,8,4,6,2,6,10,6,6,2,6,6,4,2,10,2,10,2,4,2
Data.L 4,6,8,4,2,10,6,2,6,4,2,6,10,8,4,2,4,14,6,4,6,2,4,6,2,12,4,2,4,8,10,2,4,2,10,2,10,6,2,4,8,6,4,2,4,6,6,2,6,4,2,10,6,8,6,6,4,8,6,4,6,2,4,6,2,6,6,6,4,6,2,6,4,2,4,2,10,12,2,4,2,10,2,6,4,2,4,12,2,10,2,10,14,4,2,4,2,4,8,6,10
Data.L 2,4,6,2,12,4,2,4,6,2,6,4,2,4,14,12,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,6,2,4,14,4,6,2,10,2,6,6,4,2,4,6,12,2,4,2,12,10,2,4,2,10,2,6,4,6,6,6,2,6,4,2,6,4,6,8,6,4,6,8,16,2,4,6,2,6,6,4,2,4,8,6,4,2,6,10,2,10,2,4,2,4
Data.L 6,8,4,2,16,2,6,4,8,4,6,12,2,4,2,4,8,6,4,6,2,4,6,8,10,2,4,6,2,6,4,2,4,2,10,2,10,2,4,6,6,2,6,6,4,6,6,2,6,6,6,4,6,12,2,6,4,8,6,4,6,2,4,14,6,4,2,10,2,6,4,2,4,2,10,2,10,2,6,4,8,6,4,6,6,6,2,6,4,8,4,6,8,4,2,4,2,4,14,4,6
Data.L 6,6,2,6,6,4,2,10,2,6,4,2,4,12,2,10,2,6,4,6,2,6,6,4,6,6,12,2,6,10,8,4,2,4,2,4,8,10,6,2,4,8,6,6,4,2,4,6,2,6,4,8,10,2,10,6,2,4,6,2,6,4,2,4,6,6,2,6,6,6,4,6,8,4,2,4,2,4,8,6,4,8,10,2,6,6,4,6,6,8,4,2,4,2,10,2,12,4,2,4,6
Data.L 2,10,2,4,6,8,6,4,2,6,4,14,4,6,2,4,8,6,4,6,2,4,6,2,6,6,10,6,2,6,10,2,10,2,10,2,4,2,4,6,2,6,4,2,10,6,8,4,2,6,4,6,8,4,2,4,2,12,6,4,6,6,6,2,12,4,2,4,8,6,6,4,2,10,2,10,6,2,4,6,2,6,4,2,4,6,8,6,4,2,10,6,8,6,4,2,4,8,6,4,8
Data.L 4,6,2,6,12,4,6,2,6,4,2,4,2,10,12,2,4,2,10,8,4,2,4,6,6,2,10,2,6,18,4,2,4,6,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,10,2,4,12,2,12,4,2,4,8,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,6,4,14,4,6,2,10,2,6,6,4,2,4,6,2,10,2,4,2,22,2,4,2,4,6,2
Data.L 6,4,6,12,2,6,4,2,10,6,8,4,2,4,6,8,6,10,2,4,6,2,12,4,2,4,6,2,6,4,2,6,12,10,2,4,2,4,6,8,4,2,4,12,2,6,4,2,6,4,6,12,6,2,4,8,6,4,6,2,4,6,2,6,10,2,4,6,8,4,2,4,2,10,2,10,2,4,12,2,6,6,4,6,6,2,6,4,2,6,4,6,8,6,6,4,8,10,6,2,4
Data.L 6,8,6,4,2,12,6,4,2,4,2,10,2,10,2,4,2,4,8,6,4,2,10,6,2,6,4,8,4,6,8,4,2,4,2,4,8,6,4,6,6,6,8,6,4,2,4,6,2,6,4,2,4,2,10,2,10,2,10,6,2,6,4,2,4,6,6,8,6,6,10,12,2,4,2,4,8,10,6,2,4,8,6,6,4,2,4,6,2,6,4,6,2,10,2,10,2,6,4,6,2
Data.L 6,4,6,6,6,2,6,6,6,4,6,8,4,2,4,2,4,14,4,8,4,6,2,6,6,4,2,10,8,4,2,4,12,2,10,2,4,2,4,6,2,12,4,6,8,10,2,6,4,6,8,4,6,2,4,8,6,4,6,2,4,6,2,6,6,4,6,6,2,6,6,6,10,2,10,6,2,4,6,2,6,4,2,10,6,2,6,4,2,6,4,6,8,4,2,4,2,12,6,4,6
Data.L 2,10,2,12,4,6,8,6,4,2,4,2,10,2,16,2,4,6,2,10,2,4,6,6,2,6,4,2,10,14,6,4,2,4,8,6,4,6,2,4,6,2,6,6,6,4,6,2,6,4,6,2,10,12,2,4,2,10,2,6,4,2,4,6,6,12,2,6,4,14,4,2,4,2,12,6,4,6,6,6,2,6,6,4,2,4,6,2,6,6,4,12,2,12,4,2,4,6,2,6,4
Data.L 2,4,6,8,6,4,2,6,4,6,8,4,2,4,2,4,14,4,8,10,2,6,10,2,4,6,2,10,2,4,2,12,10,2,4,2,4,6,8,4,6,6,6,2,6,4,2,6,10,8,4,2,4,6,8,6,10,2,4,6,2,6,6,4,2,4,6,2,10,2,6,10,2,10,2,4,2,4,14,4,2,4,12,2,6,4,2,6,4,6,12,2,6,4,8,6,4,6,2,4,6
Data.L 2,6,10,2,4,6,2,6,4,2,4,2,10,12,2,4,6,6,2,6,6,4,12,2,6,4,2,10,6,8,4,2,6,4,8,6,10,2,4,6,14,4,2,10,2,6,4,2,4,2,12,10,2,4,2,4,8,6,4,2,4,6,6,2,6,4,8,4,6,8,4,6,2,4,8,6,4,6,6,6,2,6,6,4,2,4,6,8,4,2,4,2,10,2,10,2,6,10,2,6,4
Data.L 2,4,6,6,8,4,2,6,10,8,6,4,2,4,8,10,6,2,4,8,6,6,4,2,4,8,6,4,6,2,10,2,10,2,4,2,4,6,2,6,4,2,10,6,2,6,12,4,6,8,4,2,4,2,4,8,6,4,8,4,6,8,6,4,2,4,6,8,4,2,4,2,10,2,10,2,4,6,6,2,10,2,4,6,8,6,6,6,4,6,12,6,2,4,8,6,4,6,2,4,8
Data.L 6,6,4,6,6,2,6,6,4,2,10,2,10,2,6,4,6,2,6,4,12,6,2,6,4,2,6,4,6,8,4,2,4,2,18,4,6,2,4,6,2,12,4,2,12,6,4,2,4,12,2,10,6,2,4,6,2,6,6,4,6,6,2,10,2,10,6,8,6,4,2,4,8,6,4,6,2,4,6,2,6,6,6,4,6,2,6,4,2,6,10,12,6,2,10,2,6,4,2,4,6
Data.L 6,2,10,2,6,4,14,4,2,4,2,4,8,6,4,6,2,10,2,6,6,4,6,6,2,6,4,2,4,12,2,12,4,2,4,6,2,10,2,4,6,6,2,6,4,2,6,4,14,4,2,4,2,4,14,4,6,2,10,2,6,6,6,4,6,2,10,6,2,12,10,2,4,2,4,6,2,6,4,6,6,6,8,4,2,6,4,6,8,4,2,4,14,6,10,6,6,2,6,6,4
Data.L 2,4,6,2,6,6,6,10,2,10,2,4,2,4,6,8,4,2,4,14,6,4,2,6,4,6,12,2,4,2,4,8,6,4,8,4,6,2,6,10,2,4,6,2,6,4,2,4,2,10,2,10,2,4,6,6,8,6,4,6,6,2,6,4,2,6,10,8,4,2,10,8,6,4,6,2,4,6,8,6,4,2,10,2,10,2,4,2,10,2,10,2,4,2,4,8,6,4,2,4,6
Data.L 6,2,6,4,8,4,6,8,4,2,6,4,8,6,4,6,6,6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,12,2,6,4,6,2,6,4,2,4,12,8,4,2,16,8,4,2,4,2,4,8,16,2,4,8,12,4,2,4,6,2,6,4,6,2,12,10,2,4,2,4,6,2,6,4,2,4,6,6,2,6,6,6,4,6,8,4,6,2,4,8,6,4,8,4,6,2,6
Data.L 6,4,2,4,6,8,4,2,4,2,10,2,10,2,4,2,10,2,10,2,4,6,8,6,4,2,6,4,6,8,10,2,4,8,10,6,2,4,6,2,6,6,4,6,8,6,6,4,2,10,2,10,2,4,2,4,6,2,6,4,2,10,6,2,6,4,8,4,6,8,4,2,4,2,12,6,4,6,2,4,6,14,4,2,4,8,6,4,2,4,2,10,2,10,6,6,6,2,6,4,2
Data.L 4,6,6,2,6,6,10,6,14,4,2,4,8,6,4,6,2,4,8,6,6,6,4,6,2,6,4,2,4,2,10,12,2,6,10,2,6,4,6,6,6,2,10,2,6,4,14,4,2,4,2,4,14,4,6,2,4,6,2,6,6,4,2,10,2,6,4,2,4,12,2,12,4,2,4,6,2,6,6,4,6,6,2,10,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6
Data.L 6,4,2,4,6,2,10,2,6,12,10,6,2,4,6,2,6,4,6,6,6,2,6,4,2,6,4,6,8,4,2,4,6,8,6,10,2,10,2,6,6,4,6,6,2,6,4,2,6,10,2,12,4,2,4,6,12,2,4,12,2,6,4,2,6,4,18,2,4,2,4,8,6,4,6,2,4,6,2,6,12,4,6,2,6,4,6,2,10,2,10,2,4,6,6,2,6,6,4,6,6
Data.L 8,4,2,6,4,6,8,4,2,6,12,6,4,6,6,6,8,6,4,2,10,2,6,6,4,2,10,2,10,2,4,2,4,8,6,4,2,4,6,8,6,4,8,4,6,8,4,2,4,2,4,8,6,4,12,6,2,6,10,2,4,6,2,6,4,2,4,2,10,2,10,2,6,4,6,8,4,2,4,6,6,8,4,2,6,10,8,4,2,4,6,8,10,6,2,4,8,6,6,4,2
Data.L 4,6,2,10,6,2,10,2,10,2,4,2,4,8,6,4,2,4,6,6,2,6,6,6,4,6,8,4,2,6,4,8,6,4,8,4,6,2,6,6,4,2,4,6,8,4,2,4,2,10,12,2,4,2,4,6,2,10,2,4,14,6,4,2,10,6,8,4,6,2,4,8,6,10,2,4,6,2,12,4,6,6,2,6,6,4,2,12,10,2,4,2,4,6,2,6,4,2,10,6,2
Data.L 6,4,2,6,4,6,8,4,6,2,12,6,4,6,2,4,6,2,12,4,2,4,14,4,2,4,2,10,2,10,6,2,10,2,6,4,2,4,6,6,2,6,4,2,10,6,8,6,4,2,4,8,10,6,2,4,6,2,6,6,6,4,8,6,4,2,4,2,10,12,2,4,2,10,2,6,4,2,10,6,2,10,8,4,14,4,2,4,2,4,8,6,4,6,2,4,6,8,6,4,2
Data.L 4,6,2,6,4,2,4,12,2,12,4,6,6,2,6,4,2,4,6,6,2,6,6,6,4,6,12,2,4,2,4,14,4,6,2,12,6,6,4,2,4,6,2,10,2,4,2,12,10,2,6,4,6,2,6,4,6,6,6,2,6,4,2,6,4,6,8,4,2,4,6,14,10,2,4,6,2,6,6,4,2,10,2,6,4,2,16,2,10,2,4,2,4,6,8,6,4,12,2,10,2
Data.L 6,4,6,12,2,4,2,4,8,6,4,6,2,4,6,2,6,10,2,4,6,2,6,4,2,6,10,2,10,6,6,6,2,6,6,4,6,6,2,6,4,2,6,4,6,8,4,2,6,4,8,6,4,6,2,10,8,6,4,12,2,6,4,2,4,2,10,2,12,4,2,4,8,10,2,4,6,6,2,6,4,8,4,14,4,2,4,2,4,8,6,4,6,6,6,2,6,6,6,4,6
Data.L 2,6,4,6,2,10,2,10,2,6,4,6,2,6,4,2,4,6,6,8,4,2,6,10,8,4,2,4,2,12,10,6,6,8,6,6,4,2,4,6,2,6,10,2,10,2,10,2,4,2,4,6,2,6,4,2,4,6,8,6,6,6,4,6,8,4,2,4,2,4,8,6,4,8,4,6,2,6,10,2,4,6,8,4,2,4,2,10,2,10,2,4,2,4,6,12,2,4,6,8,6
Data.L 4,2,6,10,8,4,6,6,8,6,4,6,2,4,6,2,6,6,4,6,6,2,12,4,2,10,2,10,2,4,2,4,8,6,4,2,10,6,2,6,4,2,6,4,6,8,4,2,6,12,6,4,6,2,4,6,2,12,4,2,4,8,6,4,2,4,2,10,12,6,2,4,6,2,6,4,2,4,12,2,6,4,2,10,6,8,6,4,2,4,8,6,10,2,4,6,2,12,6,4,6
Data.L 2,6,4,2,4,2,22,2,4,2,10,2,6,4,2,4,6,6,2,10,2,6,4,14,4,6,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,8,4,2,4,12,2,12,4,2,10,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,6,4,2,4,18,6,2,10,2,6,6,4,2,4,8,10,2,4,2,12,10,2,4,2,4,6,2,6,4,12,6,2,6,4
Data.L 8,4,6,8,4,2,4,6,8,6,10,2,4,6,8,6,4,2,4,6,2,6,4,2,6,10,2,10,2,4,6,6,8,4,2,4,12,2,6,6,6,4,6,12,2,4,2,4,8,6,4,6,2,4,8,6,10,2,4,6,2,6,4,2,4,2,10,2,10,2,10,6,2,6,10,6,6,2,6,4,2,6,4,6,8,4,2,6,4,14,4,6,2,4,6,8,6,4,2,10,2
Data.L 6,4,2,4,12,2,10,2,4,2,4,8,6,6,4,6,6,2,10,8,4,6,8,4,2,4,2,4,8,6,4,6,6,6,2,6,6,4,2,4,6,2,6,4,2,6,10,2,10,8,4,6,2,6,4,2,4,6,6,8,4,2,6,10,8,4,2,4,2,4,8,10,6,2,12,6,6,4,6,6,2,6,4,6,2,10,2,12,4,2,4,6,2,10,2,4,6,6,2,6,6
Data.L 6,4,14,4,2,4,2,4,8,6,4,8,4,6,2,6,6,6,4,6,8,4,6,2,10,2,10,2,4,2,4,6,2,10,2,4,6,14,4,2,6,4,6,8,4,6,2,12,6,4,6,6,6,2,6,6,4,6,6,2,6,6,4,2,10,2,10,2,4,2,4,6,2,6,4,2,10,8,6,4,2,6,4,6,8,4,2,4,2,12,6,4,8,4,6,2,16,2,4,8,6
Data.L 4,2,4,2,10,2,10,6,2,4,6,8,4,2,4,6,6,2,6,4,2,16,8,6,4,6,8,6,4,6,2,4,6,2,6,6,6,4,6,2,10,2,4,2,10,12,2,4,2,12,6,4,2,4,6,6,2,10,2,6,4,14,4,2,6,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,12,14,4,2,4,6,2,6,4,2,4,12,2,6,4,2
Data.L 10,6,8,4,2,4,2,4,14,10,2,10,2,12,4,2,4,6,2,10,2,4,2,12,10,2,4,2,4,6,2,6,4,6,6,6,2,6,4,2,6,4,6,8,4,6,6,8,6,10,2,4,6,2,6,6,4,2,4,6,8,4,2,6,10,2,10,2,4,2,10,8,4,2,4,12,2,6,4,2,6,4,6,14,4,2,4,8,10,6,2,4,6,2,6,10,2,4,8,6,4
Data.L 2,4,2,10,2,10,2,4,6,6,2,6,6,10,6,2,6,4,8,4,6,8,4,2,6,4,8,6,4,6,2,4,6,8,6,4,2,10,2,6,4,2,4,2,10,2,10,2,4,6,8,6,4,2,4,6,6,2,6,12,4,6,12,2,4,2,4,8,6,4,6,6,8,6,6,4,2,4,6,2,6,4,2,4,2,10,2,10,2,6,4,6,2,6,4,6,6,6,8,4,2
Data.L 6,10,8,4,2,4,2,4,18,6,2,4,8,6,6,4,2,10,2,6,4,6,12,2,10,2,4,2,4,6,2,6,6,4,6,6,2,12,6,4,6,8,4,2,4,2,4,8,6,4,8,4,6,2,6,6,4,2,4,6,8,4,2,6,10,2,10,6,2,4,6,2,10,2,4,6,8,6,4,2,6,4,6,8,4,6,2,4,8,6,4,6,2,10,2,6,6,4,6,6,2
Data.L 6,6,4,2,10,2,12,4,2,4,6,2,10,2,10,6,2,6,4,2,6,4,14,4,2,4,2,12,6,4,6,2,4,6,2,12,6,4,8,6,4,6,2,10,2,10,6,2,4,6,2,6,4,2,4,6,6,8,4,2,10,6,8,6,4,2,12,6,4,6,6,6,2,6,6,6,4,6,2,6,6,4,2,10,12,2,4,2,10,2,6,4,2,4,6,8,10,2,6,4,14
Data.L 4,2,4,2,4,8,6,4,8,4,6,2,6,10,2,4,6,2,6,4,2,4,12,2,12,4,2,4,6,8,4,2,4,6,6,2,6,4,2,6,10,8,4,2,4,6,14,4,6,2,10,2,6,6,4,2,4,6,2,10,2,4,2,12,10,2,4,2,4,8,6,4,6,6,6,2,6,4,2,6,4,6,8,4,2,10,8,6,10,2,4,6,2,6,6,4,2,4,6,2,6
Data.L 4,2,6,10,12,2,4,2,4,6,8,4,2,4,12,2,6,4,2,10,6,12,2,4,2,4,8,6,10,2,4,6,2,16,2,4,6,2,6,4,2,4,2,12,10,2,4,6,6,2,6,6,4,6,6,2,6,4,2,6,4,6,8,4,8,4,8,6,4,6,2,4,6,8,6,4,2,10,8,4,2,4,2,10,2,10,2,4,2,12,6,4,2,4,6,6,2,6,4,8,4
Data.L 6,8,6,4,2,4,8,10,6,6,6,2,6,6,4,2,4,8,6,4,2,4,2,10,2,10,2,6,4,6,2,6,4,2,10,6,8,4,8,10,8,4,2,4,2,4,8,10,6,2,4,14,6,4,2,4,6,2,6,4,6,2,10,2,10,2,4,6,6,2,6,4,2,4,6,6,2,6,6,6,4,6,12,2,4,2,4,8,6,4,8,4,8,6,6,4,2,4,6,8,4
Data.L 2,4,2,10,2,10,2,6,4,6,2,10,6,6,8,6,4,2,6,4,6,8,4,6,2,4,14,4,6,2,4,6,2,6,6,4,12,2,6,6,4,12,2,10,2,4,2,4,6,2,6,6,10,6,2,10,2,6,4,6,8,4,2,4,2,12,6,4,6,2,4,6,2,12,4,2,4,8,6,4,2,6,10,2,10,6,2,4,6,2,6,4,2,4,6,6,2,6,4,2,10
Data.L 6,8,6,4,2,4,8,6,4,6,2,10,2,6,6,10,6,2,6,4,2,4,2,10,14,4,2,10,2,10,2,4,6,6,2,10,2,6,4,14,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,6,4,6,2,6,4,6,12,2,12,4,2,4,6,2,6,4,2,4,6,6,8,4,2,6,4,6,8,4,2,4,2,18,4,6,12,2,6,6,4,2,4,6,2,12,4
Data.L 2,12,10,2,4,2,4,6,2,6,4,6,6,8,6,4,2,6,4,6,8,4,2,4,6,8,6,12,4,6,2,6,10,2,4,6,2,6,4,2,6,10,2,10,2,4,2,4,6,8,4,2,4,12,2,6,4,2,6,10,12,2,4,6,8,6,4,6,2,4,6,2,6,10,2,4,6,2,10,2,4,2,10,2,10,2,4,6,8,6,6,4,6,6,2,6,4,2,6,4,6
Data.L 8,4,2,6,4,8,6,4,6,2,4,6,8,6,4,2,10,2,6,4,2,4,2,10,12,2,4,2,4,8,6,4,2,4,12,2,6,4,12,6,8,4,2,4,2,4,8,6,10,6,6,2,12,4,2,4,6,2,6,4,2,4,2,12,10,2,6,4,6,2,6,4,2,4,6,6,8,4,2,6,10,8,4,6,2,4,8,10,6,2,4,8,6,6,4,2,4,6,8,4,6
Data.L 2,10,2,10,2,4,2,10,2,6,4,2,4,6,6,2,6,6,6,4,6,8,6,4,2,4,8,10,8,4,6,2,6,6,4,2,4,14,4,2,4,2,10,2,10,2,4,2,4,6,2,10,2,10,8,6,4,8,4,6,8,4,6,2,4,8,6,4,6,2,4,6,8,6,4,6,6,2,6,6,4,2,10,2,10,2,4,6,6,2,6,4,2,10,6,2,6,6,6,4,6
Data.L 12,2,4,2,12,6,4,6,2,4,8,12,4,2,4,8,6,4,2,4,2,10,2,10,8,4,6,2,6,4,6,6,6,2,6,4,2,10,6,8,6,4,2,4,14,4,6,2,4,6,2,6,6,6,10,2,6,4,2,4,12,12,2,4,2,10,2,6,6,4,6,6,2,10,2,6,4,14,4,2,4,2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2
Data.L 16,2,16,0 ;
;; Modulo=30030 Nb déléments dans vecteur=5760 GAin=81%
div_017:
IncludeFile "DIV0_17.pb"
;; Modulo=510510 Nb d'éléments dans vecteur=92160 GAin=82%
div_019:
IncludeFile "DIV0_19.pb"
;; Modulo=9699690 Nb d'éléments dans vecteur=1658880 GAin=83%
; ; div_023:
; ; IncludeFile "DIV0_23.pb"
; ;; Modulo=223092870 Nb d'éléments dans vecteur=36495360 Gain=836% il n'y a pas beaucoup de gain par rapport à p-fact(19)
EndDataSection
EndProcedure
choix_div(SEQD)
define MIN.Q=1E12, mess$,nb$,pos, logmin, logmax, rmes,MIN_DEP.Q,ZONEP.Q
define MAX.Q=MIN+1E4
define ind, ind_dep,DIFF,divis.q,FLAGFIN,IND_NB,CENTM,DIVISM,IND_D, DIVIS$,MAXDIV.q,dep_time.q,cent,mins.q
mess$=""
SAISIE2:
mess$+"MIN Blanc +Zone à explorer avec MAX=MIN+1Ex <= 1E2 +1E3 "
If Len(mess$)>250
MessageRequester("Erreur","Donnez Min BLANC et Zone à explorer sous forme 1E3 +1E3 1E4 +1E4 1E9 +1E4 "+#CR$+"Relancez le prg") ;
End
EndIf
nb$=ltrim(InputRequester(mess$,"MIN Blanc +Zone à explorer avec MAX=MIN+1Ex <= 1E2 +1E3 ","1E9 +1E4"));
pos=findstring(nb$," ")
MIN=vald(nb$)
ZONEP.Q=vald(ltrim(right(NB$,len(nb$)-pos)))
MAX=MIN+ZONEP
if MAX<=MIN or MIN<0 or MIN=>$7FFFFFFFFFFFFFFF ;;; = 9223372036854775807 valeur max positive en .q
goto SAISIE2
endif
logmin=log10(MIN)
logmax=log10(max-min)
if logmin+logmax>22
rmes=messagerequester(" ATTENTION Temps très long","Oui=>continuez Non=>donnez autre zone",#PB_MessageRequester_YesNo)
If Rmes = 6 ; le bouton Oui a été choisi (Resultat = 6)
Else ; le bouton Non a été choisi (Resultat = 7)
goto SAISIE2
EndIf
endif
MIN_DEP=MIN
if min=>Rest
result$=""
else
min=Rest
endif
; ******** sysnchronistion des Nombres à tester avec le vecteur des différences ***********
define restd.q=MIN%modulo
for ind=0 to modulo
if restd<=seqd\SDIF(ind)
ind_dep=ind
break
endif
next
DIFF=seqd\SDIF(ind_dep)-restd
MIN+DIFF
;************** Fin de sysnchronisation *************************************************
divis.q=SEQD\PREMDIV
flagfin=0
maxdiv.q=pow(min,0.5)
IND_NB=ind_dep
OpenConsole()
centm=min/100
divis$=str(min)+" "
divism=0
dep_time.q=ElapsedMilliseconds()
repeat
Ind_d=1
while divis<=maxdiv; or FLAGFIN>0
if MIN%divis =0
FLAGFIN+1
break
else
divis+ SEQD\TDIF(Ind_d)
Ind_d+1
if Ind_d>SEQD\NBSEQ
Ind_d=1;;; ;;; remise à 1 si le cycle des différences est atteint pour l'incrémentation des diviseurs susceptibles d'être premiers
endif
endif
Wend
if flagfin=0
; debug _n(MIN)
cent=min/100
if centm<>cent
printn(result$)
centm=cent
result$=str(min)+" "
else
result$+str(min)+" "
endif
Else
flagfin=0
endif
MIN+ seqd\TDIF(ind_nb)
;************************************************ Recherche de la racine carré ***************************************************************
; !FILD qword[v_MIN]
; !FSQRT
; ; !FISTTP dword [v_MAXDIV] ; avec arrondi si vous décommentez cette instruction commentez la précédente
; ; et laissez le ! car l'instruction FISTTP n'est pas reconnue par PureBasic avec !FISTTP c'est tout bon !!!!
; !FISTP dword[v_MAXDIV] ; sans arrondi
; maxdiv.q=pow(min,0.5)
maxdiv.q=sqr(MIN)
divis=SEQD\PREMDIV
ind_nb+1
if ind_nb>SEQD\NBSEQ-1
ind_nb=0 ;;; remise à zéro si le cycle des différences est atteint pour incrémentation des nombres susceptibles d'être premiers
endif
until min>max or min<0 ;;Si vous n'allez pas aux confins de la machine =$7FFFFFFFFFFFFFFF ;;; = 9223372036854775807 valeur max positive en ..q.
;; Vous pouvez retirer (or min<0) ou dépassement de $7FFFFFFFFFFFFFFF
printn(result$)
Printn( "Nombre Minimal = "+FormatNumber(MIN_DEP, 0, " ", " ")+" Nombre Maximal = "+FormatNumber(MAX, 0, " ", " "))
printn("Temps millisecondes ="+str(ElapsedMilliseconds()-dep_time))
input()
CloseConsole()
; debug " "
; ***************** Ci dessous les Nombres premiers pour les 1000 premiers nombres
; 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
; 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
; 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293
; 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
; 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499
; 503 509 521 523 541 547 557 563 569 571 577 587 593 599
; 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691
; 701 709 719 727 733 739 743 751 757 761 769 773 787 797
; 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887
; 907 911 919 929 937 941 947 953 967 971 977 983 991 997
Ce prg n’est pas optimisé. La seul optimisation est la racine carré de MIN réalisée en ASM qui me fait gagner 1 seconde sur 50 secondes soit 2% c’est peu.
Le point capital pour gagner de la vitesse est surtout la boucle des diviseurs répétée autant de fois qu’il y a de nombre entre MIN et MAX=MIN+zone à explorer par le nombre de diviseurs du nb_prem à la racine carré de Nb_dep. Boucle while à wend
On peut encore gagner du temps sur la boucle de nombres susceptibles d’être premiers
Si vous n'allez pas aux confins de la machine =$7FFFFFFFFFFFFFFF = 9223372036854775807
valeur max positive en ..q. Vous pouvez retirer (or min<0) ou dépassement de $7FFFFFFFFFFFFFFF
Ici le prg GENERATEUR_DU_VECTEUR_DES_DIFFERENCES à placer dans le même répertoire que le prg précédent.
Pour l’exemple voici un test réalisé aux limites des possibilités du calcul juste inférieur à MIN=$7FFFFFFFFFFFFFFF-1e4 avec une zone d’exploration de 100000