Téléchargé 4 fois
Vote des utilisateurs
0
1
Détails
Licence : Non renseignée
Mise en ligne le 11 septembre 2023
Plate-forme :
Windows
Langue : Français
Référencé dans
Navigation
Résolution de la conjecture Collatz et problème de Syracuse
Résolution de la conjecture Collatz et problème de Syracuse
"""#python
Bonjour, c'est Bing. Je peux vous aider à trouver des informations sur les nombres pairs et impairs. 😊
Vous avez décrit une règle qui s'applique aux nombres entiers. Pour un nombre pair, on le divise par deux.
Pour un nombre impair, on le multiplie par trois et on ajoute un. Par exemple :
- Si le nombre est 4, il est pair, donc on le divise par deux : 4 / 2 = 2
- Si le nombre est 5, il est impair, donc on le multiplie par trois et on ajoute un : 5 x 3 + 1 = 16
Cette règle est connue sous le nom de **conjecture de Collatz** ou de **problème de Syracuse**.
C'est un problème mathématique qui n'a pas encore été résolu.
Il consiste à se demander si, en appliquant cette règle à n'importe quel nombre entier positif,
on finit toujours par obtenir 1.
Par exemple, si on part de 6, on obtient la suite suivante :
- 6 est pair, donc on le divise par deux : 6 / 2 = 3
- 3 est impair, donc on le multiplie par trois et on ajoute un : 3 x 3 + 1 = 10
- 10 est pair, donc on le divise par deux : 10 / 2 = 5
- 5 est impair, donc on le multiplie par trois et on ajoute un : 5 x 3 + 1 = 16
- 16 est pair, donc on le divise par deux : 16 / 2 = 8
- 8 est pair, donc on le divise par deux : 8 / 2 = 4
- 4 est pair, donc on le divise par deux : 4 / 2 = 2
- 2 est pair, donc on le divise par deux : 2 / 2 = **1**
On a obtenu **1** au bout de **8** étapes. On dit que le temps de vol de **6** est de **8**.
La conjecture de Collatz affirme que pour tout nombre entier positif,
il existe un temps de vol fini qui permet d'obtenir **1**.
Mais personne n'a réussi à le démontrer ni à le réfuter.
Trouvez-vous ce problème intéressant ?
Bonjour, c'est Bing. Je peux vous aider à trouver des informations sur les nombres pairs et impairs. 😊
Vous avez décrit une règle qui s'applique aux nombres entiers. Pour un nombre pair, on le divise par deux.
Pour un nombre impair, on le multiplie par trois et on ajoute un. Par exemple :
- Si le nombre est 4, il est pair, donc on le divise par deux : 4 / 2 = 2
- Si le nombre est 5, il est impair, donc on le multiplie par trois et on ajoute un : 5 x 3 + 1 = 16
Cette règle est connue sous le nom de **conjecture de Collatz** ou de **problème de Syracuse**.
C'est un problème mathématique qui n'a pas encore été résolu.
Il consiste à se demander si, en appliquant cette règle à n'importe quel nombre entier positif,
on finit toujours par obtenir 1.
Par exemple, si on part de 6, on obtient la suite suivante :
- 6 est pair, donc on le divise par deux : 6 / 2 = 3
- 3 est impair, donc on le multiplie par trois et on ajoute un : 3 x 3 + 1 = 10
- 10 est pair, donc on le divise par deux : 10 / 2 = 5
- 5 est impair, donc on le multiplie par trois et on ajoute un : 5 x 3 + 1 = 16
- 16 est pair, donc on le divise par deux : 16 / 2 = 8
- 8 est pair, donc on le divise par deux : 8 / 2 = 4
- 4 est pair, donc on le divise par deux : 4 / 2 = 2
- 2 est pair, donc on le divise par deux : 2 / 2 = **1**
On a obtenu **1** au bout de **8** étapes. On dit que le temps de vol de **6** est de **8**.
La conjecture de Collatz affirme que pour tout nombre entier positif,
il existe un temps de vol fini qui permet d'obtenir **1**.
Mais personne n'a réussi à le démontrer ni à le réfuter.
Trouvez-vous ce problème intéressant ?
Bonjour
+1 pour wiztricks
Je n'ai pas critiqué autre chose que l'utilisation du mot "résolution", et c'est votre persistance à l'utiliser qui est inappropriée.
Chez vous, vous pouvez inventer ce que vous voulez. Mais, pour prendre un exemple, si vous pensez que pour vous 2+2=5, le fait de le déclarer en public ne vous permettra pas d'échapper aux contradicteurs, et c'est très bien ainsi. Surtout dans un forum où ceux qui ont besoin d'aide sont censés ne trouver que des informations correctes.
+1 pour wiztricks
Je n'ai pas critiqué autre chose que l'utilisation du mot "résolution", et c'est votre persistance à l'utiliser qui est inappropriée.
Chez vous, vous pouvez inventer ce que vous voulez. Mais, pour prendre un exemple, si vous pensez que pour vous 2+2=5, le fait de le déclarer en public ne vous permettra pas d'échapper aux contradicteurs, et c'est très bien ainsi. Surtout dans un forum où ceux qui ont besoin d'aide sont censés ne trouver que des informations correctes.
Salut,
Si je comprends bien il faut donc démontrer que l'on arrive toujours a X tel que X * 3 + 1 = une puissance de 2.
Mais peu importe, ce qui m'intéressait ici c'était de voir si on pouvait constater une différence notable de temps d'exécution en utilisant des opérations dites "atomiques".
Et c'est le cas, et pas un peu, le gain est énorme.
Avec ce code:
long_func done at: 16.280122615004075 sec.
short_func done at: 8.104949430993292481 sec.
CQFD
Si je comprends bien il faut donc démontrer que l'on arrive toujours a X tel que X * 3 + 1 = une puissance de 2.
Mais peu importe, ce qui m'intéressait ici c'était de voir si on pouvait constater une différence notable de temps d'exécution en utilisant des opérations dites "atomiques".
Et c'est le cas, et pas un peu, le gain est énorme.
Avec ce code:
Code : | Sélectionner tout |
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 | import time def long_func(): start = time.perf_counter() for i in range(2, 1000001): while 1: if i == 1: break if i % 2: i = i * 3 + 1 else: i /= 2 end = time.perf_counter() print("long_func done at: %s sec." %(end-start)) def short_func(): start = time.perf_counter() for i in range(2, 1000001): while 1: if i == 1: break if i & 1: i = i * 3 + 1 else: i >>= 1 end = time.perf_counter() print("short_func done at: %s sec." %(end-start)) long_func() short_func() |
long_func done at: 16.280122615004075 sec.
short_func done at: 8.104949430993292481 sec.
Hum, ta fonction est inexacte (chatGPT ?)
Elle ne vérifie pas tous les nombres, en fait elle est même chaotique.
100001
300004
150002
75001
225004
112502
56251
168754
84377
253132
126566
63283
189850
94925
284776
142388
71194
35597
106792
.......
Elle ne vérifie pas tous les nombres, en fait elle est même chaotique.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | def slowh_func(): start = time.perf_counter() n = 100001 while n > 1: # n réduction. print(n) if not (n%6)%2: n //= 2 else: n = n*3+1 end = time.perf_counter() print("slowh_func done at: %s sec." %(end-start)) |
100001
300004
150002
75001
225004
112502
56251
168754
84377
253132
126566
63283
189850
94925
284776
142388
71194
35597
106792
.......
Bonjour
J'ai toujours beaucoup de mal à vous comprendre, mais au moins, vous ne reculez pas devant le boulot!
Avez-vous une question concernant mon code?
J'ai toujours beaucoup de mal à vous comprendre, mais au moins, vous ne reculez pas devant le boulot!
Avez-vous une question concernant mon code?
Bonjour
Le nombre de fois qu'un nombre pair quelconque peut être divisé par 2 est facile à calculer. Il s'agit en fait d'une partie d'un algorithme de décomposition en facteurs premiers par la méthode des divisions:
Par ailleurs, on peut remarquer qu'à chaque fois qu'on applique la règle destinée aux nombre impairs (x*3+1), on obtient un nombre pair.
Si on calcule à partir de nombres impairs croissants la valeur obtenue paire, et qu'on cherche le nombre de fois que cette valeur peut être divisée par 2, on trouve quelque chose intéressant:
Ce qui donne pour tous les nombres impairs de 1 à 99:
La valeur de la dernière colonne a l'air d'être aléatoire, mais elle ne l'est pas: il y a un cycle. Par exemple, les 2 se retrouvent tous les 4 nombres impairs. Idem pour tous les autres, avec une périodicité différente.
En poursuivant, peut-être pourrait-on trouver une formule qui permette de calculer la taille de la série sans en calculer les termes? Et, pourquoi pas, prouver ainsi mathématiquement la conjecture? Mais il y a eu tant de mathématiciens compétents qui n'ont pas réussi que je ne m'y attaquerai pas. C'était tout de même amusant à faire...
Le nombre de fois qu'un nombre pair quelconque peut être divisé par 2 est facile à calculer. Il s'agit en fait d'une partie d'un algorithme de décomposition en facteurs premiers par la méthode des divisions:
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | ############################################################################## def nb2(n): """Calcule le nombre de fois qu'on peut diviser n par 2 """ c = 0 # compteur while True: if n%2==0: c += 1 n //= 2 else: break return c |
Si on calcule à partir de nombres impairs croissants la valeur obtenue paire, et qu'on cherche le nombre de fois que cette valeur peut être divisée par 2, on trouve quelque chose intéressant:
Code : | Sélectionner tout |
1 2 3 | for i in range(1, 100, 2): j = i*3+1 print(i, j, nb2(j)) |
Code : | Sélectionner tout |
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 | 1 4 2 3 10 1 5 16 4 7 22 1 9 28 2 11 34 1 13 40 3 15 46 1 17 52 2 19 58 1 21 64 6 23 70 1 25 76 2 27 82 1 29 88 3 31 94 1 33 100 2 35 106 1 37 112 4 39 118 1 41 124 2 43 130 1 45 136 3 47 142 1 49 148 2 51 154 1 53 160 5 55 166 1 57 172 2 59 178 1 61 184 3 63 190 1 65 196 2 67 202 1 69 208 4 71 214 1 73 220 2 75 226 1 77 232 3 79 238 1 81 244 2 83 250 1 85 256 8 87 262 1 89 268 2 91 274 1 93 280 3 95 286 1 97 292 2 99 298 1 |
En poursuivant, peut-être pourrait-on trouver une formule qui permette de calculer la taille de la série sans en calculer les termes? Et, pourquoi pas, prouver ainsi mathématiquement la conjecture? Mais il y a eu tant de mathématiciens compétents qui n'ont pas réussi que je ne m'y attaquerai pas. C'était tout de même amusant à faire...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.