modification programme crible
Bonjour
j'ai un petit souci: le but étant d'avoir deux cribles équivalents; pour cribler de N à 2N "Goldbach" et de 7 à N "Eratosthène" :
Afin de justifier les deux fonctions relatives à
:
et
Voici la partie que je voudrai modifier pour utiliser GCrible de Goldbach dans Ecrible Eratosthène :
Voici la partie du progr origine que je dois modifier:
1) On remplacera la première ligne de def eratostene
Code:
1 2
| def eratostene(n):
n = int((2*n)**0.5) par n = int(n**0,5) |
*****************************
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
def GCrible(premiers, n, fam):
start_crible = time()
# On génère un tableau de N/30 cases rempli de 1
crible = n//30*[1]
lencrible = len(crible)
# On calcule les restes: ri = 2*n/pi
nbpremiers = len(premiers)
n2 = 2*n
for i, premier in enumerate(premiers):
reste = n2 % premier
# tant que ri % 30 != fam on fait ri += 2pi
if reste % 2 == 0:
reste += premier
pi2 = 2*premier
while reste % 30 != fam:
reste += pi2
# Ensuite on divise ri par 30 pour obtenir l'indexe
reste //= 30
# On crible directement avec l'index
for index in range(reste, lencrible, premier):
crible[index] = 0 |
#################################################################
Voici la partie que je veux modifier mais qui ne marche pas :
là on crible pareil, mais on n’a plus besoin de calculer le reste r de 2n par premiers…
Il faut par contre, une fonction tableMulti pour calculer le produit de pi = 1,7,11,13,17,19,23,29
Par premiers, et que l’on réitèrera. Pour chaque premier…
De sorte que j = pi * premiers , pour chaque premier , on calculera ensuite l’index…pour cribler ; au lieu du reste, dans Goldbach.
et ensuite que : j %30 == 1
exemple :
n = 3000 on a initialiser les 1 , 3000 /30 = 100, soit 100 cellules de 1
je prends premiers = 7
je calcule J = pi *7……….donc 8 produits au maximum, en vérifiant si j %30 == 1 car on crible la fam 1.
7*1 , 7*7, 7*11, 7*13 == 1%30 ; donc ok et je n’ai pas besoin d’aller jusqu’à pi = 29 pour calculer 7*29, d’accord….
Puis je vais calculer son index j = 91 , 91//30 = 3
Je positionne cellule 3 et je crible par pas de premiers = 7…de 3 à n//30 on remplace les [1] par [0] tous les 7 pas….etc… on réitère avec premiers = 11…..premiers <= sqrt de n et non de 2n, car c’est Eratosthène….modulo 30
**************************
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
def ECrible(premiers, n, fam):
start_crible = time()
# On génère un tableau de N/30 cases rempli de 1
crible = n//30*[1]
lencrible = len(crible)
# On calcule le produit : j = pi * premiers, pour partir de lindex de ce produit
nbpremiers = len(premiers)
pi = 1,7,11,13,17,19,23,29
for i, premier in enumerate(premiers):
def tableMulti (premiers,pi):
j = pi * premiers
# tant que j % 30 != fam on fait pi * premiers
while j % 30 != fam:
tableMulti(pi*premiers)
# Ensuite on divise j par 30 pour obtenir l'indexe
if j % 30 == fam:
j //= 30
# On crible directement à partir de l'index
for index in range(j, lencrible, premiers):
crible[index] = 0 |
le reste du programme, ne change donc pas.
message d’erreur
Traceback (most recent call last):
File "E:\Documents\Conjecture de Goldbach\Crible_G.T.Y_modulo30.py", line 85, in <module>
main()
File "E:\Documents\Conjecture de Goldbach\Crible_G.T.Y_modulo30.py", line 80, in main
ECrible(premiers, n, 1)
File "E:\Documents\Conjecture de Goldbach\Crible_G.T.Y_modulo30.py", line 55, in ECrible
while j % 30 != fam:
UnboundLocalError: local variable 'j' referenced before assignment
>>>
Et ensuite je le ferai ...si possible...en C++ afin de le publier à la suite de ce fil .....:D