Bonjour,

Etant donné un ensemble E constitué des nombres premiers plus petits que 4000, je voudrais connaître le nombre de sous ensembles de E, qui, quand on additionne leurs éléments, donne un nombre premier.

Voici le code que j'ai écrit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# -*- coding: cp1252 -*-
import time
 
if __name__ == "__main__":
    try:
        import psyco
        psyco.full()
    except ImportError:
        pass
 
start=time.time()
 
def premiers(n, p=[2,3,5]):
    """Retourne la liste des nombres premiers <= n (méthode=division)"""
    k = p[-1]+2
    if n < k:
        return [x for x in p if x<=n]
    while k <= n:
        i = 0
        while i < len(p):
            if p[i]*p[i] > k:
                p.append(k)
                break
            if (k % p[i]) == 0:
                break
            i += 1
        k += 2
    return p
 
def partiesliste(seq):
    p = []
    i, imax = 0, 2**len(seq)-1
    while i <= imax:
        s = []
        j, jmax = 0, len(seq)-1
        while j <= jmax:
            if (i>>j)&1 == 1:
                s.append(seq[j])
            j += 1
        p.append(s)
        i += 1 
    return p
 
def estpremier(n):
    """estpremier(n): dit si un nombre est premier (renvoie True ou False)"""
    if n<7:
        if n in (2,3,5):
            return True
        else:
            return False
    # si n est pair et >2 (=2: cas traité ci-dessus), il ne peut pas être premier
    if n & 1 == 0:
        return False
    # autres cas
    k=3
    r=n**0.5
    while k<=r:
        if n % k == 0:
            return False
        k+=2
    return True
 
seq=partiesliste(premiers(4000))
c=0
 
for i in seq:
	s=0
	for j in range (0,len(i)):
		s+=i[j]
	if estpremier(s)==True:
		c+=1
 
 
 
c=str(c)
l=len(c)
rep=c[0:10]+'-'+c[l-10:l]+'-'+str(l)
Ce code marche très bien pour les nombres premiers <50 par exemple mais me sort une Memory Error quand je considère ceux <4000.

Du coup, je fais appel aux programmeurs comme vous, qui pensent programmation, comment faire ?

Merci

PS1: les fonctions sont issues du site Les recettes de Tyrtamos
PS2: j'utilise Python 2.7 sous Windows. Je suis plutôt novice et je n'ai pas envie de me faire insulter ou mépriser ni sur mes erreurs de débutant, ni sur mon système d'exploitation. Merci !
PS3: si quelqu'un a une autre idée avec un autre langage compilable en ligne, je suis preneur...