Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#476 Re : Programmation » crible en python » 20-07-2018 15:42:25
je pense qu'au niveau du criblage lorsque l'on dépasse 29 700 000 000 ce n'est pas liste nombres = 1 000 000 000 par famille le point faible..
c'est bien le criblage par pas de Pi qui pose problème, car il faut compter les 1 ..... et ça on ne pourra s'en passer.
car regarde que je crible 29 100 000 000 le temps par famille pi et d'environ 3 secondes pour 29 910 000 000 il est de 4 secondes environ et pour 29 940 000 000 quelques dixièmes en plus....
mais en criblage on passe de 180 seconde à 2800 secondes puis à 5600 secondes alors que le temps d'extraction ne varie pratiquement que de très peu de 7 à 10 seconde. justement grâce à ta partie 4 extraction...
or dans les trois cas la liste nombres est établie les Pi sont stockée...la boucle des j ne varierai que de très peu , même en limitant cette boucle la finà (while j%30 == 1).
c'est le même problème dans nbpremiers win 32 d'Eratosthène modulo 30 par famille..qui lui prend nombres = 15 000 000 000 de 1 mais le temps est d'environ 2h 20 avec mon pc, le programme est en c++.
par contre il est clair qu'il peut être amélioré par plusieurs points déjà la partie 4 de ton programme qui est très rapide par rapport au début où le temps est divisé au moins par 30....et d'autre point comme la racine carrée des premiers extraits par le GM ('Grupe Multiplicatif)..
Là probablement que l'utilisation d'un processeur multicœurs serait utile chacun prendrait une base il y en a 8...Mais c'est suffisant ...
Est ce que tu veux cet exécutable ? qui se présente sous la forme d'un calculateur sous Windows...
#477 Re : Programmation » crible en python » 20-07-2018 10:21:41
Bonjour @Yoshi
Ben.... tu viens de répondre à mes questions, je n'étais pas sûr que les j été traités un après l'autre et qu'ils étaient en mémoire cache d'après cette ligne :
,
pour ensuite être rangé Dico[j%30]dans fam..afin de calculer l'index de départ puis criblage par pas de pi...dans liste nbcell pour remplacer les 1 par des 0 .
je travail avec ta dernière version par famille uniquement... ce qui fait qu'effectivement pour chaque pi je ne travail qu'avec un j%30==1 que je range Dico[1] dans fam...
ce qui m'a fait posé cette question, c'est que lorsque j'édite les j, il m'édite le dernier j relatif au dernier pi
par exemple si je tape n=2400000
avec print (j) à la fin de # FAMILLES POUR CHAQUE Pi
il me donne :
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 2400000
Phase d'initialisation: 0.0 seconds ---
65033
Bloc S2_s3 : 0.015600204467773438 seconds ---
Extraction des premiers n à 2*n : 0.0 seconds ---
** 19933 nombres trouvés en 0.015600204467773438 secondes **
>>>
Ce qui me fait penser qu'il traite les 15j relatif à la boucle :
, Ce qui est normal puisqu'il travaille dans les 8 famille...
alors que ne travaillant que dans une seule famille , je n'ai besoins que d'un j%30==1 que je range Dico[1] dans fam...
Donc je cherchai le moyen d'arrêter la boucle dès que j%30==1 était trouvé, sans aller jusqu'à fin = min(1+r+pi*29,nn)..
Ceci dit.... je ne pense pas que cela changerai grand chose....
@+
#478 Re : Programmation » crible en python » 19-07-2018 10:49:50
Bonjour @Yoshi
D’après tes explications au post # 258, page 11 . Pour chacun des Pi tu vides les Pfam à chaque tour pour ne pas les stocker…
A_) Mais est-ce que cela concerne aussi les j… de la ligne de programme
Ou bien, est-ce que cette ligne, met en cache tous les j <= pi*30 , relatif à leurs pi, pour être traité ensuite par la ligne de programme en dessous, (« que j’ai modifiée post #258, pour ne travailler que par Fam»).
for j in range(debut,fin,pas):
if j%30==1:
fam=P8[1]
etc…ensuite rien ne change.
B_) Ma question est : Puisque l’on a besoin que d’un j %30==1 (« en criblant uniquement par Famille en exemple, fam=P8[1] ») ; peut-on modifier la ligne debut,fin,pas= , afin de limiter les j jusqu’à j%30==1 qui correspond à fin. .. ? Pour chaque Pi , et que l’on vide à chaque tour de criblage pour passer au Pi suivant …. ?
Ce qui sous-entend , que cette ligne vérifiera au fur et à mesure les j%30…
Et la ligne
for j in range(debut,fin,pas):
if j%30==1:
devra surement être modifiée afin de ranger j%30==1 dans fam=P8[1]….
Et continuer la fin du programme sans rien changer…Ensuite on passe au Pi suivant…. Non ?
A moins que cela ne change pas grand chose....
#479 Re : Programmation » crible en python » 17-07-2018 15:22:24
Bonjour
j'ai laissé tourner un peu le cribleG4Y pour n = 29 970 000 000 , car je pensais qu'il "beuguait" et ben non:
Donnez la valeur de n = 30k : 29 970 000 000
Phase d'initialisation: 3.6816067695617676 seconds ---
Bloc S2_s3 : 5224.839176654816 seconds ---
Extraction des premiers n à 2*n : 31.137654781341553 seconds ---
** 152859833 nombres trouvés en 5259.658438205719 secondes **
Appuyez sur une touche pour continuer...
******************************
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 29 100 000 000
Phase d'initialisation: 4.321207523345947 seconds ---
Bloc S2_s3 : 173.519104719162 seconds ---
Extraction des premiers n à 2*n : 7.363212823867798 seconds ---
** 148600698 nombres trouvés en 185.20352506637573 secondes **
c'est quand même curieux la différence de temps qu'il y a pour n = 29 100 000 000 pour une différence relativement faible
sqrt de 2*29970000000 et sqrt de 2*29100000000 : ce qui représente environ un écart de 300 nombres premiers pi en plus, qui vont cribler très peu de nombres...
#480 Re : Programmation » crible en python » 07-07-2018 12:06:31
voici les tests pour la fam=Dico[1] avec ta modif:
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 21000000000
Phase d'initialisation: 1.9968032836914062 seconds ---
Bloc S2_s3 : 103.94298267364502 seconds ---
Extraction des premiers n à 2*n : 5.3196094036102295 seconds ---
** 108685478 nombres trouvés en 111.25939536094666 secondes **
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 24300000000
Phase d'initialisation: 2.3088040351867676 seconds ---
Bloc S2_s3 : 121.43061327934265 seconds ---
Extraction des premiers n à 2*n : 6.130810499191284 seconds ---
** 125009260 nombres trouvés en 129.8702278137207 secondes **
ensuite j'ai re modifié :
debut,fin,pas=j+pi*(1-j%2),pi*30,pi*2 # ici
temoin=0
for j in range(debut,fin,pas):
if j%30==1: # ici
fam=Dico[1] # modifier la valeur de la fam à cribler [1,7,11,....,29]
if not ((1<<fam)&temoin):
voici les tests
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 21000000000
Phase d'initialisation: 1.9968035221099854 seconds ---
Bloc S2_s3 : 103.35018134117126 seconds ---
Extraction des premiers n à 2*n : 5.304009199142456 seconds ---
** 108685478 nombres trouvés en 110.6509940624237 secondes **
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4Y_modulo30.py =====
Donnez la valeur de n = 30k : 24300000000
Phase d'initialisation: 2.3400039672851562 seconds ---
Bloc S2_s3 : 122.10141444206238 seconds ---
Extraction des premiers n à 2*n : 6.146410703659058 seconds ---
** 125009260 nombres trouvés en 130.5878291130066 secondes **
>>>
Comme tu peux le voir, cela ne change pas grand chose...
C'est pour cela que je voulais modifier cette ligne afin qu'elle s'arrête des que j%30 ==1 est trouvé, puisque ensuite on va les tester à la ligne en dessous ("for j in range(debut,fin,pas):")
#481 Re : Programmation » crible en python » 07-07-2018 11:03:25
Maintenant, je vais regarder de plus près ta motif du #276 et chercher pourquoi elle plante...
Quand je saurai, je me pencherai sur ton dernière suggestion...
De ce que j'ai pu comprendre ça ne criblerait pas; du fait que pour (fin,) j'ai mis (j+pi*(1-j%2))%30==1, en croyant que des l'instant où il y a j%30==1 cela terminait le processus des j , donc inutile d'aller jusqu'à pi*30.... et que l'on passerait à la phase criblage....
Je vais essayer ta modif pour la fam=Dico [1]
#482 Re : Programmation » crible en python » 06-07-2018 18:49:51
donc ce n'est pas énorme en mémoire car prenons n = 30 000 000 000 soit 1 de nombre en progression arithmétique de raison 30, que l'on ne va pas écrire en totalité, et au pire chaque nombre prendrait en moyenne 2 octets soit au maximum 20 000 Pi qui cribleront modulo Pi*30 .
d'où plus Pi est grand, moins on écrit de nombres en progression Pi*30 entre 7 et n/30, et cela en partant de j = 1%30 si on crible la famille p8 = 1.
dans l'exemple du post ci-dessus avec Pi<= 83 . cela donne :
{151,361,571,781,991,1201,1411,1621,1831,2041,2251,2461,2671,2881,3091 ,3301,3511}
61,391,721 1051 1381 1711 2041 2371 2701 3031 3361 fin pour pi = 11
271 ,661,1051,1441,1831,2221,2611,3001,3391
première colonne sont les débuts index puis criblage modulo pi*30
451 ;961 1471 1981 2491 3001 3511
151 ; 721 1291 1861 2431 3001 3571
1 ;691 1381 2071 2761 3451
211 ;1081 1951 2821
721 ;1651 ,2581 3511
1021 ;2131, 3241
271 ;1501 , 2731
1051 ;2341
1231 ;2641
151 ;1741, 3331
61 ;1831
1771 ;
31 ;2041
1591 ;
1141 ;3331
1591 ;
1141 ;
ce qui donne bien 52 nombres premiers de 3600 à 7200 , congrus à 29 [30]
#483 Re : Programmation » crible en python » 06-07-2018 15:32:17
moi j'ai tester 36 000 000 000, mais pour une famille soit : 1 200 000 000 octets....voila pourquoi il faut cribler uniquement par famille, il en est de même pour Eratosthène modulo 30 ...où je vais jusqu'à 15 000 000 000 octets par famille...
Par contre tu dis que 255 ou 1, ne prend qu'un octet.. donc un entier n compris entre 7 et n/30 , quelque soit cet entier il ne prendrait qu'un octet....? car si c'est le cas on a pas besoins du tableau de 1 pour une famille ....mais cela m'étonnerait...!
Dans cette hypothèse il suffit de cribler modulo pi*30 en partant de R = j tel que j est le reste de nn%pi
exemple n= 3600 soit, 3600/30 = 120 [1] ok...
donc :nn =7200 ; pi = 7 on veut cribler la fam, Dico={1:0} donc : fam=Dico[1]
j = 7200%7 == 4
on cherche j < 7*30 , congru a 1 modulo 30
il faut que cette ligne soit modifiée
afin de ne s'occuper que de j%30==1
exemple :
4+7 = 11 qui correspond à j+pi*(1-r%2), 11 != 1%30 , on incrémente 11+14 = 25 ; 39 ; 53; 67; 81 != 1%30 ;95; 109; 123;137 ;
151 = 1%30 on passe à la phase criblage modulo pi*30 = 210
d'où :
151 +210+ 210 +210.....etc +210 jusqu'à <=3600 ce qui donne le nombre de [0] 16 +1 = 17 [0] fin pour pi =7
et on stock les valeurs pour connaître les doublons afin de ne pas supprimer des [1] qui seraient marquer plusieurs fois ....autrement dit les valeurs sont les [0], une valeur qui apparaît plusieurs fois, ne vaut qu'un [0]
ce qui donne :
{151,361,571,781,991,1201,1411,1621,1831,2041,2251,2461,2671,2881,3091 ,3301,3511}
************************************
on passe à pi =11 on réitère 7200%11 == 6
6+11=17 on incrémente jusqu'à j%30==1 ; 17+22, +22 = 61 et 61%30 == 1 ok, on passe au criblage modulo pi*30 = 330
61 + 330 ....etc <= 3600
ce qui donne 10 [0] car il y a un doublon en rouge :
61,391,721 1051 1381 1711 2041 2371 2701 3031 3361 fin pour pi = 11
****************************************
on passe à pi =13 on réitère 7200%13 == 11
11+26 on incrémente jusqu'à j%30==1 ; 37+26, +26+26+26+26+26+26+26+26 = 271 et 271%30 == 1 ok, on passe au criblage modulo pi*30 = 390
271 ,661,1051,1441,1831,2221,2611,3001,3391
ce qui donne 7 [0] car il y a 2 doublons en rouge :
***************************************
etc....etc jusqu'à pi = 83 il est clair que les derniers pi, ne vont pas marquer grand chose à part des doublons...
ensuite, à la fin comme tu l'as dit, on retranche le nombre de [0] de la somme des [1] = 120...
Est ce plus simple et plus rapide pour de grandes valeurs de n.....? est ce que l'on va à n = 30 mds....? car il faut trier les doublons....je doute que cela soit plus efficace....que de modifier cette partie , afin de chercher j=1%30 , et passer à la phase criblage , pour chaque pi:
j=nn%pi
debut,fin,pas=j+pi*(1-j%2),pi*30,pi*2
temoin=0
for j in range(debut,fin,pas):
if j%30==1:
j'ai remplacer le r par j, et on aurait pas besoins d'aller jusqu'à pi*30 pour une majorité des pi , puisque la fin est ordonnée par j%30==1
il suffit ensuite de changer j%30==p8; par l'une des 8 familles que l'on veut cribler...
#484 Re : Programmation » crible en python » 06-07-2018 10:36:14
Bonjour @Yoshi
Je ne sais pas si tu cherches toujours à amélioré , mais voila la partie du programme que j'ai "modifié" , mais qui crible faux...
par exemple pour n=240 j'ai 8 comme résultat et pour n = 24 300 000 000 j'ai 8 fois plus de premiers Mais , c'est le temps mis qui est intéressant 37 seconde au lieu de 131...Alors peut être que c'est dû au fait qu'il est faux ....?
voila la partie modifiée juste en dessous de la ligne r=nn%pi remplacé par j=nn%pi
en tenant compte que dans le programme j=r+pi*(1-r%2), qui correspond au début, on vérifie si j%30==1 , qui indique la fin sinon on incrémente par pas de ,pi*2... des que le j%30==1 est trouvé on passe au criblage
debut,fin,pas=j+pi*(1-j%2),(j+pi*(1-j%2))%30==1,pi*2 # j'ai modifié (fin) afin qu'il s'arrête des que j%30==1
temoin=0
for j in range(debut,fin,pas):
if j%30==1: # j'ai donc modifié
fam=Dico[1]
testbit=(1<<fam)&temoin
if not testbit:
temoin=(1<<fam)|temoin
debut_index=j//30
Nombres_fam=nombres[fam]
for index in range(debut_index, nbcell,pi):
Nombres_fam[index] = 0
partie d'origine programme actuel :
j=nn%pi
debut,fin,pas=+pi*(1-j%2),pi*30,pi*2
temoin=0
for j in range(debut,fin,pas):
if j%30==1:
fam=Dico[1]
testbit=(1<<fam)&temoin
if not testbit:
temoin=(1<<fam)|temoin
debut_index=j//30
Nombres_fam=nombres[fam]
for index in range(debut_index, nbcell,pi):
Nombres_fam[index] = 0
C'est donc cette partie, que je n'arrive pas à résoudre pour qu'il crible au fur et à mesure , et pour chaque pi en gagnant du temps et de la mémoire .
debut,fin,pas=r+pi*(1-r%2),(r+pi*(1-r%2))%30==1,pi*2 # j'ai modifié (fin) afin qu'il s'arrête des que j%30==1 et qu'il crible.
temoin=0
for j in range(debut,fin,pas):
if j%30==1: # j'ai donc modifié
Mais je patine dans la choucroute.....
@+
#485 Re : Programmation » crible en python » 28-06-2018 13:53:48
Bonjour.
["Pour la conjecture de Goldbach , je me suis peut être mal exprimé.
Ma question porte uniquement sur une famille, parmi les 8 familles de premiers.
Si par exemple je prend la famille d'entier n = 30k + 7 soit 2n = (2*30k) + 14 ; est ce qu'il existe 2* (30k + 7) qui ne satisferait pas la conjecture , on sait avec le crible que la densité de nombres premiers q [30k ; 2*30k +14] vaut $0,375 *\frac{30k + 7}{Ln (2*(30k+7))}$
on sait que pour $n\leqslant210$ la conjecture est vraie en règle générale, mais par exemple uniquement pour la famille 30k+1 on sait que 2n = 152 n'est pas somme de deux premiers (p,q )appartenant uniquement à cette famille. C'est d'ailleurs la seule, ce qui s'explique aisément avec l'écart entre les premiers < 150 dans cette famille..."]
Effectivement le crible permet de montrer la densité de nombres premiers [n ; 2n] , par famille ou pour les 8 familles. Ce qui après étude, permettra peut être de revoir la conjecture sous un autre angle et peut être ensuite de la résoudre...C'est pour cela, que je disait prenons l'un des 8 familles 30k + n, n[2;28]. Pour faire simple, la famille arithmétique 30k+7 , existe t'il un 2n = 2*(30k+7) qui n'est pas la somme de deux premiers (p,q) appartenant à cette famille...? Plus généralement avec les 3 familles arithmétiques de raison 30, de premier terme {7, 1, 13}...C'est pour les matheux....
Pour en revenir au crible: Pour une seule Fam.
On connaît le nombre maximum de 1 dans a liste.
Partir de ce nombre.
Lui soustraire 1 quand on remplaçait un 1 par un 0.
....? Là, tu vas vite...Car comment tu cribles les 1 par pas de Pi en partant de son index....???
Tu peux toujours dire, Exemple Pi = 7 j'ai n= 240, soit 240/30 = 8 , donc 8/7 = 1 il te faut soustraire 1 deux fois...ok..?
comment tu fais pour les autres Pi = 11,13,17,19 bien sûr connaissant l'index, compris entre 0 et 7 tu sauras que si l'index est compris de 0 à 7 , cela te donnera le nombre de 1 à soustraire...par contre tu ne sauras jamais si il y a des doublons dans la liste des 1, pour n= 3000 par exemple , d'où impossible de cribler sans erreur...! Et pour les 8 familles encore plus compliqué..!
On a pas le choix ..on est obligé d'initialiser la liste de 1 de 0 à n/30, justement pour cribler par pas de Pi, marquer les doublons, et on ne sait pas où ils se trouvent.
(" sauf bien entendu si on écrivait les valeurs de [1]..Et dans ce cas là , on en revient à une perte de temps et de mémoire car il faudrait écrire les entiers en progression arithmétique de raison 30, de Pi = {7,11,13,17,19,23,29,31} à n/30 ...").
Par contre on peut gagner en temps et en mémoire, si et uniquement par Famille : Exemple la famille j%30 == 1
1) On édite les Pi avec : Primes_init = eratostene(n)..... Cà on a pas le choix..
2) c'est dans cette partie du programme que cela se passe..[" ce que je n'ai pas réussi à faire"]
for i,pi in enumerate(Primes_init):
r=nn%pi
debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2
temoin=0
for j in range(debut,fin,pas):
if j%30==1: # modifier le reste de la fam à cribler (1,7,11,....,29)
A mon avis: on calcule pour chaque Pi, au fur et à mesure, le r=nn%pi , puis les j jusqu'à j%30 == 1
des qu'il est trouvé, stop ou fin.
ce qui fait modifier cette ligne : debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2 . Là , on ne stock rien...ok
on a le j%30==1 on passe de suite à la partie suivante pour cribler:
3)
for index in range(debut_index, nbcell,pi):
Nombres_fam[index] = 0
une fois que Pi à criblé, on passe au Pi suivant, on réitère : calcul de r=nn%pi , calcul du J%30==1
puis re criblage...etc...
Donc tu vois on va gagner un peu, on évite de stocker tous les r=nn%pi , pour les rappeler ensuite , on ne stock pas les j...que l'on va ensuite classer dans leur famille, car il nous en faut qu'un seul celui qui est = à j%30==1; de plus, on sait qu'il se trouve entre r et pi*29 . On a plus besoins de Pfam...
Voila ce que l'on peut gagner...
Ensuite augmenter la ram comme tu dis...ce n'est pas le plus important...
De toutes les façons on serra limité...à environ n /30 = 15 000 000 000.
c'est ce que fait Eratosthène modulo 30 par Famille et il est plus simple; car on n'utilise que 8 Pi, les autres sont extraits au fur et à mesure, ils criblent et sorte du programme...
On a donc en mémoire la liste des 15 000 000 000 de [1], que l'on marquera par des [0].
Mais on est obligé aussi de les écrire...il est beaucoup plus rapide car on ne fait que compter par pas de Pi;
c'est le groupe multiplicatif des 8 premiers, qui avance comme un rouleau....qui extrait les Pi > 31 , afin qu'ils aillent cribler....etc...etc.
#486 Re : Programmation » crible en python » 26-06-2018 09:48:52
Bonjour @Yoshi
Voila comment j'ai modifié ta dernière version du crible, qui marche très bien mais sans avoir amélioré la limite, qui se situe vers:
29 850 000 000.
from time import time
from os import system
from collections import OrderedDict
## V. 6.3 ##
def eratostene(n):
n = int((2*n)**0.5)
m = (n-1) // 2
limite=1+n
b = [True]*m
premiers = [2]
for i,p in enumerate(range(3,limite,2)):
if b[i]:
premiers.append(p)
j = 2*i*i + 6*i + 3
debut,pas=j,2*i+3
for j in range(debut,m,pas):
b[j] = False
debut=i
for i in range(debut,m):
if b[i]:
premiers.append(p)
p += 2
return premiers[3:]
def CribleG4Y_mod30(n):
# INITIALISATION
global fam,temoin
start_i= time()
Primes_init = eratostene(n)
nn,nbcell=n*2,n//30
nombres=[]
for i in range(1):
nombres.append([1]*nbcell)
P8={1:0} # modifier la fam que l'on veut cribler {1:0,7:1,....29:7}
s_1=time()-start_i
print("Phase d'initialisation: %s seconds ---" % s_1)
# FAMILLES POUR CHAQUE Pi
start_time = time()
for i,pi in enumerate(Primes_init):
j=nn%pi
debut,fin,pas=j+pi*(1-j%2),pi*30,pi*2
temoin=0
for j in range(debut,fin,pas):
if j%30==1: # modifier le reste de la fam à cribler (1,7,11,....,29)
fam=P8[1] # modifier la valeur de la fam à cribler [1,7,11,....,29]
testbit=(1<<fam)&temoin
if not testbit:
temoin=(1<<fam)|temoin
debut_index=j//30
Nombres_fam=nombres[fam]
for index in range(debut_index, nbcell,pi):
Nombres_fam[index] = 0
s_23=time()-start_time
print("Bloc S2_s3 : %s seconds ---" % s_23)
# CALCUL DES NOMRES PREMIERS ENTRE n ET 2*n
start_time = time()
total = 0
for sous_liste in nombres:
total+=sum(sous_liste)
s_4=time() - start_time
s=s_1+s_23+s_4
print("Extraction des premiers n à 2*n : %s seconds ---" % s_4)
return total,s
n = int(input("Donnez la valeur de n = 30k : "))
nbr,s= CribleG4Y_mod30(n)
print ("\n** ",nbr,"nombres trouvés en %s secondes" % s ,"**")
system("pause")
En vérifiant la densité de premiers , par rapport à la conjecture de Goldbach, ce crible permet d'affirmer, que si la conjecture est vraie pour tout entier $n\geqslant{30k}$ alors quelque soit l'une des 8 familles choisie, elle vraie aussi...!
car le crible progresse de raison 15 ou 30 peut importe .
Donc par exemple, pour un entier 30k +1, +7, +11...etc ... Cela revient à cribler, n = 30k sans perte de généralité ...
J'ai criblé 30k +1, les trois familles concernées sont : la fam = 1, 13 et 19 ("qui peuvent satisfaire Goldbach")
et pour 30k+7 , les trois familles concernées sont : la fam = 1, 7 et 13
Quelques résultats :
fam :1 ,
Donnez la valeur de n = 30k : 3000001 ; 24473 nombres trouvés en 0.00700068473815918 secondes **
fam : 13
n = 30k : 3000001 ; 24497 nombres trouvés en 0.031001806259155273 secondes **
fam : 19
n = 30k : 3000001 ; 24527 nombres trouvés en 0.034002065658569336 secondes **
pour n = 300 000 001
fam :1 , 1883781 nombres trouvés en 1.2948017120361328 secondes **
fam :13 , 1883976 nombres trouvés en 1.2636022567749023 secondes **
fam :1 9, 1883814 nombres trouvés en 1.2792022228240967 secondes **
pour n = 3000 000 007
fam :1 16885842 nombres trouvés en 13.907795429229736 secondes **
fam :7 16887883 nombres trouvés en 13.908795833587646 secondes **
fam :13 16887274 nombres trouvés en 13.936745405197144 secondes **
Autrement dit, est ce que l'on s'est posé la question : existe t'il un entier 2n = 30k + n, avec n [2;28] pair, et k > 10 ; qui ne satisfait pas la conjecture pour une et une seule des 8 familles, avec $n\geqslant{210 }$ ....
#487 Re : Programmation » crible en python » 17-06-2018 16:07:54
Tu avais raison, mais ce n'est peut être pas un pouième de pouième
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4_modulo30.py =====
Donnez la valeur de n = 30k : 24000000000
Phase d'initialisation: 2.8548049926757812 seconds ---
Bloc S2_s3 : 119.7614107131958 seconds ---
Extraction des premiers n à 2*n : 6.0996105670928955 seconds ---
** 123530551 nombres trouvés en 128.71582627296448 secondes **
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4_modulo30.py =====
Donnez la valeur de n = 30k : 27000000000
Phase d'initialisation: 2.5740044116973877 seconds ---
Bloc S2_s3 : 138.06024265289307 seconds ---
Extraction des premiers n à 2*n : 6.8328118324279785 seconds ---
** 138301355 nombres trouvés en 147.46705889701843 secondes **
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4_modulo30.py =====
Donnez la valeur de n = 30k : 29100000000
Phase d'initialisation: 3.104405403137207 seconds ---
Bloc S2_s3 : 150.4622642993927 seconds ---
Extraction des premiers n à 2*n : 7.378813028335571 seconds ---
** 148600698 nombres trouvés en 160.94548273086548 secondes **
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG4_modulo30.py =====
Donnez la valeur de n = 30k : 29400000000
Phase d'initialisation: 3.744006395339966 seconds ---
Bloc S2_s3 : 166.06229162216187 seconds ---
Extraction des premiers n à 2*n : 7.628413438796997 seconds ---
** 150069716 nombres trouvés en 177.43471145629883 secondes **
>>>
il ne me reste plus qu'à vérifier si il passe à 30 mds....
la modif des 5 lignes est relatif au criblage par famille :
for i in range(8): # on remplace 8 par 1
P8=[1, 7, 11, 13, 17, 19, 23, 29] #on remplace par P8=[1] il ne reste qu'une famille, la 1
Dico=OrderedDict={1:0,7:1,11:2,13:3,17:4,19:5,23:6,29:7} #on ne garde que {1,0} , il ne reste qu'une famille la 1:0
if j%30==1: # Car on ne va cribler que la famille 1 modulo 30, se terminant par 1
fam=Dico[1] # car on a testé ci dessus, si j = 1 modulo 30, d'où calcul du modulo inutile
Et malgrès cela , le chilmiliblic n'avance guerre plus vite , un peu plus de capacité mémoire...on est presque à 30mds....
Voila ....Yoshi , Mais c'est un très bon crible avec un bon programme...Je t'en remercie ....
Pour la conjecture de Goldbach, on sait que l'on a suffisamment de nombre premiers q, pour satisfaire la conjecture ...
On peut même calculer la densité des trois familles P8 = [1,7,13] relatif à 2n = 30k + 14, où : uniquement ces trois familles peuvent satisfaire Goldbach .
La densité est d'environ : ((15k + 7) / Ln (30k + 14)) * 0,375
Pour n = 3 000 007 , on a 73509 premiers q [n ; 2n] , pour une estimation de la fonction ((15k + 7) / Ln (30k + 14)) * 0,375 = 72081
Pour 29 850 000 000 il met 319 secondes , mais pas d'amélioration sur la limite < 29 910 000 000...ce qui n'a pas d'importance
@+
#488 Re : Programmation » crible en python » 17-06-2018 14:56:29
Bonjoiur Yoshi
je vois que cet algorithme te tient....
Tout d'abord:
a) même si on supprime la division de fam=Dico[j%30] on ne gagnerai rien...
b) comme tu l'as surement remarqué même si on ne stock plus cela ne changerai pas grand chose
c) Donc je ne pense pas que le criblage des j au fur et à mesure, de la fonction
debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2
temoin=0
for j in range(debut,fin,pas):
changerait quoi que ce soit à par 1 ou 2 secondes
d) car le résultat que j'ai testé en est une preuve suffisante
e) Je vais donc charger ta nouvelle version en cribleG4Y_modulo30 et voir ce que cela donne pour le criblage de la fam , P8 = 1
je te met trois résultats où j'ai modifié les lignes des cribles G9Y,G2Y et G3Y :
for i in range(8):
P8=[1, 7, 11, 13, 17, 19, 23, 29]
Dico=OrderedDict={1:0,7:1,11:2,13:3,17:4,19:5,23:6,29:7}
if j%3!=0 and j%5!=0:
fam=Dico[j%30]
Afin de ne cribler que par famille...Je ferai ensuite de même avec G4Y et son résultat..
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG9Y_modulo30.py =====
Donnez la valeur de n = 30k : 29400000000
Phase d'initialisation: 3.2604055404663086 seconds ---
Famille de chaque Pi: : 4.336807727813721 secondes ---
Criblage des 8 familles: 155.1110725402832 seconds ---
Extraction des premiers n à 2*n : 7.534813642501831 seconds ---
** 150069716 nombres trouvés en 170.24309945106506 secondes **
=== RESTART: E:\Documents\conjecture de Goldbach\cribleG2Y_par Famille.py ===
Donnez la valeur de n = 30k : 29400000000
Phase d'initialisation: 4.10280704498291 seconds ---
Bloc S2_s3 : 161.14828300476074 seconds ---
Extraction des premiers n à 2*n : 7.566013336181641 seconds ---
** 150069716 nombres trouvés en 172.8171033859253 secondes **
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG3Y_modulo30.py =====
Donnez la valeur de n = 30k : 29400000000
Phase d'initialisation: 3.9000065326690674 seconds ---
Bloc S2_s3 : 156.5618748664856 seconds ---
Extraction des premiers n à 2*n : 7.503613471984863 seconds ---
** 150069716 nombres trouvés en 167.96549487113953 secondes **
il y a des variables de temps qui s'expliquent en fonction de l'écart de temps pour lancer un nouveau test entre les trois cribles; mais l'un dans l'autre à 1 ou 2 seconde près cela ne change rien...Ce qui veut dire que ta dernière version ne gagnerait rien par rapport à la version V.6.2 = G3Y même en modifiant les 5 lignes ci dessus , afin de ne cribler que par famille et supprimer la division de fam=Dico[j%30] qui devient inutile par famille...
@+
#489 Re : Programmation » crible en python » 16-06-2018 19:13:38
Là, tu arrives au bout du bout...LoLLLL
je pense que c'est la même programmation qu'Eratosthène modulo 30 , il faut cribler uniquement par famille, les j au fur et à mesure, pour ne pas utiliser trop de mémoire. et en une seule opération avec q, reste=divmod(j/30)
voila actuellement ce que cela donne pour la famille Dico={1:0}
je me suis un peu embêter pour trouver le bon paramètre
toujours pareil pour , for i in range(1): au lieu de (8)
Mais ensuite il faut modifier la ligne if j%3!=0 and j%5!=0: , comme ceci, if j%30==1:
ce qui est logique puisque l'on ne va traiter que les j se terminant 1 , donc congrus à 1 [30].
résultat avec V.6.2 pour n = 24 300 000 000
>>>
=== RESTART: E:\Documents\conjecture de Goldbach\cribleG2Y_par Famille.py ===
Donnez la valeur de n = 30k : 24300000000
Phase d'initialisation: 2.3400042057037354 seconds ---
Bloc S2_s3 : 122.60061550140381 seconds ---
Extraction des premiers n à 2*n : 6.162010908126831 seconds ---
** 125009260 nombres trouvés en 131.10263061523438 secondes **
>>>
ta dernière modifiée
>>>
===== RESTART: E:\Documents\conjecture de Goldbach\cribleG3_modulo30.py =====
Donnez la valeur de n = 30k : 24300000000
Phase d'initialisation: 2.324404001235962 seconds ---
Bloc S2_s3 : 122.42901492118835 seconds ---
Extraction des premiers n à 2*n : 6.146410703659058 seconds ---
** 125009260 nombres trouvés en 130.89982962608337 secondes ** 3/10éme
>>>
la limite maxi est de 29 850 000 000 en 772 "
Eratostène modulo 30 par famille, met pour n 60 000 000 000 , 300" mais cela n'à rien à voir avec Goldbach, le criblage n'a pas de divisions , de plus ce n'est pas la même raison...ni la même fonction G(n) ...etc...
#490 Re : Programmation » crible en python » 16-06-2018 15:27:23
Tu as raison il marche bien , effectivement on gagne environ 1 seconde sur 3mds , ce qui était à peu près prévu ..
je vais ensuite tester jusqu'où il va ...
Donnez la valeur de n = 30k : 3000000000
Phase d'initialisation: 2.2620038986206055 seconds ---
Bloc S2_s3 : 110.35459399223328 seconds ---
Extraction des premiers n à 2*n : 6.177610635757446 seconds ---
** 135095831 nombres trouvés en 118.79420852661133 secondes **
>>>
Donnez la valeur de n = 30k : 3000000000
Extraction des premiers n à 2*n : 6.19321084022522 seconds ---
** 135095831 nombres trouvés en 119.34020972251892 secondes **
>>>
je vais aller à la pêche....
Merci pour tous tes efforts , et j'espère que je pourrai te payer un bon coup à boire et à manger
Yoshi passe un bon week end A+
Gilbert.
#491 Re : Programmation » crible en python » 16-06-2018 12:38:05
vuC'est ce que je pense : peut être que tu n'aurais pas fais attention à l'ordre des étapes du programme..
La première étape est bien dans l'ordre du programme, des j :
Ordre traitement : [11, 53, 67, 109, 137, 151, 179, 193]
puis :
Vraie Fam : [151, 67, 11, 193, 137, 109, 53, 179]
une fois traité par fam= Dico[j%30] ...!
C'est cette fonction qui classe dans l'ordre la vraie Fam....!
et ensuite traité par le bloc s3 début index pour criblage
c'est comme cela qu'à été écris le programme depuis le début...
J'ai donc remonté le courant et j'ai découvert que traitant les j à la volée, ils ne sont pas traités dans l'ordre de stockage d'une Fam.
Preuve :
comment veux tu traiter les j dans l'ordre de stockage, sans passer par fam= Dico[j%30]....?
Si ce n'était pas le cas, effectivement tu pourrais avoir les début d'index faux, ce qui n'est pas le cas et tu ne pourrais rien faire, pour faire fonctionner le programme, preuve il marche...! mais avec la fonction
que tu pensais inutile...
je t'ai indiqué l'ordre de fonctionnement du crible
1_) initialisation des [1] par rapport à n fixé = 240, ton exe...
2_) récupération des Pi d'Eratosthène
3_) calcul des reste R, 2n%Pi
for i,pi in enumerate(Primes_init):
r=nn%pi
debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2
4_) édition des j < = pi*29 : [11, 53, 67, 109, 137, 151, 179, 193], pour Pi ==7
etc etc tous les [j.........] pour Pi==11
[j.........] pour Pi==13
[j.........] pour Pi==17
[j.........] pour Pi==19
5_) traitement des vraie Fam pour les mettre dans l'ordre de Dico={1:0,7:1,11:2,13:3,17:4,19:5,23:6,29:7}
donc ton exemple: [151, 67, 11, 193, 137, 109, 53, 179]
et comme tu as 5 Pi, appartenant à [7;19]
tu auras 5 Fam [....................]
6_)ensuite début index et criblage bloc s3 ce qui donne pour la Fam ci dessus, [5,2,0,6,4,3,1,5] il y a bien 8 début d'index; où est ce que c'est , ou que cela pourrait être faux...?
où est ce que tu as vue qu'ils étaient archi faux...? tous les programmes que tu as modifiés fonctionnent....
Mais ils y a deux blocs 2,3 qui font un travail, qui pourrait être réduit à un seul suivant, l'explication de mon dernier #post
à partir du point 4_)...c'est ce que je faisais avec excel ...ou autre ..
est ce que tu as vu le programme: def crible_G(n) du début premières page post #1 ("tu verrais en gros le principe...")
#492 Re : Programmation » crible en python » 16-06-2018 08:53:21
ok pour le fer à repasser ...LoLLLLL
Toi tu proposes de stocker tous les j dans Fam, puis de repartir de cpt =0 avec une nouvelle boucle, moi je traite les j dans l'ordre de leur création (avec l'index cpt) au fur et à mesure...
ce n'est pas tout à fait cela que je propose , j'ai bien compris ton explication du fonctionnement de la programmation, que tu m'expliques .
mais le programme lui il garde bien en mémoire tous les j relatif à leur Pi à partir de cette fonction :
r=nn%pi
debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2
et le dernier gardé en mémoire relatif au dernier Pi =31 , pour N=600
est {53, 115,177,239,301,363,425,487,549,611,673,735,797,859,921}
A quoi sert Fam, alors ? Juste à empêcher qu'on traite un j trop souvent : à l'intérieur d'une Fam (ex Pf[i'])
Ok pas de problème...
Mais tu crées le début d'index , à partir du traitement de Fam = [301,487, 611, 673, 797, 859, 53, 239] "avec l'exemple de la dernière Fam de n=600"
et si tu n'as pas l'instruction au bloc s3 :
le bloc s3 ne va pas cribler...
En principe, Fam[cpt] c'est le j traité
oui exact, je les ai vérifiés , c'est comme cela que j'en suis arrivé à la fonction : for cpt in range(8)
Donc pour éviter tous ces traitements et stockage
il ne faut avoir qu'un famille , par ex : Dico={1:0}
pour n=240 et le premier Pi = 7;avec R =4
les j sont{(11), 25,39,53,67,81,95,109,123,137,151,165,179,193,207..} la limite des j = 203=7*29
Alors , peut être qu'avec cette fonction : q,reste=divmod(j,30) : ont peut tout faire.
j=(11)
si reste != 1 puisque l'on a que la famille Dico={1:0} on passe j suivant, 53, 67, 109, 137, arrive :
j =151 ; reste ==1 et q == 5 d'après la fonction q,reste=divmod(j,30) : , et q , qui devient le début d'index pour :
for j in range(1):
debut_index=q # Je crée le début_index à partir du j et la suite c'est le bloc s3
Nombres_j=nombres[j]
for index in range(debut_index, nbcell,pi):
Nombres_j[index] = 0
voila ce que je pensais ....Donc, je pensais aussi que l'on pouvait se passer des Fam,cpt et leurs traitements...par
for j in range(debut,fin,pas):
if j%3!=0 and j%5!=0:
fam =Dico[j%30]
if Fam[fam] == 0: # Si l'emplacement contient 0
Fam[fam] = j # j'y stocke le j
cpt+=1 # j'augmente mon compteur de 1
Voili , Voila....et en plus je n'ai plus besoins du fer.......
@+
#493 Re : Programmation » crible en python » 16-06-2018 06:27:16
Bonjour @Yoshi
En résumé :
Pour n = 600 ; le dernier Pi = 31 et son reste R = 22 .
soit : R + Pi = j = 53
calcul des {15 j} ≤ f , f =31*29 = 899
{53, 115,177,239,301,363,425,487,549,611,673,735,797,859,921}
Traitement des j dans Fam,cpt[0,0,0,0,0,0,0,0,],-1
Fam =[301,487, 611, 673, 797, 859, 53, 239] pour le dernier Pi = 31 et son R =22
Par le boc s2:
if Fam[fam] == 0:
Fam[fam] = j
cpt+=1
Ce qui veut dire que le programme garde en stock et en mémoire virtuelle tous les J et les Fam,cpt[0,...,0],-1;
pour les traiter par le dernier bloc s3
Criblage de P8, des 8 fam jusqu’à n /30 ; par le bloc s3 avec la fonction :
Si cette fonction est enlevée, le criblage ne se fait pas de façon correcte.
Ce qui s’est traduit par une erreur du nombre de premiers # V .6.0. #
for cpt in range(1):
debut_index=Fam[cpt]//10//3
Nombres_cpt=nombres[cpt]
for index in range(debut_index, nbcell,pi):
Nombres_cpt[index] = 0
L’idéal, serait de traiter au fur et à mesure la liste des {15 j} ≤ f , au fur et à mesure avec une seule fonction :
q,reste=divmod(j,30) : ou avec, fam ,Dico[j%30]= divmod(j,30)
en passant peut être directement au bloc s3, si on peut récupérer l’index lors de la phase : fam =Dico[j%30].
for cpt in range(1):
debut_index= “fam, Dico[j%30]= divmod(j,30) “ # ce qui ne s’écrit surement pas comme cela…
Nombres_cpt=nombres[cpt]
for index in range(debut_index, nbcell,pi):
Nombres_cpt[index] = 0
Pour info voila ce que donne cette version, équivalente à l'avant dernière G1Y: pour la famille Dico = {7:0}
V=== RESTART: E:\Documents\conjecture de Goldbach\cribleG2Y_par Famille.py ===
Donnez la valeur de n = 30k : 29400000000
Extraction des premiers n à 2*n : 7.48801326751709 seconds ---
** 150067287 nombres trouvés en 168.4178957939148 secondes ** premier q [n ;2n]; Fam = 23 modulo 30
>>>
=== RESTART: E:\Documents\conjecture de Goldbach\cribleG2Y_par Famille.py ===
Donnez la valeur de n = 30k : 29550000000
Extraction des premiers n à 2*n : 7.534813404083252 seconds ---
** 150801281 nombres trouvés en 174.2055060863495 secondes **
>>>
=== RESTART: E:\Documents\conjecture de Goldbach\cribleG2Y_par Famille.py ===
Donnez la valeur de n = 30k : 29700000000
Extraction des premiers n à 2*n : 7.628413438796997 seconds ---
** 151535675 nombres trouvés en 424.33634519577026 secondes **
#494 Re : Programmation » crible en python » 15-06-2018 20:19:36
Re Yoshi: "j'étais en train de te donner la réponse"
effectivement tu avais raison et j'ai bien compris tes explications car j'étais en train de faire différents tests pour vérifier qu'il n'y avait pas d'erreur dans les Fam..
Voila l'erreur: comme tu le supposer, tous les Fam sont juste et les j aussi.
donc j'ai regardé avec l'indentation de G9Y
il y avait quelque chose qui me chiffonnait le fait d'avoir mis cpt et non j
il faut "réindenter" cette partie..avec:
Car c'est cette fonction qui permet de cribler correctement.
for j in range(debut,fin,pas):
if j%3!=0 and j%5!=0:
fam =Dico[j%30]
if Fam[fam] == 0:
Fam[fam] = j
cpt+=1
for cpt in range(8):
debut_index=Fam[cpt]//10//3
Nombres_cpt=nombres[cpt]
for index in range(debut_index, nbcell,pi):
Nombres_cpt[index] = 0
résultat:
Extraction des premiers n à 2*n : 0.6240010261535645 seconds ---
** 15072378 nombres trouvés en 10.015217542648315 secondes **
Appuyez sur une touche pour continuer...
résultat avec G9Y:
Donnez la valeur de n = 30k : 300000000
Phase d'initialisation: 0.2652003765106201 seconds ---
Famille de chaque Pi: : 0.28080058097839355 secondes ---
Criblage des 8 familles: 9.172816038131714 seconds ---
Extraction des premiers n à 2*n : 0.6552011966705322 seconds ---
** 15072378 nombres trouvés en 10.37401819229126 secondes **
pou n=3 000 000 000
Donnez la valeur de n = 30k : 3000000000
Extraction des premiers n à 2*n : 6.208811044692993 seconds ---
** 135095831 nombres trouvés en 120.27621126174927 secondes **
Appuyez sur une touche pour continuer...
je met le programme de ta version, qui fonctionne parfaitement:
from time import time
from os import system
from collections import OrderedDict
## V. 6.0.1 ##
def eratostene(n):
n = int((2*n)**0.5)
m = (n-1) // 2
limite=1+n
b = [True]*m
premiers = [2]
for i,p in enumerate(range(3,limite,2)):
if b[i]:
premiers.append(p)
j = 2*i*i + 6*i + 3
debut,pas=j,2*i+3
for j in range(debut,m,pas):
b[j] = False
debut=i
for i in range(debut,m):
if b[i]:
premiers.append(p)
p += 2
return premiers[3:]
def CribleG2Y_mod30(n):
# INITIALISATION
start_i= time()
Primes_init = eratostene(n)
nn,nbcell,nbcl=n*2,n//30,n//30-1
nombres=[]
for i in range(8):
nombres.append([1]*nbcell)
Pfam,P8=[],[1, 7, 11, 13, 17, 19, 23, 29]
Dico=OrderedDict={1:0,7:1,11:2,13:3,17:4,19:5,23:6,29:7}
s_1=time()-start_i
#print("Phase d'initialisation: %s seconds ---" % s_1)
# FAMILLES POUR CHAQUE Pi
start_time = time()
for i,pi in enumerate(Primes_init):
r=nn%pi
debut,fin,pas=r+pi*(1-r%2),1+r+pi*29,pi*2
Fam,cpt=[0,0,0,0,0,0,0,0],-1
for j in range(debut,fin,pas):
if j%3!=0 and j%5!=0:
fam =Dico[j%30]
if Fam[fam] == 0:
Fam[fam] = j
cpt+=1
for cpt in range(8):
debut_index=Fam[cpt]//10//3
Nombres_cpt=nombres[cpt]
for index in range(debut_index, nbcell,pi):
Nombres_cpt[index] = 0
s_23=time()-start_time
# CALCUL DES NOMRES PREMIERS ENTRE n ET 2*n
start_time = time()
total = 0
for sous_liste in nombres:
total+=sum(sous_liste)
s_4=time() - start_time
s=s_1+s_23+s_4
print("Extraction des premiers n à 2*n : %s seconds ---" % s_4)
return total,s
n = int(input("Donnez la valeur de n = 30k : "))
nbr,s= CribleG2Y_mod30(n)
print ("\n** ",nbr,"nombres trouvés en %s secondes" % s ,"**")
system("pause")
je vais faire quelque test par famille.
@+++ Merci infiniment pour ton travail et ta pugnacité......
#495 Re : Programmation » crible en python » 15-06-2018 13:18:43
Bonkour @Yoshi
for index in range(debut_index, nbcell,pi): je ne vois pas pourquoi l'erreur viendrait de cette ligne , car il n'y a vraiment aucune raison....
Par contre cette ligne : debut_index=Fam[cpt]//10//3 est toujours génératrice d'erreur , mais surtout je ne comprend pas pourquoi tu calcules le début index avec Fam[cpt]....?? est ce que Fam[cpt] représente les j....?
la marge d'erreur à l'ai exponentielle .. Et il n'est pas sûr que l'on ai un gain de temps...regardes le résultat :
cette version avec n= 300 000 000Extraction des premiers n à 2*n : 0.639601469039917 seconds ---
** 16825025 nombres trouvés en 9.952817678451538 secondes **
Appuyez sur une touche pour continuer...
avec G9Y
Donnez la valeur de n = 30k : 300000000
Phase d'initialisation: 0.28080058097839355 seconds ---
Famille de chaque Pi: : 0.28080058097839355 secondes ---
Criblage des 8 familles: 9.07921576499939 seconds ---
Extraction des premiers n à 2*n : 0.6240010261535645 seconds ---
** 15072378 nombres trouvés en 10.264817953109741 secondes **
Appuyez sur une touche pour continuer...
debut_index=Fam[cpt]//10//3 je viens d'essayer avec: debut_index=Fam[fam]//10//3 et avec debut_index=j//10//3
toujours une erreur, moins importante ...
Extraction des premiers n à 2*n : 0.6708011627197266 seconds ---
** 16654488 nombres trouvés en 10.311618089675903 secondes **
Appuyez sur une touche pour continuer...
Ce qui apparait donc au niveau du crible, c'est une augmentation du nombre de nombres premiers , par exemple pour n = 3 000 000 000
gain de temps 1,5 seconde; mais une erreur de 16 000 000 de premiers en plus...
Ce qui veut dire que le paramétrage est erroné d'où certain j sont mal indexés et ou mal positionnés , ou encore que des doublons ont été supprimés;
de ce fait les Pi ne font pas leur travail et ne marquent pas des [0] donc plus de [1]....!
voila le paramétrage et criblage correcte, ie; si il y a la bonne position des index au départ de chaque Pi.
On a 87 Premiers P [600 ; 1200] ; pour n = 600
f1 : [0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0]<...>[0,0,0,1109,0,1049,1019,0,0,929,0,0,839,809,0,0,719,0,659,0]
f7 : [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0]<..>[1193,1163,0,1103,0,0,1013,983,953,0,0,863,0,0,773,743,0,683,653,0]
f11: [0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1]
f13: [1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1]
f17: [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1]
f19: [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
f23: [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1]
f29: [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1]
ce qui n'est pas du tout le cas avec la nouvelle version
en mettant la fonction print(nombres)
print("Extraction des premiers n à 2*n : %s seconds ---" % s_4)
print(nombres)
return total,s
#496 Re : Programmation » crible en python » 14-06-2018 09:53:41
Re,
J'ai un point d'interrogation : je me demande si en supprimant ce stockage, et pour de très grands nombres n, on ne va pas perdre un temps fou à refaire x fois supplémentaires le même travail de remplacement de 1 par des zéros.
Cela dit, je vais tâcher d'examiner soigneusement ce que tu proposes ci-dessus...
@+
a_): les doublons le programme ne les évite pas car comme je te l'ai expliqué ci-dessus hier matin avec l'exemple de n= 4770
le programme repasse bien plusieurs fois sur un même 0 dans une famille ou d'autre en fonction de l'index de j relatif à son Pi qui crible
b_): Pour moi si on diminue le stockage qui prends du temps et de la mémoire; car il faut quand même rappeler les Pfam stockées pour les traiter, on gagne en limite que l'on peut cribler...
c_): actuellement le programme stock : pour une limite n fixée par exemple 3 000 000 .
tous les j <= f
(" relatif à leur Pi qui va cribler la liste Nombres_j , c'est à dire remplacer les [1] en [0] , les congrus à 2n%Pi ")
puis il classe les j dans Pfam par rapport à l'ordre de Dico={1:0,......etc..29:7}
Ensuite il rappelle les Pfam relatif à chaque Pi pour les traiter , c'est à dire calculer l'index i , le positionner dans P8 la liste Nombre_j [index] = 0,
afin que Pi crible de i à n/30 , ie; remplacer les [1] par [0] par pas de Pi...
d'où pourquoi on perdrait un temps fou....?
d_):
si on traite qu'une famille, par exemple Dico={7:0} on sait qu'il faut vérifier :
et de calculer son index:
debut_index=j//10//3
Nombres_j=nombres[j]
for index in range(debut_index, nbcell,pi):
Nombres_j[index] = 0
On devrait diviser le temps de 13 secondes environ, par 5 , pour n = 3 000 000 000....
#497 Re : Programmation » crible en python » 14-06-2018 08:01:39
Bonjour @Yoshi
Tu disais, que la difficulté post#254 ci-dessus était:
if j%3!=0 and j%5!=0:
fam =Dico[j%30]
if Pf[fam] == 0:
Pf[fam] = j
je pense que l'on peut la résoudre assez facilement.
étant donné que jusqu'à ce bloc s2,3. on peut traiter par famille..en modifiant dans initialisation
et en dessous Pfam=j;
#au lieu de (8)
Ainsi que dans dans
.
il suffit de choisir la première famille que l'on veut cribler par exemple la famille p8=7 , je modifie:
je passe la famille 7 en position 0, et 1 en position 1...
il suffit de modifier la partie s2 comme ceci on ne vérifie que si j%30==7, sinon au passe à j suivant:
if Pf[fam] == 0:
Pf[fam] = j
ce qui devrait donner:
for j in range(debut,fin,pas):
Pf=Pfam[i]
if j%30==7:
fam =Dico[j%30]
if Pf[fam] == 0:
Pf[fam] = j
for j in range(1):
debut_index=Pf[j]//10//3
Nombres_j=nombres[j]
for index in range(debut_index, nbcell,pi):
Nombres_j[index] = 0
Est ce qu'il faut supprimer des lignes en amont , qui ne sont plus utiles, afin de traiter que les j <= f au fur et à mesure ,et pour chaque Pi ....? ou est ce que l'on peut laisser comme tel ....?
ce qui éviterait d'utiliser Pfam, et même Dico={1:0,.....29:7}
On ne stockerait, que pour chaque Pi que sa la liste de j <= f ; au fur et à mesure que cahque Pi crible la famille p8 = 7 ou autre ....
Non...?
{"par contre je ne sais pas comment il faut réécrire les lignes ou en supprimer.... ..."}
voila ce que j'ai essayé et modifié :
for j in range(debut,fin,pas):
Pf=Pfam[i]
if j%30==7:
for j in range(1):
debut_index=j//10//3
Nombres_j=nombres[j]
for index in range(debut_index, nbcell,pi):
Nombres_j[index] = 0
Mais comme tu peux le voir, cela crée une erreur et sans gain de temps...alors qu'il y a moins de division en principe:
G9Y le bon code
Donnez la valeur de n = 30k : 3 000 000 000
Phase d'initialisation: 0.32760071754455566 seconds ---
Famille de chaque Pi: : 0.390000581741333 secondes ---
Criblage des 8 familles: 12.480021953582764 seconds ---
Extraction des premiers n à 2*n : 0.7644011974334717 seconds ---
** 16887073 nombres trouvés en 13.962024450302124 secondes **
Appuyez sur une touche pour continuer...
G1Y code modifié:
Donnez la valeur de n = 30k : 3000000000
Phase d'initialisation: 0.3120005130767822 seconds ---
Famille de chaque Pi: : 12.870022773742676 secondes ---
Extraction des premiers n à 2*n : 0.8268013000488281 seconds ---
** 23137528 nombres trouvés en 14.008824586868286 secondes **
Appuyez sur une touche pour continuer...
***************************************************************************
Par contre en modifiant uniquement la ligne :
par :
ce qui permet de ne prendre que les j de la famille p8 = 7 et de sauter les autres..
Bien entendu en modifiant Dico={7:0.......etc 29:7} on met donc la famille p8 = 7 à l'indice 0 dans Dico.
On à le bon résultat dans les deux cribles G1 et G9, mais on ne gagne rien en temps..
#498 Re : Café mathématique » Article sur les deux infinis égaux démontrés il y a quelques mois. » 13-06-2018 06:44:55
@Sylvieg
Mais laisser ces énormités risque de faire croire que nimporte qui peut pondre, sans garde fou, un texte scientifique dans un domaine un peu pointu.
N'importe qui à le droit de s'exprimer...En quoi cela vous gène..Je ne vois pas pourquoi un domaine un peu pointu serait réservé à des soit disant scientifiques quelque soit leur compétence...Heureusement d'ailleurs...!
#499 Re : Programmation » crible en python » 10-06-2018 08:58:52
Bonjour@Yoshi
hier j'ai oublié de te répondre à cette question:
un même nombre (je l'ai déjà vu) peut figurer dans deux familles ou plus...
Est-ce que cela signifie que le programme le traite ensuite plusieurs fois ? C'est à dire que, le rencontrant plusieurs fois, il intervient plusieurs fois dans la listes nombres pour écrire 0 dans un emplacement, alors même que c'est déjà fait ?
Bien sûr..C'est identique à Eratosthène modulo30...
les nombres premiers Pi repasserons plusieurs fois sur un même nombre n < n=30k, qui dans 2n se factorise par 2,3,4 ou plusieurs facteurs Pi, ils marqueront [0] alors que ce [0] est déjà marqué ...
Prend un simple exemple:
pour n = 30k = 4770; 2n = 9540
prends j = 41 famille p8 = 11, il serra marqué [0] à partir de l'index 1, par 7, 23 et 59; car 9499 se décompose en facteurs premiers {7,23,59} et: 7, 23, 59 vont commencer à cribler à partir de ce début d'index = 1
Ensuite : prend maintenant 2n + 30 = 9570
et bien tu vas trouver 41+30 = 71 trois fois, car 9499 est toujours divisible par 7,23,59 donc 71 est congru à 9570 modulo 7,23,59
7%9570 = 1 = j et j+5*14 = 71
23%9570 = 2 , +23 = 25 = j, et + 46 = 71
59%9570 = 12 et + 59 = j = 71
Ce qui implique que : 7 , 23 et 59 vont marquer [0] dans la famille p8 = 11, mais: à l'index 2...soit : (71-11) / 30 = 2.
A partir de cet index = 2 , les trois Pi vont cribler la fam = 11, supposons que tu écartes les doublons, il n'y aura que le premier Pi = 7 qui va cribler , les deux autres :23 et 59 seront écartés d'où, le crible est faux et cela se traduit par une augmentation de [1] donc plus de nombres premiers de n à 2n...
C'est pour cela que je te disais, ce crible n'est que la réplique d'Eratosthène , mais dans les congruences et d'où ce n'est qu'un corollaire du TNP, du TFA et du théorème de Chebotarev sur la densité de premiers dans des suites arithmétique de raison 30...
[ Pour la petite histoire: C'est élémentaire mais pas étudié ...Dommage... Au moins grâce à ton programme on peut étudier plus loin ...la répartition des nombres premiers de n à 2n...Car cet outil arithmétique permet de prouver de façon incontestable ces trois corollaires...!]
#500 Re : Programmation » crible en python » 09-06-2018 15:31:21
Re,
La difficulté, elle est là ;
if j%3!=0 and j%5!=0:
fam =Dico[j%30]
if Pf[fam] == 0:
Pf[fam] = jParce qu'il n'y a pas un simple stockage des nombres j, ils sont rangés par famille, et un nombre n'est stocké dans une famille que s'il n'y figure pas déjà.
@+
C'est bien pour cela qu'il faut ranger l'index au fur et à mesure dans P8 liste nombres, et cribler pour ensuite reprendre le j suivant..etc une fois P8 criblé on passe à Pi suivant.
j%30 et Dico[j%30]
Si on garde les deux, on peut les obtenir d'un coup :
q,reste=divmod(j,30) :
Ce qui veut dire que le reste va indiquer la famille où on va placer l'index... afin de cribler
Ce qui implique qu'il faut que fam =Dico[j%30] ou différemment donne le quotient = index avec le reste qui correspond à la famille de P8 ou Dico= {1:0,........29:7}
j'avais essayé si on suprime Pfam et Dico={1:0.....29:7} il ne reste que P8, qui devient l'un des 8 nombres {1,7,11,13,17,19,23,29}
cela ne change rien aux j
tu appelles les j au fur et à mesure, avec leur Pi, tu n'as que l'index à calculer
on veux que la famille p8=7
on écarte j = D_c{1,3,5,9}
p8=q,j%30 , va nous donner l'index qui est le quotient, ainsi que le reste correspondant à la famille p8=7 .
si j%30 != 7 on continue au j suivant se terminant par 7; il n'y a que 3 cas possibles: multiple de 3 se terminant par 7, fam p8=17[30 et celle que l'on crible p8 = 7
au niveau du stockage soit on a tous les j par rapport à n =30k puis on traite, ce qui se passe actuellement...
Ou alors, on peut même les faire au fur et à mesure de Pi et R appelé.. des que le j de P8=7 est traité avec son Pi,
on passe à Pi et R suivant , calcule des J , on traite ...etc
en tout et pour tout, pour chaque Pi et R on a au maximum 3 division...et des que le j%30 = 7 est trouvé, criblage et on passe à Pi suivant, ce qui raccourci encore les étapes...
On en revient à ce que tu as supposé ce matin...







