Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 23-03-2026 18:29:04
- Ernst
- Membre
- Inscription : 30-01-2024
- Messages : 352
nombre de nombres premiers
Amis des défis amusants, bonjour.
Tiens, rigolo, pour un nombre de chiffres donnés, il s'agit de trouver un nombre qui contient le plus de 'sous-nombres' premiers - des nombres formés de chiffres consécutifs.
Hors ligne
#2 24-03-2026 16:53:01
- Glozi
- Invité
Re : nombre de nombres premiers
Bonjour,
Merci pour l'amusement,
Avec un code naïf j'arrive à aller jusqu'à 8 chiffres en base 10 (et ça prend plusieurs minutes dont une bonne partie pour faire un crible et trouver les nombres premiers).
Bonne journée
#3 25-03-2026 01:29:55
- Ernst
- Membre
- Inscription : 30-01-2024
- Messages : 352
Re : nombre de nombres premiers
Mais pour 8 chiffres on trouve par exemple 20037337 avec 3 chiffres pairs (dont deux zéros qui ne sont pas premiers...).
Bonsoir,
Ah oui, très bien ! J’ai été surpris de ces zéros à partir de huit chiffres, et je me suis rendu compte que j’ai oublié de préciser qu’il ne fallait pas les utiliser, sinon on obtient une sorte de ‘séparateur’ qui va valider un 37, un 037, un 0037 alors qu’on se les interdit en début de nombre parce qu’ils n’ont plus la bonne longueur.
Donc reformulation, désolé, pour un entier de longueur L composé de chiffres différents de zéro, on génère tous les nombres possibles formés à partir de ses chiffres consécutifs et on compte combien de ces sous‑nombres sont premiers.
Exemple pour 1373 :
1 chiffre → 1, 3, 7, 3
2 chiffres → 13, 37, 73
3 chiffres → 137, 373
4 chiffres → 1373
À part le 1, tous sont premiers, le score de 1373 est donc de 9.
Je suis en train de développer un code plus performant basé sur deux-trois idées :
- pré-calcul d'une table de nombres premiers (2, 3, puis les premiers parmi les multiples de 6±1, perte d'un peu de temps au début, mais plus rapide ensuite sur des milliers d'évaluations)
- construction des nombres dans un certain ordre ( 3, 7, 1, 9, 2, 6, 5, 4, 8) parce que je pense que ce sont les chiffres les plus prometteurs au début pour obtenir rapidement des records
- élagage en fonction des records déjà obtenus, c'est-à-dire que quand on construit un nombre, si le score partiel n'est pas assez élevé pour que le record soit accessible même si tout le reste est premier, autant arrêter cette construction et passer à la suivante
Avec ces ruses la longueur 9 devrait passer, la 10 peut-être aussi, après cela va quand même se gâter...
Hors ligne
#4 25-03-2026 11:01:14
- Rossignol
- Membre

- Inscription : 19-06-2015
- Messages : 308
Re : nombre de nombres premiers
Ce problème distrayant a piqué par curiosité.
Le module sympy a une fonction isprime bien commode.
Pour afficher les sous-nombres, j'ai donc programmé ça :
# coding: utf-8
from sympy import isprime
def test(nombre):
strnombre = str(nombre)
n = len(strnombre)
for i in range(1, n+1):
for j in range(0, n+1-i):
sous_nombre = int(strnombre[j:j+i])
print(sous_nombre, 'OUI' if isprime(sous_nombre) else 'NON')
test(12345)
Il est facile de montrer que les seuls nombres dont tous les sous-nombres sont premiers sont 2, 3, 5, 7, 23, 37, 53, 73, 373.
@+
Hors ligne
#6 15-04-2026 12:05:19
- Ernst
- Membre
- Inscription : 30-01-2024
- Messages : 352
Re : nombre de nombres premiers
Bonjour,
Je reviens là-dessus, parce qu’en abandonnant l’exhaustif et en implémentant deux heuristiques on arrive à aller plus loin.
1) on supprime le 8 des chiffres à utiliser : gain 12,5 %
2) un élagage agressif : l'idée est d'abandonner une branche quand le score partiel ne permet plus d'atteindre le record même si tous les nombres restants étaient premiers.
On peut même faire un peu mieux en observant que quand L augmente, les records progressent de 5 ou 6 unités, jamais plus. En fixant le score max du niveau L comme étant le score du niveau (L-1) + 7, le programme peut valider des branches sans chercher davantage de score supérieur.
L = 9, [30], 0.7 s, (113733797, 233133733, 373373977, 733133733)
L = 10, [35], 1.7 s, (2113733797, 3733133733, 7331337337)
L = 11, [40], 4.4 s, (17331337337, 37331337337, 37337937337, 52379337397, 73312373373)
L = 12, [45], 10.4 s, (337331237337, 361373371973, 373312373373, 373313373379, 373363733797, 379719337397, 523793373973, 733123733739)
L = 13, [51], 16.3 s, (1117331337337, 3373312373373)
L = 14, [56], 42.1 s, (11173313373373, 31379719337397, 33733123733739)
Bon, cela dépend bien sûr de la machine, mais c'est quand même un progrès substantiel et le programme n'est pas si gros que cela. À suivre...
Hors ligne
Pages : 1







