Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#601 Re : Programmation » crible en python » 28-04-2018 12:39:53
Re,
En gros, au total, chez toi, 1,93 s de traitement pour n =24000000. Bon, satisfaisant, alors...
c'est très très bon
Maintenant, après le comment, pour gratter encore, je ne vais pas pouvoir faire l'économie du pourquoi...
Ça me permettrait de voir si la transcription en Python de la méthode ne peut pas être pensée différemment.@+
c'est à dire: comment penser différemment ??
je ne vois pas ce que l'on pourrait encore , dans ta dernière version je ne pense pas ....
la seule pensée différente et de la méthode, reste la méthode par famille.... et Un bon restau...à ma charge non...???
cela permet de voir la répartition par famille...etc etc ..
déjà la fonction, N /ln 2N = pi(g) ("où pi(g) est la fonction qui compte les [1] donc les nombres premiers de N à 2N") est évidente avec ce crible , mais je laisse cela aux Matheux...il n'auront aucun mal à le démontrer rigoureusement ci l'envie leur prend.... personnellement c'est inutile car évident...
@+
#602 Re : Programmation » crible en python » 28-04-2018 12:09:03
test avec G5 :
Donnez la valeur de n = 30k : 3000000000
CribleG5 mod30 : Initialisation: 38.34886860847473 seconds ---
CribleG5 mod30 : Famille de chaque Pi: 3.7284064292907715 seconds ---
CribleG5 mod30 : Criblage des 8 familles: 170.47709965705872 seconds ---
CribleG5 mod30 : Extraction des premiers n à 2*n : 83.14814591407776 seconds ---
On a 135095831 nombres premiers
Appuyez sur une touche pour continuer...
on est passé de 40 minutes pour la version d'origine avec une limite à 900 méga en ayant modifié Eratosthène et compagnie à
un peu moins de 4 minutes et 3720 méga...
voila un bon court pour les étudiants.... comment aller plus vite..... et surtout l'étude de ce crible , car quand même personne ne l'a fait...et personne à par toi l'a programmé....
@+
#603 Re : Programmation » crible en python » 28-04-2018 11:54:47
je là copie et je re test donc ce serra cribleG5 mopd30
résultat :
Donnez la valeur de n = 30k : 24000000
CribleG5 mod30 : Initialisation: 0.32760047912597656 seconds ---
CribleG5 mod30 : Famille de chaque Pi: 0.015599966049194336 seconds ---
CribleG5 mod30 : Criblage des 8 familles: 1.029601812362671 seconds ---
CribleG5 mod30 : Extraction des premiers n à 2*n : 0.5616011619567871 seconds ---
On a 1381022 nombres premiers
Appuyez sur une touche pour continuer...
là ça envoie.....LoLLLL
#604 Re : Programmation » crible en python » 28-04-2018 11:39:03
voila chez moi ta new version:
Donnez la valeur de n = 30k : 24000000
CribleG4 mod30 : Initialisation: 0.32760071754455566 seconds ---
CribleG4 mod30 : Famille de chaque Pi: 0.015599727630615234 seconds ---
CribleG4 mod30 : Criblage des 8 familles: 1.1076023578643799 seconds ---
CribleG4 mod30 : Extraction des premiers n à 2*n : 0.5304009914398193 seconds ---
On a 1381022 nombres premiers
Appuyez sur une touche pour continuer...
qui est plus rapide que sur ton pc...
ton ancienne version :
Donnez la valeur de n = 30k : 24000000
CribleG3 mod30 : Initialisation: 0.32760071754455566 seconds ---
CribleG3 mod30 : Famille de chaque Pi: 0.015600204467773438 seconds ---
CribleG3 mod30 : Criblage des 8 familles: 1.1232020854949951 seconds ---
CribleG3 mod30 : Extraction des premiers n à 2*n : 0.5304012298583984 seconds ---
On a 1381022 nombres premiers
Appuyez sur une touche pour continuer...
mon ancienne
Donnez la valeur de N = 30k : 24000000
Crible mod30 : Initialisation: 0.35880064964294434 seconds ---
Crible mod30 : Famille de chaque Pi: 0.015599966049194336 seconds ---
Crible mod30 : Criblage des 8 familles: 1.1232020854949951 seconds ---
Crible mod30 : Extraction des premiers n à 2*n : 0.5460009574890137 seconds ---
On a 1381022 nombres premiers
Appuyez sur une touche pour continuer...
c'est presque quif quif ta dernière est plus rapide...
dans ton programme à chaque fois je change le nom de la version en: crible , cribleG3 et G4 pour m'y retrouver et les lancer...
#605 Re : Programmation » crible en python » 28-04-2018 11:17:35
Re,
J'ai dû regagner en vitesse par rapport à ma dernière version...
Mais je ne saisis pas :
- ta version chez moi est plus lente pour le tri de chaque famille que la mienne,
- ensuite, le criblage des 8 familles devient plus lent chez moi... Pourquoi ? J'ai plus de nombres à cribler ? A voir... C'est là que je perds du temps...Tu as quelle version de Python ? 3.x surement, mais x= ?
@+
non il ne peut pas y avoir plus de nombres car dans les deux cas tu as 24000000/30 = 800000 nombre[1] ou nbcell = n/30 * 1
ma version python est python- 3.6.4 amd (64bit)-webinstal ; version 3.6.4150.0 du 03 2018
#606 Re : Programmation » crible en python » 28-04-2018 10:07:32
Salut
Si c'est le cas, c'est illogique.
Je vais tout reprendre.
@+
non ....il y a un écart de 6%, regarde pour 3 720 000 000 entre les deux versions...
après de toutes les façons, ils bloquent tous les deux à 3 750 000 000
l'écart peut venir de python...car par exemple pour l'initialisation il y a des différence qui ne s'explique pas...puisque l'on range le 8 familles en colonne et que les nombres sont des [1] qui représentent 30k + la premières cellule = P8
le criblage c'est différent tout dépend commente il procède :
1) il a les P['i] de p ératosthène >5 , dans les deux cas c'est pareil ...
2) il calcule les restes R de 2n modulo p['i]
donc il a ses couples R et P[i'] et j= r['i] c'est R += p['i] si R pair ou R impair ...et += 2*p['i] si D_c==5
3) il prend le premier couple R et son p[i'] et la il va vérifier....
a) R pair il ajoute directement p[i'] cela devient j ...puis il va vérifier les j si j d_c ==5 il incrément += 2*p[i']
b) si d_c == [1,3,7,9] il va tester pour voir à quelle famille il appartient , pour ensuite le positionner dans sa famille et cribler cette famille avec son p['i] jusqu'au 8 familles .
alors est ce qu'il calcule les 8 j = R['i] ensuite il les place puis il cribles les 8 famille avec p[i'] en question.
ou est ce que lorsqu'il a j %30==11 "par exemple", avant de passer au suivant il le place de suite remplace la cell[1] par [0], il crible et il passe au j suivant, en ayant incr j+=2*p['i] jusqu'à ce qu'il ait fini p8 = [1.7.11.13.17.19.23.29]...?
Là est la question...????
c'est pour cela que dans mon dernier post je t'ai posé certaines questions pour éviter le %3==0...
pour ne vérifier et tester que les D_c==[1.3.7.9]...si jp8%30==0 sinon c'est un multiple de 3.
On a donc que deux divisions possibles par D_c==[1.3.7.9] soit 1 et 11 %30 ; 13 et 23 %30; 7 et 17 %30; 19 et 29%30...
D'autant que le quotient donne la position dans la famille :
Exemple j = 191, jD_c == 1; teste j11%30==0 donc famille 11 et position (191-11)/30 = 6 donc nbcll n°6 qui est la 7ème puisque l'on compte 0,1,2,3,4,5,6,7,8....<=n//30
idem si j1%30==0
sinon c'est que c'est un multiple de 3 on incrémente on passe au suivant... etc pour les 8j.
Ce qui devrait donner dans l'ordre d'exécution n=15030 , on prend pi = 7 , calcul du Reste de 2n % 7, R==2 donc pair .
2 +=7 donne j=R['i].on établit les 15j et on commence :
j==9 test j%30==19 or j%==29 ; suivant jincr += 2*7; j==23 test j%30==13 or j%==23 ok ,position 0 dans p8=[23] on change nbcell [1]en [0] et on crible...suivant j +=14 , j==37 test j %30==7 ok position 1 dans p8=[7] le [1] devient [0] on crible..j+=14 ,j==51; j%==1 or ==11 suiv; +=14 , j==65 suiv; +=14 , j==79 ;j%30==19 ok position 2 dans p8[19] le [1]evient[0] on crible..retour..+=14 , j==93 test j% 13 or 23 , suiv +=14; j==107, j%30==7 or 17 ok position 3 dans p8[17] le [1]devient[0] on crible..retour +=14, j==121 test j%30==1 ok position 4 dans p8[1] , le [1]devient[0] on crible ..retour ; +=14, j==135 ; +=14,j==149 test j%30==19 or 29 ok position 4 dans p8[29] le [1]devient[0] on crible ..retour; +=14, j==163 test j%30==13 ok position 5 dans p8[13] le[1]devient [0], on crible .. retour ; +=14, j==177 , j%30==7 or 17 suivant ; +=14, j==191 test j%30==1 or 11 ok position 6 dans p8[11] le [1]devient [0] on crible... Les 8 familles p[8] sont finies.
On réitère on prend le Pi suivant = 11, calcul du reste R = 8, j = 8+11 = 19 on incrémente pi*2 les 15 j et on recommence: .j==19 , test j%30 == 19 , ok position 0 dans p8=[19] le [1] devient [0], on crible avec 11....retour et suivant...etc etc
ensuite on passe au couple R et son p['i] suivant.... Ou bien on calcule tous les j puis on les place et on crible avec son p['i] , mais cela fait le double de manip en principe....
à la fin il n'y a pas de miracles puisque l'on compte que les nbcell==[1] les cell[0] ne donne pas de premiers de n à 2n..
voila je pense que connaissant ton indentation et le fonctionnement du crible ça ne peut pas poser problème....pour voir qu'elle est la meilleur façon de programmer ...
@+
#607 Re : Programmation » crible en python » 28-04-2018 08:16:15
Bonjour
@Yoshi ,voici un comparatif de temps entre l'ancienne version crible mod30 et ta nouvelle version CribleG3 mod30
on peut voir qu'en temps global il y a peu de différence et la limite maxi pour n est la même..
Donnez la valeur de N = 30k : 3690000000
Crible mod30 : Famille de chaque Pi: 128.8874261379242 seconds ---
Crible mod30 : Criblage des 8 familles: 472.961630821228 seconds ---
On a 164630426 nombres premiers
Appuyez sur une touche pour continuer...
Donnez la valeur de n = 30k : 3690000000
CribleG3 mod30 : Famille de chaque Pi: 56.830899715423584 seconds ---
CribleG3 mod30 : Criblage des 8 familles: 627.8699028491974 seconds ---
On a 164630426 nombres premiers
Appuyez sur une touche pour continuer...
Donnez la valeur de N = 30k : 3720000000
Crible mod30 : Famille de chaque Pi: 69.42012166976929 seconds ---
Crible mod30 : Criblage des 8 familles: 365.36824202537537 seconds ---
On a 165910122 nombres premiers
Appuyez sur une touche pour continuer...
Donnez la valeur de n = 30k : 3720000000
CribleG3 mod30 : Famille de chaque Pi: 35.318461894989014 seconds ---
CribleG3 mod30 : Criblage des 8 familles: 426.22394847869873 seconds ---
On a 165910122 nombres premiers
Appuyez sur une touche pour continuer...
j'ai à peu près compris le rôle de la fonction fam qui remplace l'indice ou la valeur de j (modulo 30) ; ainsi que la fonction jmod30 qui je suppose correspond à p8 [...]..
3. Comme les d_c que tu testais sont forcément impairs:
a) les restes pairs sont écartés
c'est à dire , qu'un reste R pair , correspondant à R de 2n par p['i] est transformé en R['i] = j impair, en y ajoutant p['i] pour vérifier à qu'elle famille il appartient et par rapport à sa D_c = [ 1,3,7,9]
car D_c = '5' n'à pas lieu d'être testé, on peut donc directement ajouter 2*p['i] ..non ? au lieu de faire une division j%5==0 ??
Mais comme les multiples de 3 se terminent aussi par D_c = [ 1,3,7,9]. Est ce que cela serait pas plus facile de faire :
si j = D_c==1 on teste si j %1 ==0 or j % 11==0 ; si l'un ou l'autre est oui, on passe au suivant en y ayant ajouté 2*pi...
sinon c'est un multiple de 3 et donc on passe au suivant..... ce qui éviterait peut être les divisions par 3 car il y en a pour chaque j, qui se termine par 1,3,7 ou 9 ce qui alourdi le programme....non ?
voila pourquoi il est aussi intéressant de ne travailler que sur une famille, quitte ensuite à modifier les paramètres de la famille pour en choisir une autre dans le programme...on teste uniquement la D_c de la famille en question avec une seule division...par exemple si on a fixée la famille fp = 1 si j = D_c==1 on fait j1%30==0 on le positionne et on crible avec son p['i] , sinon on passe au suivant j += 2*p['i]
puisque l'on a déjà tous les p ératosthène > 5, et leurs reste tel que : r.append(2*n % p['i]) ce qui donne :
si R est pair on ajoute p['i] et j = R['i] impair et on commence avec ce couple... si d_c =[3,5,7,9] on incrémente j += 2*p['i] et on passe au suivant.... ...etc
si R est impair donc = j , si D_c =[3,5,7,9] on incr = j += 2*p['i] ; si d_c ==1 on teste, si ok on positionne et on crible; sinon on incr et on passe au suivant....
Passe un bon week end et merci pour ton aide et pour tout....
#608 Re : Programmation » crible en python » 27-04-2018 17:38:05
Salut,
D'abord rectifie la dernière ligne :
os.system(pause) ---> os.system("pause") (guillemets autour de pause)
Ça devrait venir de là !
@+
et oui ...j'étais en train de te répondre...
#609 Re : Programmation » crible en python » 27-04-2018 17:35:18
j'ai trouvé la blague qui fermait la fenêtre .
à la fin dans la ligne :
os.system(pause) il n'y avait pas les ("pause")
voila pour n = 12000:
Donnez la valeur de n = 30k : 12000
Crible mod30 : Initialisation: 0.0 seconds ---
Crible mod30 : Famille de chaque Pi: 0.0 seconds ---
Crible mod30 : Criblage des 8 familles: 0.0 seconds ---
Crible mod30 : Extraction des premiers n à 2*n : 0.0 seconds ---
On a 1230 nombres premiers
Appuyez sur une touche pour continuer...
et tant qu'à faire n=3000 000 000
Donnez la valeur de n = 30k : 3000000000
Crible mod30 : Initialisation: 47.0496826171875 seconds ---
Crible mod30 : Famille de chaque Pi: 34.03925967216492 seconds ---
Crible mod30 : Criblage des 8 familles: 203.14035725593567 seconds ---
Crible mod30 : Extraction des premiers n à 2*n : 77.32933592796326 seconds ---
On a 135095831 nombres premiers
Appuyez sur une touche pour continuer...
un dernier n=3420000000 et ensuite je vais voir si je dépasse 3720 000 000
Donnez la valeur de n = 30k : 3420000000
Crible mod30 : Initialisation: 45.0372793674469 seconds ---
Crible mod30 : Famille de chaque Pi: 36.14526319503784 seconds ---
Crible mod30 : Criblage des 8 familles: 222.95559167861938 seconds ---
Crible mod30 : Extraction des premiers n à 2*n : 114.53540134429932 seconds ---
On a 153107189 nombres premiers
Appuyez sur une touche pour continuer...
au niveau rapidité on est toujours dans les 6 minutes pour 3 mds, je vais modifier F = j +p['i] *29 au lieu de 30...car je n'ai que les valeurs de j sans supplément ce qui ne change rien.. à piori c'est plus "stable" dans l'exécution...
je vais voir la limite.
ne t'embête pas pour charger pycharm ...Car il faut de toutes façon ne travailler que sur une Famille p8 = ['11'] ou fp = 11 ,par exemple
ce qui permettra de réduire les recherches D_c ['3','5','7','9'] et j += incr etc etc.
j += p[i]
d_c = j%10 # ça ne change pas en principe
la limite wile j < f , devrait être: wile j != %30 == 11 car on travaille famille 11(modulo 30) ..si c'est comme cela qu'il faut l'écrire
et enlever les lignes qui ne servent plus à rien, ainsi que l'initialisation qui se ferra sur une seule ligne ou colonne...
de ce fait on vérifie la décimale : d_c = '1' et si j 11%30== 0 sinon on passe au suivant ce qui limitera aussi les calculs, la vitesse et on va plus loin ....etc
et tu m'envoies la facture...par mail...@+
#610 Re : Programmation » crible en python » 27-04-2018 16:29:12
pour n=12000 avec mon ancienne indentation, c'est ok résultat:
Donnez la valeur de N = 30k : 12000
Crible mod30 : Famille de chaque Pi: 0.0 seconds ---
Crible mod30 : Criblage des 8 familles: 0.015600204467773438 seconds ---
On a 1230 nombres premiers
Appuyez sur une touche pour continuer...
par contre, ton indentation dans pycharm ,ne s'ouvre pas ...lorsque je lance, la fenêtre cmd se ferme de suite ????
avec qu'elle application tu lances ton programme....
#611 Re : Programmation » crible en python » 27-04-2018 16:06:56
re @Yoshi
je viens de faire dans Pycharm alt ctrl s
cela m'ouvre une fenêtre écrit en anglais donc je ne sais pas ce que je dois faire ....
je vais copier coller ton indentation je vérifie pour n = 12000 et je met le résultat si ok....
à tout de suite
#612 Re : Programmation » crible en python » 27-04-2018 08:07:55
yoshi Re,
pourquoi ces deux lignes à la fin : P=crible_mod30(n) et nb = len(P) au lieu de nb = len(crible_mod30(n)) uniquement
je l'ai fait c'est vrai que cela ne change rien...
ok Yoshi..
je viens de regarder le reste de ton post , c'est vrai que cela serra plus rapide et plus précis...
donc parfait , en attendant tes instructions afin de modifier "mon indentation dans Pycharm..."
actuellement pour n = 3 000 000 000 , voici le résultat que j'avais :
Donnez la valeur de N = 30k : 3000000000
Crible mod30 : Famille de chaque Pi: 6.084010362625122 seconds ---
Crible mod30 : Criblage des 8 familles: 185.3283257484436 seconds ---
On a 135 095 831 nombres premiers n à 2n
et toujours pour n = 150 voici les j pour p['i] =13 et R = 1 pour 2n%13 ; on a bien j =1 +26 = 27
et j = 1+13*29 indique la limite wile j < f
27
53
79
105
131
157
183
209
235
261
287
313
339
365
391
@+
#613 Re : Programmation » crible en python » 27-04-2018 07:57:52
Bonjour
@Yoshi , je viens de vérifier avec ton instruction : d_c = j%10 et d_c 2%==0: au lieu de ['0','2','4','6','8']:
pour n= 150, effectivement les j = r['i] sont les mêmes ...Conclusion, ils doivent être mal positionnés dans leur famille respective...! pour indiquer les mauvaises valeurs : 31 nombre au lieu de 27. Ou alors il occulte le premier r['i]....?
voici ci-dessous les j pour p['i] = 7 et 2n%p['i] = 6 , d'où : j = 6+7=13 et 13 + 2*7 = 27 ; de plus 13 + 7*29 = 223 , qui est bien le dernier j
de ce fait, le programme doit bien positionner les 8 j afférente à leur famille respective...
on a donc j qui appartient au p8 = [1.7.11.13.17.19.23.29]
soit j = [181.97.41.13.167.139.83.209] le 13, même si il est masqué, il est bien pris en compte par le programme, et placé ligne 0 ou le [1] quatrième famille est marqué [0]. Car le bloc de commande qui vérifie la terminaison:
if j % 30 == 13:
Positionne aussi à la bonne place le j= r['i], par le quotient, tel que (13 -13)/30 = 0, donc ligne ou cell n° 0 puis p['i] = 7,à partir de cette position, va cribler c'est à dire marquer d'un[0] tous les 7 nbcell jusquà n/30 = 5 nbcell ...
pour j = 181
if j % 30 == 1:
on a (181 - 1) /30 = 6 donc trop grand il ne peut rien marquer pour n = 150 ...ok
Mais par contre, pour p['i] = 13 ; R = 1 et donc j = 1+26 = 27...etc on aura bien D_c ='1' donc (1 -1) /30 = 0
le [1] nbcell n°0 serra transformer en [0] et 13 va cribler en partant de cette position...
donc voila pourquoi il faut être sûr que les j sont bien positionnés avec la fonction d_c = j%10 ou que
if d_c %2==0:
, ne modifie pas la position de départ de j=['i], dans sa famille...car p['i] ne partira pas de la bonne position d'où erreur dans le décompte...des ncell == [1] et des nombres premiers de n à 2n...
Donnez la valeur de N = 30k : 150
27
41
55
69
83
97
111
125
139
153
167
181
195
209
223
#614 Re : Programmation » crible en python » 26-04-2018 21:46:45
re @Yoshi
tu as changé beaucoup de choses.
while j <=n: #cette ligne est fausse pour de petites valeur je te l'ai expliqué il faut f à la place de n
if d_c ==5 or j % 3 == 0: # on passe au suivant
fam = -1
elif d_c == 1: # on vérifie 1 et 11
if j % 30 == 1: #je l'ai fait ok
fam = 0
else:
fam = 2
elif d_c == 3: # on vérifie 13 et 23
if j % 30 == 13: #je l'ai fait ok
fam = 3
else:
fam = 6
elif d_c == 7: # on vérifie 7 et 17
if j % 30 ==7: #je l'ai fait ok
fam = 1
else:
fam = 4
else: # on vérifie 19 et 29 (d_c = 9)
if j % 30 == 19: #je l'ai fait ok
fam = 5
else:
fam = 7
if fam != -1 and pfam[i][fam] == 0:
il te faut créer une ligne entre: j=r['i'] et incr = p['i']..
j = r[i]
f = j +p[i] * 29 #cette ligne est à ajouter j'ai mis 29 au lieu de 30 car c'est plus précis, voir l'exemple que j'ai cité au post dessus.
incr = p[i]*2
De ce fait tu pourra indiquer la limite de j lorsqu'il construit et positionne les R['i'] pour chaque famille
while j <=f: au lieu de while j <=n:
c'est ce qui créait une erreur de nombres pour des valeur < n = 1500 et de plus multipliait le temps d'exécution par 5
d'ailleurs met la ligne print (j) et tu pourras voir
d_c = str(j)[-1]
print(j)
print("Crible mod30 : Famille de chaque Pi: %s seconds ---" % (time.time() - start_time))
pourquoi ces deux lignes à la fin : P=crible_mod30(n) et nb = len(P) au lieu de nb = len(crible_mod30(n)) uniquement
je l'ai fait c'est vrai que cela ne change rien...
P=crible_mod30(n)
nb = len(P)
print("On a "+str(nb)+" nombres premiers")
os.system("pause")
il me reste plus que les trois lignes du remplacement de str(j)[-1] et des ("d_c paire ") que je viens de faire, et ça ne marche pas du tout... pour n = 300 j'ai 62 nombres au lieu de 47....Tu peux d'ailleurs vérifier avec la fonction print(j) les restes j=r['i'] pour n=150 que je t'ai indiqué ....
@+ bonne nuit....
#615 Re : Programmation » crible en python » 26-04-2018 16:50:46
pour qu'il n'y ait pas confusion :
p Eratosthène est la liste des premiers > 5 et [tex]<\sqrt{2n}[/tex]
p['i'] est un nombre premier appartenant à p
R est les reste de la division de 2n par p['i']
R['i'] est le R + p['i'] si R est pair, ou R + 2*p['i'] pour R impair , puis on progresse modulo 2*p['i']donc les j = R['i']
On calcule les j jusqu'à la limite < (R + p['i']) + p['i']*30, c'est à dire j + p['i']*30
car sinon si on avait mis : Wile j < n et bien cela aurait calculer tous les j inférieur à n ce qui est absurde puisque l'on a besoins que de la position de j par Famille, donc des 8 j, un par Famille; pour chaque p['i'] , et ensuite , à partir de cette position c'est p['i'] qui crible jusqu'à la limite n/30 et ce, dans chaque famille; puisque l'on travaille dans les familles de raison 30, sauf la première cellule qui vaut : [1,7,11,13,17,19,23, ou 29]
voici un extrait des j = r['i'] pour n = 150.pour les P['i'] = {7,11,13,17} ce qui donne , 15 j, est le 16ème est tout simplement la réitération de j + pi*30
exemple n = 150 on a 2n = 300 et racine de 2n = 17,...,
Pour pi = 7, R= 6, 2n =300, J = 6+7 = Ri = 13 et 13 + 7*30 = 223 qui est le dernier j = ri
le suivant pi = 11 ; R = 3 ; j = 3 + 2*pi = 25 ; et 25 +11*30 = 355 qui est la limite wile j < f ligne 57 du programme.
etc etc .. pi = 13 ;
Donnez la valeur de N = 30k : 150 , 2n = 300, liste des j = (r+pi) =13 et + 2*pi =27...etc ....223.
27
41
55
69
83
97
111
125
139
153
167
181
195
209
223
25 ... pour R =3 et pi =11 , on a : j = R + 2*pi = 25 ....puis + 2*pi......> 355
47
69
91
113
135
157
179
201
223
245
267
289
311
333
355
27 ; 300%13 = R = 1 et pi =13, donc : j = R + 2*pi = 27, puis + 2*pi ...> (j * (13*30)) = 417
53
79
105
131
157
183
209
235
261
287
313
339
365
391
417
45
79
113
147
181
215
249
283
317
351
385
419
453
487
521
555
Crible mod30 : Famille de chaque Pi: 0.013000965118408203 seconds ---
Crible mod30 : Criblage des 8 familles: 0.0 seconds ---
On a 27 nombres premiers $p'< n$ tel que $p'\not\equiv{2n}[pi]$ soit 27 premiers, $q$ entre n et 2n
Appuyez sur une touche pour continuer...
c'est ok...
@+
#616 Re : Programmation » crible en python » 26-04-2018 14:08:03
Salut,
Ah oui les fameux [ i ], ça me revient...
Le moteur du forum les interprète comme de l'italique. J''avais trouvé deux solutions :
- utiliser une autre lettre,
- soit doubler le i : r[ii] , p[ii]Dans ton script, les restes d_c ne sont bien jamais > 10 ?
@+
dans le programme si on prend bien les balise <code> et </code> ça reste bien R<i> et P<i>...puisque je l'ai refait...
pour les décimales d_c ça ne peut pas être > 10 c'est toujours une terminaison de ['0'....à '9']
j'ai donc remis comme avant d-c ['0', '2', '4' , '6' , '8']
et
d_c = str(j)[-1]
@+ et merci Yoshi.
#617 Re : Programmation » crible en python » 26-04-2018 13:57:57
je viens d'essayer c'est pire au lieu de 28 nombre , j'en ai 31 , pou n =150
Donnez la valeur de N = 30k : 150
Crible mod30 : Famille de chaque Pi: 0.0010001659393310547 seconds ---
Crible mod30 : Criblage des 8 familles: 0.0 seconds ---
On a 27 nombres premiers
Appuyez sur une touche pour continuer...
#618 Re : Programmation » crible en python » 26-04-2018 13:50:42
Je crois avoir trouvé mon erreur dans ta réindentation ; j'ai oublié la ligne 83 , j'ai laissé
au lieu de d_c = j%10
je recommence...
#619 Re : Programmation » crible en python » 26-04-2018 13:24:48
Bonjour Yoshi....
1) pourtant, je les ai rentrée les balises
...??? je vais modifier le message ci-dessus
2) c'est surement un mauvais point pour mon petit fils , je fais ce que je peux pour modifier certaine ligne mais je ne comprend pas Pycharm en plus c'est en anglais...
3)je viens de faire un copie collé de ton programme réindenté dans Pycharme , je lance et ça ne marche pas la fenêtre cmd se ferme directement...
voila ce que donne avec l'indentation d'avant:
extrait
Crible mod30 : Famille de chaque Pi: 0.0 seconds ---
Crible mod30 : Criblage des 8 familles: 0.0 seconds ---
On a 27 nombres premiers
Appuyez sur une touche pour continuer...
4) dans mon programme c'est
et non 2n%p
c'est mon copié collé entre les balises code qui m'enlève les
ok je comprend ta surprise .....
5) je recopie le code dans pycharm ci-dessous
import math
import time
def eratostene(n):
n = int((2*n)**0.5)
m = (n-1) // 2
b = [True]*m
i = 0
p = 3
premiers = [2]
while p*p < n:
if b[i]:
premiers.append(p)
j = 2*i*i + 6*i + 3
while j < m:
b[j] = False
j = j + 2*i + 3
i += 1
p += 2
while i < m:
if b[i]:
premiers.append(p)
i += 1
p += 2
#print(premiers)
return premiers
# On travaille avec 8 familles (1, 7, 11, 13, 17, 19, 23, 29)
# ATTENTION: n doit être multiple de 30
def crible_mod30(n):
# INITIALISATION
nbcell = int(n/30)
nombres = [[1 for _ in range(nbcell)] for _ in range(8)]
p = eratostene(int(n))[3:]
lenp = len(p)
r = []
p8 = [1, 7, 11, 13, 17, 19, 23, 29]
pfam = []
# FAMILLES POUR CHAQUE Pi
start_time = time.time()
for i in range(lenp):
r.append(2*n % p[i])
pfam.append([0, 0, 0, 0, 0, 0, 0, 0])
j = r[i]
f = j + p[i]*30
incr = p[i]*2
d_c = str(j)[-1]
# si la terminaison du reste est pair on ajoute directement Pi et on verifie
if d_c in ['0','2','4','6','8']:
j += p[i]
d_c = str(j)[-1]
while j <= f:
if d_c == '5' or j % 3 == 0: # on passe au suivant
fam = -1
elif d_c == '1': # on vérifie 1 et 11
if j % 30 == p8[0]:
fam = 0
else:
fam = 2
elif d_c == '3': # on vérifie 13 et 23
if j % 30 == p8[3]:
fam = 3
else:
fam = 6
elif d_c == '7': # on vérifie 7 et 17
if j % 30 == p8[1]:
fam = 1
else:
fam = 4
else: # on vérifie 19 et 29 (d_c = 9)
if j % 30 == p8[5]:
fam = 5
else:
fam = 7
if fam != -1 and pfam[i][fam] == 0:
pfam[i][fam] = j
j += incr
d_c = str(j)[-1]
#print(j)
print("Crible mod30 : Famille de chaque Pi: %s seconds ---" % (time.time() - start_time))
#ON CRIBLE LES 8 COLONNES AVEC CHAQUE FAMILLE DE Pi
start_time = time.time()
lenpfam = len(pfam)
for i in range(lenpfam):
for j in range(8):
index = int((pfam[i][j] - p8[j]) / 30)
while index < nbcell:
nombres[j][index] = 0
index += p[i]
print("Crible mod30 : Criblage des 8 familles: %s seconds ---" % (time.time() - start_time))
# AFFICHAGE
for i in range(8):
count = 0
for cell in nombres[i]:
if cell == 1:
count += 1
# CALCUL DES NOMRES PREMIERS ENTRE N ET 2*N
premiers = []
for i in range(8):
for j in range(nbcell-1, -1, -1):
if nombres[i][j] == 1:
premiers.append(nombres[i][j] == 1)
#print(nombres)
premiers.sort()
return premiers
n = int(input("Donnez la valeur de N = 30k : "))
nb = len(crible_mod30(n))
print("On a "+str(nb)+" nombres premiers")
os.system("pause")
ok je viens de vérifier les
sont bien restés...
7) donc je vais modifier les lignes que tu m'as indiquées...et je fais un test je comprend aussi pourquoi en recopiant ton indentation ça ne marchais pas puisque les
ont été supprimés , d'où ta surprise que ça pouvait fonctionner dans Pycharm alors que non !...
je reviens...voila l'instrucstion ok
Mais cette partie là ci-dessous génère une erreur dans le criblage...je t'ai mis le i devant les r et les p
j = ri
f = j + pi*30
incr = pi*2
d_c = j%10
# si la terminaison du reste est pair on ajoute directement Pi et on verifie
if d_c %2==0:
j += pi
d_c = j%10
while j <= f:
#620 Re : Programmation » crible en python » 26-04-2018 09:03:17
Bonjour
est ce qu'il y a une limite dans python, car voici les différentes valeurs de 30k extrait de la fenêtre cmd :
Donnez la valeur de N = 30k : 3000000000
Crible mod30 : Famille de chaque Pi: 6.084010362625122 seconds ---
Crible mod30 : Criblage des 8 familles: 185.3283257484436 seconds ---
On a 135095831 nombres premiers n à 2n
Donnez la valeur de N = 30k : 3420000000
Crible mod30 : Famille de chaque Pi: 45.474079847335815 seconds ---
Crible mod30 : Criblage des 8 familles: 382.5750720500946 seconds ---
On a 153107189 nombres premiers n à 2n
Donnez la valeur de N = 30k : 3540000000
Crible mod30 : Famille de chaque Pi: 7.784413576126099 seconds ---
Crible mod30 : Criblage des 8 familles: 221.55158925056458 seconds ---
On a 158233655 nombres premiers n à 2n
Donnez la valeur de N = 30k : 3660000000
Crible mod30 : Famille de chaque Pi: 19.172433853149414 seconds ---
Crible mod30 : Criblage des 8 familles: 244.10922861099243 seconds ---
On a 163351999 nombres premiers n à 2n
Donnez la valeur de N = 30k : 3690000000
Crible mod30 : Famille de chaque Pi: 30.310853481292725 seconds ---
Crible mod30 : Criblage des 8 familles: 241.78482460975647 seconds ---
On a 164630426 nombres premiers n à 2n
Donnez la valeur de N = 30k : 3720000000
Crible mod30 : Famille de chaque Pi: 30.342053174972534 seconds ---
Crible mod30 : Criblage des 8 familles: 369.8454496860504 seconds ---
On a 165910122 nombres premiers n à 2n
Limite atteinte , pour 3750000000 il initialise, calcule les j = R pour Famille de chaque Pi :
44 seconde environ…puis tourne sans arrêt…donc il ne crible plus les 8 familles
????
j'ai modifié le code ci dessus
par celui ci-dessous, car il y avait une erreur ligne 50 que j'ai rajouté et ligne 57 que j'ai modifié , car il calculer les j = R jusqu'à la limite n au lieu de se limiter à
ligne que j'ai rajouté...
d'où la ligne
que j'ai modifiée.
Avec deux fonctions que j'ai rajoutés
que l'on peut activer ou non...
Ce qui a eut pour résultat de ne pas faire d'erreurs de nombres premiers de n à 2n pour de petites valeur de k *30 = 105...120...150...etc et de diviser le temps d'exécution par 5...
import os
import math
import time
def eratostene(n):
n = int((2*n)**0.5)
m = (n-1) // 2
b = [True]*m
i = 0
p = 3
premiers = [2]
while p*p < n:
if b:
premiers.append(p)
j = 2*i*i + 6*i + 3
while j < m:
b[j] = False
j = j + 2*i + 3
i += 1
p += 2
while i < m:
if b:
premiers.append(p)
i += 1
p += 2
#print(premiers)
return premiers
# On travaille avec 8 familles (1, 7, 11, 13, 17, 19, 23, 29)
# ATTENTION: n doit être multiple de 30
def crible_mod30(n):
# INITIALISATION
nbcell = int(n/30)
nombres = [[1 for _ in range(nbcell)] for _ in range(8)]
p = eratostene(int(n))
p = p[3:]
lenp = len(p)
r = []
p8 = [1, 7, 11, 13, 17, 19, 23, 29]
pfam = []
# FAMILLES POUR CHAQUE Pi
start_time = time.time()
for i in range(lenp):
r.append(2*n % p)
pfam.append([0, 0, 0, 0, 0, 0, 0, 0])
j = r
f = j + p*30
incr = p*2
d_c = str(j)[-1]
# si la terminaison du reste est pair on ajoute directement Pi et on verifie
if d_c in ['0','2','4','6','8']:
j += p
d_c = str(j)[-1]
while j <= f:
if d_c == '5' or j % 3 == 0: # on passe au suivant
fam = -1
elif d_c == '1': # on vérifie 1 et 11
if j % 30 == p8[0]:
fam = 0
else:
fam = 2
elif d_c == '3': # on vérifie 13 et 23
if j % 30 == p8[3]:
fam = 3
else:
fam = 6
elif d_c == '7': # on vérifie 7 et 17
if j % 30 == p8[1]:
fam = 1
else:
fam = 4
else: # on vérifie 19 et 29 (d_c = 9)
if j % 30 == p8[5]:
fam = 5
else:
fam = 7
if fam != -1 and pfam[fam] == 0:
pfam[fam] = j
j += incr
d_c = str(j)[-1]
#print(j)
print("Crible mod30 : Famille de chaque Pi: %s seconds ---" % (time.time() - start_time))
#ON CRIBLE LES 8 COLONNES AVEC CHAQUE FAMILLE DE Pi
start_time = time.time()
lenpfam = len(pfam)
for i in range(lenpfam):
for j in range(8):
index = int((pfam[j] - p8[j]) / 30)
while index < nbcell:
nombres[j][index] = 0
index += p
print("Crible mod30 : Criblage des 8 familles: %s seconds ---" % (time.time() - start_time))
# AFFICHAGE
for i in range(8):
count = 0
for cell in nombres:
if cell == 1:
count += 1
# CALCUL DES NOMRES PREMIERS ENTRE N ET 2*N
premiers = []
for i in range(8):
for j in range(nbcell-1, -1, -1):
if nombres[j] == 1:
premiers.append(nombres[j] == 1)
#print(nombres)
premiers.sort()
return premiers
n = int(input("Donnez la valeur de N = 30k : "))
nb = len(crible_mod30(n))
print("On a "+str(nb)+" nombres premiers")
os.system("pause")
import os
import math
import time
l'idéal, restant toujours le criblage uniquement par famille....
#621 Re : Programmation » crible en python » 02-04-2018 11:31:20
Bonjour
@Yoshi
voici ce bloc d'instructions qui me pose question:
if d_c in ['0','2','4','6','8']:
j += p[i]
d_c = str(j)[-1]
[b]while j < n:[/b]
if d_c == '5' or j % 3 == 0: # on passe au suivant
fam = -1
elif d_c == '1': # on vérifie 1 et 11
if j % 30 == p8[0]:
fam = 0
else:
fam = 2
la commande while j < n: veut bien dire que l'on ajoute p(i) à J jusqu'à n , et j = r(i)
dans le bloc d'instructions ci-dessus
# FAMILLES POUR CHAQUE Pi
start_time = time.time()
for i in range(lenp):
r.append(2*n % p[i])
pfam.append([0, 0, 0, 0, 0, 0, 0, 0])
j = r[i]
incr = p[i]*2
d_c = str(j)[-1]
Mais normalement il ne devrait pas y avoir une autre instruction: 1) tel que on ajoute p(i) jusqu'à d_c == '1' et et on vérifie le (modulo)1%30 ou 11%30 = 0 , ou jusqu'à < n
c'est à dire : while J % 30 == p8[0] , ou < n:
exemple:
Exemple de crible N = 150 , Pi < sqrt 300 = {7;11;13 ; 17 } ; reste R de 300 par les Pi : R = {6; 3 ; 1; 11} . 150 /30 = 5 cell par Famille.
Pi = 7 et R = 6 , ce qui va donner : 6 +7 = 13 ; → +14 = 27 → +14 = 41→ +14 = 55 → +14 = 69→ +14 = 83→ + 14 = 97→ +14 =111
→ +14 = 125 → +14 = 139 → +14 =153 > n = 150 fini pour Pi = 7 qui ne crible que 5 Famille sur 8.
Pi = 11 et R = 3
3 +( 2*11) → +22 = 47 → +22 → +22 = 91 = 1%30 et (91 -1)/30 = cell N°3
Pi = 13 et R = 1
1 = 1%30 et (1-1)/30 = cell N°0
Pi = 17 et R = 11
11 + 34 → +34 →+34 →+34 > n fin
(« Si on choisit de cribler par Famille et on choisit la Famille 1[30] . Pi = 7 ne marque aucune cellule dans cette famille. Pi = 11 et R =3 , va marquer 91 cell N°3 , puis sort du crible ; Pi = 13 et R = 1 , va marquer la cell N° 0 donc la première le [1] devient [0], puis Pi = 13 sort ; et Pi = 17 et R = 11 ne marquerait que la famille 11[30], et sort »)
initialisation
0 1 2 3 4
1 ; 1 ; 1 ; 1 ; 1
criblage
0 1 2 3 4
0 ; 1 ; 1 ; 0 ; 1
A moins que cela se fasse automatiquement dans le programme, c'est à dire que j < n est la limite maximum ....
("Mais je n'arrive toujours pas à modifier pour ne travailler que dans une famille, exemple la famille 1 (modulo 30)...")
#622 Re : Programmation » crible en python » 21-03-2018 15:02:11
Ok yoshi
je viens de la remplacer c'est bon ...
tout à l'heure je l'ai fait mais j'ai dû mal placer les ' ' , car ça ne changeait rien...
"c'est la terminaison paire qui est pris en compte" c'est pour cela que le crible passe directement à l'étape suivante en rajoutant [tex]P_i[/tex]
de même si la terminaison se termine par '5'..on ajoute [tex]2*P_i [/tex] on passe au suivant..on ne teste pas le modulo.
il faut que [tex]R_i[/tex] ou [tex]j_i + 2*P_i[/tex] se termine par 1, 3, 7 ou 9 si on crible les 8 familles ce qui n'est pas le but..
C'est pour cela qu'il faut travailler uniquement par Famille plus simple à programmer et plus rapide , ainsi que dans l'exécution de l'algorithme cela utilise moins de mémoire et donc la limite est plus grande...
Ce qui permet aussi de voir pourquoi on a une même densité de premiers de n à 2n par Famille.
Le travaille est le même quelque soit la limite N par Famille..
le criblage des [tex]P_i[/tex] est le même, seul la position de départ va légèrement changer, mais n'aura aucune incidence sur la densité de nombres premiers par famille, que ce soit le crible de 7 à N ou de N à 2N ...
#623 Re : Programmation » crible en python » 21-03-2018 13:06:43
je viens de modifier la ligne en question, et cela provoque une erreur pour N = 600 j'ai :98 n primes au lieu de 87, j'augmente de 30 j'en ai 108 au lieu de 91....?
alors qu'avec l'ancienne ligne
if d_c == '0' or d_c == '2' or d_c == '4' or d_c == '6' or d_c == '8':
j += p[i]
d_c = str(j)[-1]
j'ai 85 pour N =600 et 90 pour N = 630 soit un écart de 1 par rapport à crible_G(n)...
peut être qu'avec cette ligne :
if d_c in [0,2,4,6,8]:
il faut modifier les lignes d'instruction dessous...???
D'autant que la phrase : # On elimine les restes pairs prête à confusion , car on aurait dû écrire :
#si le reste est pair on ajoute directement Pi et on verifie
if d_c == '0' or d_c == '2' or d_c == '4' or d_c == '6' or d_c == '8':
j += p[i]
d_c = str(j)[-1]
while j < n:
#624 Re : Programmation » crible en python » 21-03-2018 12:48:25
Salut,
Déjà, ça (ce n'est pas une erreur) c'est inutile :# On elimine les restes pairs
if d_c == '0' or d_c == '2' or d_c == '4' or d_c == '6' or d_c == '8':il vaut mieux écrire :
# On elimine les restes pairs
if d_c in [0,2,4,6,8]:@+
oui mais est ce que l'instruction :
if d_c in [0,2,4,6,8]:
veut dire que l'on ne calcule pas le modulo, donc on rajoute au reste R, [tex]P_i[/tex] qui deviens [tex]J_i[/tex] je suppose....Puis on vérifie si il se termine bien par la famille que l'on a choisie par ex : 1 (modulo30) si oui, on vérifie le modulo: 1[30] = 0 ; sinon on rajoute 2*P_i...etc
juqu'à ce que l'on tombe sur la terminaison par 1...ou 3 ..ou 7...ou 9. < à la lim N définie en entrée; afin de vérifier le modulo en question et de le placer dans sa famille pour commencer le criblage jusqu'à la limite N définie...
car si on élimine les restes R pairs purement et simplement on part de où...? je suppose que ce n'est pas le cas car le crible serait faux même pour une petite limite ...
On aurait n'importe quoi ce qui n'est pas le cas à partir de N =1500....même 600 il suffit de rajouter 30 soit 630 qui donne la bonne valeur que crible_G(n) à une exception près à cause du 1...
donc par rapport à ta réflexion je suppose que ce n'est qu'une mauvaise écriture...que je vais vérifier et modifier cette ligne...
A+
#625 Re : Programmation » crible en python » 21-03-2018 10:32:35
Bonjour
@Yoshi ,il se pourrait que l'erreur vienne de cette ligne d'instruction :
# On elimine les restes pairs
if d_c == '0' or d_c == '2' or d_c == '4' or d_c == '6' or d_c == '8':
car effectivement si le reste R de 2n par Pi est pair on n'a pas besoin de vérifier le modulo de la famille concernée ; mais par contre on part bien de ce reste R auquel on rajoute Pi, et on vérifie si la terminaison correspond bien à l'une des 8 familles concernées et si il est bien congru à Pi modulo 30 pour la famille concernée; ou 1 modulo 30 pour la famille 1 [30].
par exemple , j'ai pris N= 300 et je veux cribler la famille 1[30] . [tex]\sqrt{600} = 24,...[/tex]
les [tex] P_i = 7.11.13.17.19.23[/tex] les [tex]R_i = 5 . 6.2.5.11.2[/tex]
initialisation et criblage de la famille 1[30] cela va nous donner dix nombres [1].
et le criblage va marquer 61 et 271. soit le troisième nombre et le dixième;"qui corresponde à la cellule N°2 et 9"
[tex][1].[1].[0].[1].[1].[1].[1].[1].[1].[0][/tex] extraction, on a bien 8 nombres premiers. (" de n à 2n pour la famille complémentaires à 1[30] soit la famille 29[30]...") qui sont [tex]359.389.419.449.479.509.569.599[/tex] ça on a pas besoins de l'écrire , car on compte que les nombres [1] lors de l'extraction.
mais lors du criblage on voit bien que si les restes R sont pairs, on rajoute P_i si il ne se termine pas par 1 on rajoute ensuite 2*P_i donc impair et si il se termine par 1 on vérifie le "modulo" : qu'il est bien congru à 1[30] ; sinon on continue jusqu'à la limite n = 300...puis on passe au [tex]P_i[/tex] et son[tex]R_i[/tex] suivant...etc
En exemple pour ce cas ; pour [tex]P_i = 11[/tex] et son [tex]R_i = 6[/tex]. On part du reste :
6 + 11 ; 17 +22 ; 39+22 = 61 on vérifie le modulo c'est à dire la ligne de code:
donc ok.
On le place dans sa famille à sa position :
(61-1)/30 = 2 cell N° 2, le troisième [1].
Ensuite on marquera tous les 11[1] jusqu'à la lim N = 300.
Dans cet exemple, on a que le troisième c'est à dire le N°2, [1] = [0] ;
"car on compte en commençant par 0,1,2,....n"
j'espère que cela correspond bien aux lignes d'instruction du crible_mod30.....???







