Inscription / Connexion Nouveau Sujet
Niveau énigmes
Partager :

Je m'écarte des premiers

Posté par
dpi
07-03-20 à 08:49

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.

Posté par
lafol Moderateur
re : Je m'écarte des premiers 07-03-20 à 15:26

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" ?

Posté par
carpediem
re : Je m'écarte des premiers 07-03-20 à 16:47

salut

l'intervalle de plus grande amplitude je présume ...

on cherche donc p premier milieu de [m, n] avec n - m maximal ...

Posté par
carpediem
re : Je m'écarte des premiers 07-03-20 à 16:58

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


## avec l'instruction e > d on obtient le plus petit premier de distance maximale
## avec l'instruction e >= d on obtient le plus grand premier de distance maximale

dans le cas où il existe plusieurs premiers de distance maximale commune



et j'ai donc résolu le pb ...

Posté par
sanantonio312
re : Je m'écarte des premiers 07-03-20 à 18:15

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?

Posté par
carpediem
re : Je m'écarte des premiers 07-03-20 à 19:55

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 ...

Posté par
Ulmiere
re : Je m'écarte des premiers 07-03-20 à 21:03

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)



Sauf erreur de ma part, ça doit être facilement deux ou trois fois plus rapide

Posté par
dpi
re : Je m'écarte des premiers 07-03-20 à 21:05

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.

Posté par
carpediem
re : Je m'écarte des premiers 07-03-20 à 21:54

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

Posté par
dpi
re : Je m'écarte des premiers 08-03-20 à 08:18

Avez-vous trouvé un entier correspondant?

Posté par
carpediem
re : Je m'écarte des premiers 08-03-20 à 09:58

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 ...

Posté par
dpi
re : Je m'écarte des premiers 08-03-20 à 10:31

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

Posté par
carpediem
re : Je m'écarte des premiers 08-03-20 à 11:28

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

Posté par
Ulmiere
re : Je m'écarte des premiers 08-03-20 à 11:53

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




- il y a quelques astuces à connaître, par exemple
C'est la même chose de calculer a%(2**b) et a&(2**b-1).
Arrondir par excès au plus proche entier pair : a|1.
Par défaut : a&(not 1), où not 1 est la négation 1, c'est-à-dire 11111111111111111...10 en binaire.
t[-i] va chercher le (-i mod len(t))-ième élément.
t[~i] va chercher le (-i-1 mod len(t))-ième élément. Concrètement, t[~i] est t[::-1][i] alors que t[-i] = t[::-1][i-1]
Petit exercice : montrer que a est une puissance de deux (ie, n'a qu'un seul bit à 1 et tout le reste à 0 ET est différent de 1) se traduit par la non nullité de  (a!=1)&(a&a-1)  

Posté par
carpediem
re : Je m'écarte des premiers 08-03-20 à 12:25

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

Posté par
dpi
re : Je m'écarte des premiers 08-03-20 à 12:36

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 .

Posté par
carpediem
re : Je m'écarte des premiers 08-03-20 à 12:55

Ulmiere : pas besoin de me répondre !! j'ai trouvé sur le net ...

mais tu m'en apprends une bien bonne encore ...

vraiment très intéressant ...

je vais revoir mes "modestes" petits programmes de lycée ... et les améliorer avec cette fonction !!!



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !