IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 ?
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 22/05/2023 à 7:45
Bonjour

Citation Envoyé par toumic2.0 Voir le message
Moi je parle de résolution
Ce problème n'a jamais été résolu mathématiquement et c'est pour ça qu'on l'appelle "conjecture".
Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 22/05/2023 à 14:54
Citation Envoyé par toumic2.0  Voir le message
Moi je parle de résolution.[/COLOR]

Votre approche est mentionnée dans l comme approche probabiliste.
Mais une approche probabiliste (çà marche dans N % des cas) n'exclut pas l'existence d'entiers pour lesquels ça ne marche pas i.e. ce n'est pas une démonstration/résolution.

- W
Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 23/05/2023 à 6:46
Citation Envoyé par toumic2.0 Voir le message
Mon approche est bien détaillée et en aucun cas ne peut être contredite.
Vous ne comprenez pas le sens de ce qu'on vous dit.
Maintenant faire valider votre truc par l'académie des sciences ou faire ajouter dans l'article de wikipédia que toumic a démontré cela en Mai 2023 voilà ce qui pourrait "contredire".

- W
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 23/05/2023 à 7:35
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.
Avatar de VinsS
Expert éminent https://www.developpez.com
Le 23/05/2023 à 10:40
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:
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.
CQFD
Avatar de VinsS
Expert éminent https://www.developpez.com
Le 23/05/2023 à 13:44
Hum, ta fonction est inexacte (chatGPT ?)

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
.......
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 05/06/2023 à 15:24
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?
Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 09/06/2023 à 13:06
Citation Envoyé par toumic2.0 Voir le message
Pour donner suite au programme précédent, j'ai enfin réalisé le code qui permet de connaitre le nombre de fois qu'un nombre pair peut être divisé par deux tout en restant de type pair.
Soit votre code ne fait pas ce que vous dites soit il fait tellement d'autres choses qu'on a des difficultés à y retrouver cela.
note: croyez vous que votre long monologue ait quelque intérêt?

- W
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 10/06/2023 à 17:34
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:

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

Code : Sélectionner tout
1
2
3
for i in range(1, 100, 2):
    j = i*3+1
    print(i, j, nb2(j))
Ce qui donne pour tous les nombres impairs de 1 à 99:

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
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...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.