Bonjour à tous,
Le nombre 34 est entouré de deux premiers équidistants 31 et 37.
Trouverez-vous le nombre entier <1 000 000 qui bat le record de cette position
centrale.
Bonjour
qu'entends tu par "record" ?
deux nombres premiers consécutifs ayant même parité, leur moyenne est toujours un entier, donc ça fait un paquet de milieux équidistants de leurs deux voisins premiers, mais en quel sens "record" ?
salut
l'intervalle de plus grande amplitude je présume ...
on cherche donc p premier milieu de [m, n] avec n - m maximal ...
en notant p[...] la liste des premiers <= 10^6 et de longueur L un algo est donc
k = 2
d = 0
For i in range L
e = p(i + 1) - p(i - 1)
If e > d ##
k = p(i)
d = e
Write k, e
Rien ne dit que le nombre premier supérieur au nombre recherché est inférieur à 106.
Il faut donc la liste des premiers inférieurs à 2.106.
Non?
oui effectivement ... mais je suis près à parier que parmi les dix (allez 100) successeurs de 10^6 il y a un premier ...
et je parie de même que le prédécesseur de 10^6 n'est pas premier ...
je parie même 10^6 € là-dessus !!! qui veut jouer avec moi ?
mais je ne suis pas d'accord avec toi finalement : on décide de s'arrêter aux premiers inférieurs à 10^6 ... enfin si tel est la question ...
Si je puis me permettre de faire une suggestion au niveau de ton algorithme carpediem, on gagnerait beaucoup de temps de calcul en calculant les e et d en même temps qu'on génère les premiers successifs avec un crible.
(Pour n = 10**6 seulement cela ne fait pas grande différence, cependant)
Par contre, ce qui est assez facheux, c'est qu'à chaque fois que tu fais p[i], p[i+1], p[i-1] tu accèdes trois fois à la mémoire, ce qui est lent. Un seul accès suffit en fait
Exemple de crible sans calcul de d et e au fur et à mesure, mais qui évite de trop lire la mémoire:
import numpy
def premiers(n):
sieve = numpy.ones(n//3 + (n%6==2), dtype=numpy.bool)
for i in range(1,int(n**0.5)//3+1):
if sieve[i]:
k=3*i+1|1
sieve[k*k//3::k<<1] = False
sieve[k*(k-2*(i&1)+4)//3::k<<1] = False
return numpy.r_[2,3,((3*numpy.nonzero(sieve)[0][1:]+1)|1)]
p = premiers(10**6)
j,k,d,e = 1,3,3,3
p0,p1,p2 = p[:3]
for i in range(2,len(p)-1):
e = p2-p0
if e > d: j,k,d = i,p1,e
p0,p1,p2 = p1,p2,p[i+1]
print j,k,d,e
p0,p2 = p[j-2],p[j]
print "En position %d/%d : p1 = %d et p2-p0=%d-%d=%d"%(j,len(p),k,p2,p0,p2-p0)
Bonsoir,
Mon entier record est par définition encadré de nombreux entiers non premiers .Par
rapport à eux il et le seul au milieu des deux premiers qui les bornent .
J'ai dit <1 000 000 pour rester sur des bases " jouables".
Comme exemple supérieur je donne 20 831 218 qui est précédé et suivi de 104
entiers non premiers.
Ulmiere : tes suggestions sont toujours les bienvenues
malheureusement mon niveau est "devenu" fort modeste en informatique (tout comme en math d'ailleurs)
et mon gros pb est la connaissance du vocabulaire (les "mots" du langage) ainsi rien que la ligne "k = 3 * i + 1 | 1" et la suivante me posent des difficultés avec cette barre verticale et ce [ ... : : k < < 1]
je ne te demande pas de m'expliquer (ce serait trop pénible par ce mode de communication) mais je mets ce fil dans mes archives "algo" car ça m'intéresse d'approfondir ...
je te remercie et n'hésite pas à me reprendre !! j'ai eu une formation et des maître qui me permettent de savoir qui je suis (ou ce que je suis) !!! en toute modestie
j'avais donc bien conscience que mon algo très naïf était peu performant
l'idée était surtout de pointer que je résolvais un autre pb (écrire un un algo dont il faudrait cependant prouver la validité) qui me permettait de résoudre ce pb parce que je ne vois guère comment on peut résoudre ce type de pb autrement que par l'informatique
dont permets toi sans pb !! et merci par avance
on a résolu le pb (Ulmiere très efficacement mieux que moi) qui permet de résoudre ton pb ... donc on a résolu ton pb !!!
la valeur de ce premier est sans intérêt concrètement ...
Bon alors je la donne puisque c'était la question.....
492 170 est précédé et suivi de 56 entiers non premiers ,il n' y a pas mieux avant 20 831 218
je ne pense pas qu'on puisse prouver ce résultat autrement que par l'informatique donc ta question (fort intéressante) a pour seul objectif de faire un algo ...
ensuite vient éventuellement la question de :
la validité de cet algo
l'efficacité de cet algo
ta réponse nous permet de répondre à la première question
Ah d'accord, c'est un peu différent de la réponse que nous t'avons donnée. tu cherches en fait le/un entier n pas forcément premier qui équidistant de deux nombres premiers p1 et p2 tels que la distance p2-p0 soit maximale. Ou alors j'ai mal compris, et par "record", tu veux dire que tu cherches plutôt à maximiser n ?
Le code que j'ai donné fournit une réponse à la première question, à condition de faire quelques changements (on n'aura plus besoin de trois premiers consécutifs mais seulement de deux, et il faut remplacer "k=p1" par "k=p0+p1>>1"
Concernant les questions de carpediem,
- L'opération | est un "ou" binaire. 0|0 = 0, 1|0=0|1=1, et 1|1 = 1.
Par conséquent, k = 3 * i + 1 | 1 signifie : "placer 3i+1 dans k. Si k est impair, rajouter 1". Ou en français pur : "mettre dans k le plus petit entier pair supérieur ou égal à 3i+1"
Les parenthèses sont inutiles car les opérateurs binaires |,&,^, <<, >> sont à faible précédence. Cela signifie que a+b|c est interprété comme (a+b)|c (et de même pour toutes les opérations arithmétiques à la place de + et toutes les opérations binaires à la place de |)
(les conditions que je donne ci-dessous entre parenthèses portent surdes x et y qui valent 0 ou 1 bien-sûr)
- & est le "et" binaire (0&x = 0 et 1&x = (x==1))
- ^ est le "ou exclusif" binaire (x^y == (x!=y))
- ~ est le "non" binaire (à ne pas confondre avec le "non logique") et signifie ~a=-a-1. C'est une histoire de complément à deux et à un, pas très important
- a << b signifie "décaler les bits de a de b crans vers la gauche". Autrement dit, calculer a * (2**b)
- a >> b signifie "décaler les bits de a de b crans vers la droite". Autrement dit, calculer la partie entière E( a / (2**b) )
- [ ... : ...: ...] est un opérateur de slice (en français, de coupure, de séléction)
t[x:y:z] signifie séléctionner les éléments du tableau t d'indice x<=i<y avec un pas de z.
Par exemple [1,2,3,4,5,6,7,8,9,10][1:8:2] séléctionne les indices 1,3,5,7, qui correspondent aux valeurs 2,4,6,8.
x,y,z peuvent tous être omis. Pas de x signifie "commencer à 0", pas de y signifie "s'arrêter au dernier indice, len(t)-1" ; et pas de z signifie "avec un pas de 1"
Le pas peut très bien être négatif. Un exemple important est t[::-1] qui signifie "renverser le tableau".
En code, t[x:y:z] = f(t,x,y,z) où
def f(t,x=0,y="undef",z=1):
if y=="undef": y=len(t)
r = []
i = x
while i<y:
r.append(t[i])
i += z
return r
merci beaucoup pour toutes ces info ...
effectivement une bonne connaissance des opérations (binaires ici) permet d'optimiser efficacement l'écriture d'un algo sur des entiers
je comprends beaucoup mieux ton code ... mais juste une dernière question :
je comprends bien n % 6 (le modulo)
mais quand tu écris %d (dernière ligne print ... de ton code) ça signifie quoi ?
merci par avance
Je pensais (voir mon titre) qu'il était inutile de dire que le nombre cherché était non-premier lui-même.
Je comprends que vous avez bâti des algos pour généraliser ,mais en "détente" c'est la
réponse qui est de mise .
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :