Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#26 08-06-2020 20:05:15

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Hello,

toujours en phase d'apprentissage, j'ai bien entendu codé un grand classique : la conjecture de Syracuse. A cette occasion, j'utilise les dictionnaires, c'est sympa pour faire des suivis précis.


# syracuse
table=[]
outdoor={"flag 1":0,"flag 2":0}
vol_alt_max = {"départ": 3, "durée": 0,"altitude": 0, "volalt": 0}  # durée de vol maximale en altitude
alt_max = {"départ": 3, "durée": 0,"altitude": 0, "volalt": 0} # altitude maximale
vol_max = {"départ": 3, "durée": 0,"altitude": 0, "volalt": 0} # durée de vol maximale
for start in range (3001,100001,2):
    vol_alt=vol=0
    alt=nombre=start
    if nombre in table:
        outdoor["flag 1"] +=1
        #nombre = 2
    while nombre > 2:
        table.append(nombre)
        vol +=1
        if nombre % 2== 0:
            nombre = int(nombre/2)
        else:
            nombre = int((3*nombre+1))
       
        alt=max(alt,nombre)
        if nombre >= start:
            vol_alt=vol
        if nombre in table:
            outdoor["flag 2"] +=1
            #nombre = 2

    table=list(set(table))
    table.sort()  
    if vol > vol_max["durée"]:
        vol_max["départ"]=start
        vol_max["durée"]=vol
        vol_max["altitude"]=alt
        vol_max["volalt"]=vol_alt
    if alt > alt_max["altitude"]:
        alt_max["départ"]=start
        alt_max["durée"]=vol
        alt_max["altitude"]=alt
        alt_max["volalt"]=vol_alt
    if vol_alt > vol_alt_max["volalt"]:
        vol_alt_max["départ"]=start
        vol_alt_max["durée"]=vol
        vol_alt_max["altitude"]=alt
        vol_alt_max["volalt"]=vol_alt

print(vol_max)
print(alt_max)
print(vol_alt_max)
print(outdoor)
 

{'départ': 77 031, 'durée': 349, 'altitude': 21 933 016, 'volalt': 219}
{'départ': 77 671, 'durée': 230, 'altitude': 1 570 824 736, 'volalt': 173}
{'départ': 94 959, 'durée': 300, 'altitude': 720 170 836, 'volalt': 266}
{'flag 1': 22 531, 'flag 2': 5 289 796}

j'ai mesuré combien de fois la suite rencontre un terme déjà rencontré, c'est assez impressionnant. Bien entendu, j'ai testé avec les deux ruptures qui j'ai insérés en commentaire, les calculs ne servent à rien, sans surprise.

En revanche, je bute sur la manière de coder intelligemment le calcul à rebours, c'est à dire je pars de 1 puis j'obtiens 2 puis 4 puis 8 puis 16  qui se dédouble en 5 ou 32.
Après 32 vient 64 qui se dédouble en 21 ou 128 ...
Après 5, on a 10 qui se dédouble en 3 ou 20 …
3 ne se dédoublera plus jamais, mais 20 devient 40 qui se dédouble en 13 ou 80 ...

je cherche à constituer une liste unique de résultat (en limitant le nombre de termes, sinon, c'est un processus qui n'a pas de fin) ; je cherche comment construire le truc qui respecte la dynamique de la construction, à savoir que si j'ai un nombre p je fabrique les 2p successifs et si ce nombre est congru à 1 modulo 3, il se dédouble. Ce qui est amusant à observer est que si un nombre est congru à 2 (3), on sait que l'entier suivant se dédoublera ; s'il est congru à 0 (3) en revanche, il ne se dédoublera plus jamais.
Le problème est d'éviter les répétitions.
L'idée générale est de se dire que normalement, ce processus inversé permet de fabriquer $N$ si la conjecture est avérée.
Je pense qu'il faut que je regarde du côté des fonctions maintenant !

Dernière modification par freddy (09-06-2020 11:03:35)

Hors ligne

#27 10-06-2020 08:07:08

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

Bonjour
@Freddy
c'est assez lourd de programmer la conjecture à l'envers et de la remonter...
par contre comme tu sais que si un entier i impair de départ, lors de son itération rencontre un nombre i qui a déjà été testé c'est à dire inférieur à la valeur de départ cela indique que ton i vérifie la conjecture et le programme repart sur i +=2 .

Ou encore en programmant  l'AS2.(Algorithme de Syracuse 2)
le principe est plus simple on part de 2i
exemple ("Travaille dû à Jules Rennucci")
Nous allons donner une représentation simplifiée, réduite, de cette suite de la manière suivante :
Soit le nombre pair N = 2i (avec i impair)  ex : N= 2*27 = 54
A tout N=2i, pair et non multiple de 4, nous appliquons la transformation : (3*N+2)/2
Si N est multiple de 4 nous passons à N/2qui devient une tête de séquence exemple ligne 1 : avec 124 = 4x donc divisé par 2 donne 62 tête de séquence et on réitère .
lorsque la tête de séquence passe sous la valeur de départ 2i , la conjecture est vérifiée.

Nous désigneront cet algorithme  par  AS2, AS1 étant l’algorithme classique et bien connu de Syracuse.

 Tableau 1 obtenu pour N =2*27 :  
 
 n:     N=2i                   
1 : 54  82  124              
2 : 62  94  142 214 322 484        
3 : 242 364                  
4 : 182 274 412              
5 : 206 310 466 700              
6 : 350 526 790 1186  1780           
7 : 890 1336                 
8 : 668                  
9 : 334 502 754 1132             
10  566 850 1276               
11  638 958 1438  2158  3238  4858  7288       
12  3644                   
13  1822  2734  4102  6154  9232           
14  4616                   
15  2308                   
16  1154  1732                 
17  866 1300                 
18  650 976                
19  488                  
20  244                  
21  122 184                
22  92                   
23  46  70  106 160            
24  80                   
25  40                   
26  20                   
27  10  16                 
28  8                  
29  4                  
30  2  4                 
 

On obtient ainsi, par séquences successives, et dans leur ordre d’apparition, tous les pairs de la suite de Syracuse relative au nombre 27.
Ceci est généralisable à tout nombre  2i (i impair)
Pour 54=2*27, AS2 donne 30 séquences, chaque séquence étant une suite dont le premier terme est moitié du dernier terme de la séquence précédente et dont les termes sont ceux d’une suite de pairs déduits du premier terme par la transformation (3*x+2)/2  et X/2 lorsque X est multiple de 4
Première colonne : Rang de chacune des suites.   
De la deuxième à la 8ème colonne : Pairs de la suite générale par la transformation (3*x+2)/2


Nous obtenons tous les pairs successifs et uniquement les pairs du développement (à l’exception de 54)   du nombre 27 par l’algorithme classique  AS1 appliqué au nombre 27.
Cette procédure est applicable à tout impair (i) et limite la suite de Syracuse à la suite de ses pairs successifs. La suite des pairs pour le nombre 27 comprend 71 termes
Les séquences sont croissantes, finies. Elles se terminent par un multiple de 4 qui est double du premier terme de la tête de séquence n suivante.
 
Il est à  remarquer que les impairs de la suite primitive, bien que masqués, peuvent être dénombrés. En effet chacune des séquences n masque un nombre d’impairs diminué d’une unité par rapport au nombre de pairs.
Ainsi la séquence n = 11, par exemple, compte 7  pairs et masque 6 impairs. Ce qui conduit à proposer la formule :
Nombre de séquences = Nombre de pairs – nombre d’Impairs +1  (S = P-I+1)
….etc

On montre simplement les affirmations suivantes :

Si une boucle doit se produire elle ne peut le faire que sur un terme de la première colonne N des têtes de séquences 2i.
Le premier nombre pair inférieur au premier terme de la suite (54 dans le cas de 27) est nécessairement situé dans la première colonne N=2i (46 dans l’exemple cité)

C’est donc cette colonne qui fera l’objet d’une attention particulière.

Est ce plus facile de programmer à l'envers avec l'AS 2 ....?

Est - ce que tous les nombres pairs 2i seront vérifiés ?

Si il existe un nombre pair N=2i tel que :  aucun nombre pair de ses séquences, n'appartient aux séquences itérées de tous les nombres N=2i - 2 testés, alors Syracuse est vraie...! Ce qui est vraie pour l'instant ....

Bon courage ...

Dernière modification par LEG (10-06-2020 08:22:59)

Hors ligne

#28 10-06-2020 12:02:33

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Salut LEG et merci !

Je n'ai pas tout bien compris ce qui est fait, je rappelle que Syracuse est la conjecture dite de "3x+1", pas "3x+2" …
Ensuite, je n'ai pas envie (comprendre :je n'ai pas les capacités) de démontrer cette conjecture, j'essaie tout simplement en travaillant sur une question simple, de continuer à apprendre le langage Python que je découvre et regrette de ne pas l'avoir rencontré plus tôt. La vie est toujours trop courte !

Hors ligne

#29 10-06-2020 12:32:09

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

re @freddy
N= 2i avec i un entier non nul impair >1
3N+2  ou (3x+1)/2 revient au même si ce n'est que tu exites les impairs lors des itérations.

i = 27 ; 3*27+1 = 82
3N+2 = 164 , qui n'est pas multiple de 4 on continu 164/2= 82 ; (3*82)+2 =124 multiple de 4 fin de séquence donc 124/2 = tête de séquence donc
62...> etc on réitère 94 ,  142 , 214 , 322 , 484 multiple de 4  donc tête de séquence
242
etc

bien entendu que le but est ta programmation et non de démonter Syracuse , là tu ne programmes en utilisant que les nombres pairs, par exemple tu peux ne garder que les têtes de séquences, et lorsque la valeur d'une tête de séquence passe sous la valeur N=2i de départ le programme arrête ...

tu peux donc vérifier le nombre de séquences pour chaque entier i, soit  N = 2i
exemple:
i = 27 , a 30 séquence avant de redescendre sur 2 , et il repasse sous sa valeur de départ à la 23ème séquence  n = 23 :  46  70  106 160  donc le programme doit s'arrêter à la séquence n= 23 etc etc

tu cherchais comment remonter en partant de 2.... Alors, peut être est-ce plus simple avec cette algorithme de Syracuse 2....
@+

Hors ligne

#30 10-06-2020 12:51:02

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Euh, non si tu regardes bien, je démarre qu’avec des nombres impairs dans ma boucle ...
Après, je vois bien ton truc, il faut que je réfléchisse un peu plus.

Hors ligne

#31 10-06-2020 19:47:05

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Re,

Ton truc est bizarre car $3N+2=2(3i+1)$ ... pas encore compris l’intérêt mais bon, ce n’est pas mon projet

Dernière modification par freddy (10-06-2020 19:47:32)

Hors ligne

#32 10-06-2020 23:01:42

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Hello,

je suis content, je viens de trouver le truc.


# procédure syracuse à l'envers
table = [1,2,4,8,16]
table_1 = []
nombre_1 = nombre = 0
cpt = 4
while cpt <= 300:
    nombre = table[cpt]
    if  nombre % 3 == 1:
        nombre_1 = int((nombre-1)/3)
        table_1.append(nombre_1)
        if nombre_1 not in table:
            table.append(nombre_1)                  
    nombre = int(2 * nombre)
    if nombre not in table:
        table.append(nombre)

    cpt += 1
   
print(table_1)
table.sort()    
print(table)
 

Ce qui est amusant est, avec ce code ultra simple, d'observer un risque de répétition et d'apparition de 0, il faut le gérer.

Dernière modification par freddy (11-06-2020 14:27:21)

Hors ligne

#33 12-06-2020 07:26:53

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

freddy a écrit :

Re,

Ton truc est bizarre car $3N+2=2(3i+1)$ ... pas encore compris l’intérêt mais bon, ce n’est pas mon projet

A l'époque, cela  a permis à J .R , de démontrer la structure arithmétique de Syracuse ; ("qui en fait est une structure très simple qui comprend des suites arithmétiques et géométriques...."). Notamment en montrant que si une deuxième boucle ('" autre que la boucle 4.2.1") existait, elle ne pourrait avoir lieu uniquement, sur la première colonne des têtes de séquence ; une séquence se termine toujours sur un multiple de 4...etc etc. Ce n'est pas ce qui t'importe....

Hors ligne

#34 12-06-2020 08:39:10

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

LEG a écrit :
freddy a écrit :

Re,

Ton truc est bizarre car $3N+2=2(3i+1)$ ... pas encore compris l’intérêt mais bon, ce n’est pas mon projet

A l'époque, cela  a permis à J .R , de démontrer la structure arithmétique de Syracuse ; ("qui en fait est une structure très simple qui comprend des suites arithmétiques et géométriques...."). Notamment en montrant que si une deuxième boucle ('" autre que la boucle 4.2.1") existait, elle ne pourrait avoir lieu uniquement, sur la première colonne des têtes de séquence ; une séquence se termine toujours sur un multiple de 4...etc etc. Ce n'est pas ce qui t'importe....

Salut,

ah, je vois un tout petit peu mieux, tu aurais pu commencer par ça, non ?
Ce qui m'importait était de trouver le tout petit pgm qui génère la suite à l'envers, je suis en apprentissage pour l'instant, je ne fais pas encore des maths.

Hors ligne

#35 12-06-2020 08:59:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

Bonjour,

J'ai passé un bon bout de temps à essayer de comprendre ce que tu appelais Syracuse à l'envers.
Bon, j'ai étudié rapidement ton programme...
Je te propose deux tout petits allègements :
* nombre_1 = int((nombre-1)/3) -->  nombre_1 = (nombre-1)//3
   // c'est le quotient entier.
   N-B : Ici (nombre-1)/3 comme de toute façon nombre_1-1 était un  multiple de 3 pourrait aussi fonctionner...
           Sauf que : (exemple)  (7-1)/3 = 2.0   et (7-1)//3 =2 --> 2.0 est un nombre en "virgule flottante" et 2 un entier

           >>> type((7-1)/3)
           <class 'float'>
           >>> type((7-1)//3)
           <class 'int'>
           >>>

* De même :
   nombre = int(2 * nombre) ---> nombre = 2 * nombre

J'ai vérifié avant d'écrire...

J'ai fait un constat bizarre mais peut-être n'ai-je pas compris ce qu'étaient table_1 et table :
Des nombres n'apparaissent pas :
25, par exemple ou 51, 57...

@+

Hors ligne

#36 12-06-2020 09:36:02

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

Salut,

l'idée développée par certains est de voir si, en appliquant le processus dans l'autre sens, on retrouve $N$.

Donc on part de 1, on multiplie par 2 puis encore par 2 puis, si le nombre trouvé est congru à 1 modulo 3, on fabrique (p-1)/3, sinon, on fait encore "x2".
En effet, quand, à un stade donné, on a un nombre $p$, il peut provenir soit de $n/2$, soit (non exclusif) de $3n+1$, et donc, je cherche ce nombre $n$. On a donc soit $n=2p$, soit $n=(p-1)/3$.

Sur la page wiki, je n'ai pas encore compris pourquoi le mode de calcul "à l'envers" est légèrement différent, basé sur une congruence modulo 6, je cherche …

(PS : sur la preuve de la conjecture, l'idée est que, globalement, la procédure de calcul est contractante, mais nul n'a encore trouvé, elle est résistante, la bougresse :-).)

L'idée est de prouver la conjecture d'une autre manière. Je ne sais pas s'ils y sont parvenus, moi, je voulais trouver le code le plus simple du truc.

Je mets int(p) car j'ai horreur de voir des nombres décimaux quand ils sont entiers, question de confort perso. Mais j'ai compris, je passerai par // désormais, merci !

table récupère tous les résultats, table_1 me permet de voir le résultat de la division par 3, par simple désir de contrôle.

Bien sûr qu'il en manque. Si tu bornes le calcul à 50 étapes par exemple, tu ne verras pas apparaître le 7, ni le 4 je crois. Ce qui est marrant est de constater que plus tu élargis la borne, plus tu combles les trous initiaux.

Pour finir, je cherchais qqchose de simple qui gère en boucle les deux étapes : p = 2p et p= (p-1)/3

Dernière modification par freddy (12-06-2020 10:44:17)

Hors ligne

#37 12-06-2020 10:59:50

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

Re
cela a été essayé de remonter à l'envers en partant de 8 ou 16 , mais n'a jamais rien donné car il y a de multiples branches qui se rattachent à l'arbre primitif
avec 4 cas possibles

1) $3k+1 = 2^n$
2) les multiples de 20 :$3k+1 = 20m$
3) la branche $3k+1 = S.13$ ....> exemple et tel que (13*3)+1 = 40 ;20 ;10 ;5 puis 4.2.1
4) la branche $3k+1 = S.23$  ....> tel que (23*3) +1 = 35,53,160..20,10 ;5 puis 4.2.1

toutes les vols finissent ou se raccordent sur une de ces 4 branches finales  ....
tous les vols intermédiaires prendront des valeurs qui ont déjà été testé et par conséquent  finiront sur un de ses 4 cas...
"
pour le modulo 6; "si je me rappel" tous les nombres pairs modulo 6 dans une suite de Syracuse sont égal à 4 ou à 2.

Dernière modification par LEG (12-06-2020 11:11:16)

Hors ligne

#38 12-06-2020 11:09:18

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

Re,

Mon code Syracuse (normal) qui date un peu :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Simulation de la suite de Syracuse "classique"

for n in [703,871, 17467,77671,87679]:
    maxi,duree = n,1
    print("Vol de",n, ":")
    while True:
        n=n//2 if n%2==0 else 3*n+1
        duree, maxi=duree+1,max(n,maxi)[quote][/quote]
        print (n,end=" ")
        if n==1:
            break
    print()
    print ("Altitude maxi :",maxi, "Durée de vol :",duree,"\n\n")

Sorties :

Vol de 703 :
2110 1055 3166 1583 4750 2375 7126 3563 10690 5345 16036 8018 4009 12028 6014 3007 9022 4511 13534 6767 20302 10151 30454 15227 45682 22841 68524 34262 17131 51394 25697 77092 38546 19273 57820 28910 14455 43366 21683 65050 32525 97576 48788 24394 12197 36592 18296 9148 4574 2287 6862 3431 10294 5147 15442 7721 23164 11582 5791 17374 8687 26062 13031 39094 19547 58642 29321 87964 43982 21991 65974 32987 98962 49481 148444 74222 37111 111334 55667 167002 83501 250504 125252 62626 31313 93940 46970 23485 70456 35228 17614 8807 26422 13211 39634 19817 59452 29726 14863 44590 22295 66886 33443 100330 50165 150496 75248 37624 18812 9406 4703 14110 7055 21166 10583 31750 15875 47626 23813 71440 35720 17860 8930 4465 13396 6698 3349 10048 5024 2512 1256 628 314 157 472 236 118 59 178 89 268 134 67 202 101 304 152 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 250504 Durée de vol : 171


Vol de 871 :
2614 1307 3922 1961 5884 2942 1471 4414 2207 6622 3311 9934 4967 14902 7451 22354 11177 33532 16766 8383 25150 12575 37726 18863 56590 28295 84886 42443 127330 63665 190996 95498 47749 143248 71624 35812 17906 8953 26860 13430 6715 20146 10073 30220 15110 7555 22666 11333 34000 17000 8500 4250 2125 6376 3188 1594 797 2392 1196 598 299 898 449 1348 674 337 1012 506 253 760 380 190 95 286 143 430 215 646 323 970 485 1456 728 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
Altitude maxi : 190996 Durée de vol : 179


Vol de 17467 :
52402 26201 78604 39302 19651 58954 29477 88432 44216 22108 11054 5527 16582 8291 24874 12437 37312 18656 9328 4664 2332 1166 583 1750 875 2626 1313 3940 1970 985 2956 1478 739 2218 1109 3328 1664 832 416 208 104 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 88432 Durée de vol : 54


Vol de 77671 :
233014 116507 349522 174761 524284 262142 131071 393214 196607 589822 294911 884734 442367 1327102 663551 1990654 995327 2985982 1492991 4478974 2239487 6718462 3359231 10077694 5038847 15116542 7558271 22674814 11337407 34012222 17006111 51018334 25509167 76527502 38263751 114791254 57395627 172186882 86093441 258280324 129140162 64570081 193710244 96855122 48427561 145282684 72641342 36320671 108962014 54481007 163443022 81721511 245164534 122582267 367746802 183873401 551620204 275810102 137905051 413715154 206857577 620572732 310286366 155143183 465429550 232714775 698144326 349072163 1047216490 523608245 1570824736 785412368 392706184 196353092 98176546 49088273 147264820 73632410 36816205 110448616 55224308 27612154 13806077 41418232 20709116 10354558 5177279 15531838 7765919 23297758 11648879 34946638 17473319 52419958 26209979 78629938 39314969 117944908 58972454 29486227 88458682 44229341 132688024 66344012 33172006 16586003 49758010 24879005 74637016 37318508 18659254 9329627 27988882 13994441 41983324 20991662 10495831 31487494 15743747 47231242 23615621 70846864 35423432 17711716 8855858 4427929 13283788 6641894 3320947 9962842 4981421 14944264 7472132 3736066 1868033 5604100 2802050 1401025 4203076 2101538 1050769 3152308 1576154 788077 2364232 1182116 591058 295529 886588 443294 221647 664942 332471 997414 498707 1496122 748061 2244184 1122092 561046 280523 841570 420785 1262356 631178 315589 946768 473384 236692 118346 59173 177520 88760 44380 22190 11095 33286 16643 49930 24965 74896 37448 18724 9362 4681 14044 7022 3511 10534 5267 15802 7901 23704 11852 5926 2963 8890 4445 13336 6668 3334 1667 5002 2501 7504 3752 1876 938 469 1408 704 352 176 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 1570824736 Durée de vol : 232


Vol de 87679 :
263038 131519 394558 197279 591838 295919 887758 443879 1331638 665819 1997458 998729 2996188 1498094 749047 2247142 1123571 3370714 1685357 5056072 2528036 1264018 632009 1896028 948014 474007 1422022 711011 2133034 1066517 3199552 1599776 799888 399944 199972 99986 49993 149980 74990 37495 112486 56243 168730 84365 253096 126548 63274 31637 94912 47456 23728 11864 5932 2966 1483 4450 2225 6676 3338 1669 5008 2504 1252 626 313 940 470 235 706 353 1060 530 265 796 398 199 598 299 898 449 1348 674 337 1012 506 253 760 380 190 95 286 143 430 215 646 323 970 485 1456 728 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
Altitude maxi : 5056072 Durée de vol : 196

@+

Hors ligne

#39 12-06-2020 11:14:17

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

ils se terminent sur la branche de l'arbre primitif : S.13 ou S.23
@ Yoshi
Est-ce que tu peux calculer uniquement la durée du vol, lorsqu'au rang N , la valeur passe sous la valeur de départ  par conséquent stop .... car cela indique que la conjecture a été vérifiée

Dernière modification par LEG (12-06-2020 11:22:59)

Hors ligne

#40 12-06-2020 11:17:33

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

RE,

@LEG

tous les nombres pairs modulo 6

C'est quoi un nombre qui est : pair modulo 6 ?

@+

Hors ligne

#41 12-06-2020 11:25:13

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

c'était pour répondre à freddy , tous les nombres pairs dans un vol de Syracuse sont congrus à 2 ou 4 modulo 6.

Hors ligne

#42 12-06-2020 11:45:58

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

LEG a écrit :

c'était pour répondre à freddy , tous les nombres pairs dans un vol de Syracuse sont congrus à 2 ou 4 modulo 6.

Je n'ai pas regardé vraiment, mais ce résultat est prouvé ?
Je sais que yoshi va regarder, moi aussi car si c'est vrai, c'est une information intéressante.

PS : je tente, soit $2p+1$ qui devient $6p+4$ qui devient $3p+2$. Si $p$ est de la forme $2q$, il est pair et on a ensuite $3q+1$, impair.
Ce nombre devient $9q+4$ qui est pair si $q$ l'est. On dirait que ça s'enchaine bien, faudrait le prouver plus rigoureusement, je vais trop vite, là …

Dernière modification par freddy (12-06-2020 12:01:39)

Hors ligne

#43 12-06-2020 12:45:39

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

@LEG

Tu réponds à côté, je repose ma question :

C'est quoi un nombre qui est : pair modulo 6 ?

Personnellement, je ne connais ni la définition de la notion, ni la notion : je ne l'ai jamais rencontrée...

@+

Hors ligne

#44 12-06-2020 13:07:06

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

Re,

Un nombre pair dans un vol de Syracuse est congru à 2 ou 4 modulo 6.
Ceci n'est vrai que dans un vol de Syracuse ?
Bin, ça me surprendrait...
Soit un nombre pair.
Il s'écrit 2n.
A quelle(s) condition() existe-t-il $n,\;k \in \mathbb N$ tel que
$2n=6k+2$ ?
$2n=6k+4$ ?
* $2n=6k+2\Leftrightarrow n=3k+1$
* $2n=6k+4\Leftrightarrow n=3k+2$
Normal, 6k+1, 6k+3, 6k+5 sont impairs quel que soit k...
Et on peut résumer à [tex]2n=6k\pm 2[/tex] soit $n=3k\pm 1$

Donc, c'est toujours vrai, un nombre pair>=2 peut toujours s'écrire sous la forme $2(3k\pm 1)$

@+

Hors ligne

#45 12-06-2020 13:13:20

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Comment "aller vers" en Python

yoshi a écrit :

Re,

Un nombre pair dans un vol de Syracuse est congru à 2 ou 4 modulo 6.
Ceci n'est vrai que dans un vol de Syracuse ?
Bin, ça me surprendrait...
Soit un nombre pair.
Il s'écrit 2n.
A quelle(s) condition() existe-t-il $n,\;k \in \mathbb N$ tel que
$2n=6k+2$ ?
$2n=6k+4$ ?
* $2n=6k+2\Leftrightarrow n=3k+1$
* $2n=6k+4\Leftrightarrow n=3k+2$
Normal, 6k+1, 6k+3, 6k+5 sont impairs quel que soit k...
Et on peut résumer à [tex]2n=6k\pm 2[/tex] soit $n=3k\pm 1$

Donc, c'est toujours vrai, un nombre pair>=2 peut toujours s'écrire sous la forme $2(3k\pm 1)$

@+

+ 1
Bravo et merci !

Hors ligne

#46 12-06-2020 13:20:47

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

@yoshi : c'est nouveau, ça vient de sortir.....j'ai abrégé dans ma tête (en supprimant qui à pour reste 2 ou 4) .
Mais je n'arrive toujours pas à modifier ton programme pour que la durée soit <= à n a de départ , au lieu de 1 , donc break .

je n'ai pas réussi ..car ensuite le programme n'arrête plus de calculer 2,1...etc

@freddy : je pense que cela a été prouvé assez facilement...

Dernière modification par LEG (12-06-2020 13:27:40)

Hors ligne

#47 12-06-2020 13:35:15

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

B'jour

de quoi s'instruire : http://cristal.univ-lille.fr/~jdelahay/pls/053.pdf
Extrait :

<< (..)Tout cela a conduit à une nouvelle conjecture formulée par Richard Crandal (une sorte de conjecture anti-Syracuse) qui affirme : pour qx+1 (à la place de 3x+ 1), avec q impair et supérieur à 3, il y a toujours au moins un vol qui n’atterrit pas en 1. Bien sûr, cette conjecture reste à démontrer !
Les considérations ci-dessus sur les cycles montrent que la conjecture de Crandal est vraie pour q égal à 5, 181 et 1093. En 1995, Z. Franco et C. Pomerance ont montré que les entiers q pour lesquels la conjecture de Crandal était vraie devenaient de plus en plus fréquents quand  q tend vers l’infini, autrement dit que la conjecture était «presque vraie» (comme il est «presque vrai» que tout vol pour 3x+ 1 passe sous son point de départ) >>

@+

[EDIT]

LEG a écrit :

Mais je n'arrive toujours pas à modifier ton programme pour que la durée soit <= à n a de départ , au lieu de 1 , donc break .

Désolé, pas clair !
Donc, je ne peux pas modifier...

Dernière modification par yoshi (12-06-2020 13:38:14)

Hors ligne

#48 12-06-2020 14:29:11

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

c'est bon...@yoshi.
il faut juste que je change la valeur finale <= n de départ
par exemple: pour n = 17467
je met :


if n<=17460:
            break
 

résultat :

Vol de 17467 :
52402 26201 78604 39302 19651 58954 29477 88432 44216 22108 11054
Altitude maxi : 88432 Durée de vol : 12

Hors ligne

#49 12-06-2020 14:45:27

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Comment "aller vers" en Python

Salut,

Solution universelle (affichage à affiner)


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Simulation de la suite de syracuse "classique"

for n in range(2, 40):
    maxi,n0,duree = n,n,1
    print("Vol de",n, ":")
    while True:
        n=n//2 if n%2==0 else 3*n+1
        duree, maxi=duree+1,max(n,maxi)
        print (n,end=" ")
        if n==1:
            print()
            break
        if duree>n0:
            print("\nArrêt : durée", duree,"> nombre de départ",n0)
            break
    print ("Altitude maxi :",maxi, "Durée de vol :",duree,"\n")
 

Sorties



Vol de 2 :
1
Altitude maxi : 2 Durée de vol : 2

Vol de 3 :
10 5 16
Arrêt : durée 4 > nombre de départ 3
Altitude maxi : 16 Durée de vol : 4

Vol de 4 :
2 1
Altitude maxi : 4 Durée de vol : 3

Vol de 5 :
16 8 4 2 1
Altitude maxi : 16 Durée de vol : 6

Vol de 6 :
3 10 5 16 8 4
Arrêt : durée 7 > nombre de départ 6
Altitude maxi : 16 Durée de vol : 7

Vol de 7 :
22 11 34 17 52 26 13
Arrêt : durée 8 > nombre de départ 7
Altitude maxi : 52 Durée de vol : 8

Vol de 8 :
4 2 1
Altitude maxi : 8 Durée de vol : 4

Vol de 9 :
28 14 7 22 11 34 17 52 26
Arrêt : durée 10 > nombre de départ 9
Altitude maxi : 52 Durée de vol : 10

Vol de 10 :
5 16 8 4 2 1
Altitude maxi : 16 Durée de vol : 7

Vol de 11 :
34 17 52 26 13 40 20 10 5 16 8
Arrêt : durée 12 > nombre de départ 11
Altitude maxi : 52 Durée de vol : 12

Vol de 12 :
6 3 10 5 16 8 4 2 1
Altitude maxi : 16 Durée de vol : 10

Vol de 13 :
40 20 10 5 16 8 4 2 1
Altitude maxi : 40 Durée de vol : 10

Vol de 14 :
7 22 11 34 17 52 26 13 40 20 10 5 16 8
Arrêt : durée 15 > nombre de départ 14
Altitude maxi : 52 Durée de vol : 15

Vol de 15 :
46 23 70 35 106 53 160 80 40 20 10 5 16 8 4
Arrêt : durée 16 > nombre de départ 15
Altitude maxi : 160 Durée de vol : 16

Vol de 16 :
8 4 2 1
Altitude maxi : 16 Durée de vol : 5

Vol de 17 :
52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 52 Durée de vol : 13

Vol de 18 :
9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4
Arrêt : durée 19 > nombre de départ 18
Altitude maxi : 52 Durée de vol : 19

Vol de 19 :
58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2
Arrêt : durée 20 > nombre de départ 19
Altitude maxi : 88 Durée de vol : 20

Vol de 20 :
10 5 16 8 4 2 1
Altitude maxi : 20 Durée de vol : 8

Vol de 21 :
64 32 16 8 4 2 1
Altitude maxi : 64 Durée de vol : 8

Vol de 22 :
11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 52 Durée de vol : 16

Vol de 23 :
70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
Altitude maxi : 160 Durée de vol : 16

Vol de 24 :
12 6 3 10 5 16 8 4 2 1
Altitude maxi : 24 Durée de vol : 11

Vol de 25 :
76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 88 Durée de vol : 24

Vol de 26 :
13 40 20 10 5 16 8 4 2 1
Altitude maxi : 40 Durée de vol : 11

Vol de 27 :
82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310 155 466
Arrêt : durée 28 > nombre de départ 27
Altitude maxi : 484 Durée de vol : 28

Vol de 28 :
14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 52 Durée de vol : 19

Vol de 29 :
88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 88 Durée de vol : 19

Vol de 30 :
15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
Altitude maxi : 160 Durée de vol : 19

Vol de 31 :
94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186
Arrêt : durée 32 > nombre de départ 31
Altitude maxi : 1186 Durée de vol : 32

Vol de 32 :
16 8 4 2 1
Altitude maxi : 32 Durée de vol : 6

Vol de 33 :
100 50 25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 100 Durée de vol : 27

Vol de 34 :
17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 52 Durée de vol : 14

Vol de 35 :
106 53 160 80 40 20 10 5 16 8 4 2 1
Altitude maxi : 160 Durée de vol : 14

Vol de 36 :
18 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 52 Durée de vol : 22

Vol de 37 :
112 56 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 112 Durée de vol : 22

Vol de 38 :
19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 88 Durée de vol : 22

Vol de 39 :
118 59 178 89 268 134 67 202 101 304 152 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Altitude maxi : 304 Durée de vol : 35

@+

[EDIT]
Ah...je vois que tu veux juste le contraire...

Dernière modification par yoshi (12-06-2020 14:46:04)

Hors ligne

#50 13-06-2020 07:23:21

LEG
Membre
Inscription : 19-09-2012
Messages : 790

Re : Comment "aller vers" en Python

Bonjour

@freddy : Je pense qu'il n'est pas possible de remonter à l'envers.
car si tu essayes de remonter à l'envers ne serait-ce que pour $n=2^{31}-1$ tu n'es pas sortie de l'auberge...pour la programmation...
regarde, avec le crible de @yoshi , où j'ai limité la durée de vol jusqu'à la valeur <= à n0.
en utilisant les nombres de Mersenne $2^P-1$


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Simulation de la suite de syracuse "classique"

for n in [127,2047,8191,131071,524287,8388607,536870911,2147483647]:
    maxi,n0,duree = n,n,1
    print("Vol de",n, ":")
    while True:
        n=n//2 if n%2==0 else 3*n+1
        duree, maxi=duree+1,max(n,maxi)
        print (n,end=" ")
        if n<=n0:
            print()
            break
           
    print ("Altitude maxi :",maxi, "Durée de vol :",duree,"\n")
 

Vol de 2147483647 :
6442450942 3221225471 9663676414 4831838207 14495514622 7247757311 21743271934 10871635967 32614907902 16307453951 48922361854 24461180927 73383542782 36691771391 110075314174 55037657087 165112971262 82556485631 247669456894 123834728447 371504185342 185752092671 557256278014 278628139007 835884417022 417942208511 1253826625534 626913312767 1880739938302 940369969151 2821109907454 1410554953727 4231664861182 2115832430591 6347497291774 3173748645887 9521245937662 4760622968831 14281868906494 7140934453247 21422803359742 10711401679871 32134205039614 16067102519807 48201307559422 24100653779711 72301961339134 36150980669567 108452942008702 54226471004351 162679413013054 81339706506527 244019119519582 122009559759791 366028679279374 183014339639687 549043018919062 274521509459531 823564528378594 411782264189297 1235346792567892 617673396283946 308836698141973 926510094425920 463255047212960 231627523606480 115813761803240 57906880901620 28953440450810 14476720225405 43430160676216 21715080338108 10857540169054 5428770084527 16286310253582 8143155126791 24429465380374 12214732690187 36644198070562 18322099035281 54966297105844 27483148552922 13741574276461 41224722829384 20612361414692 10306180707346 5153090353673 15459271061020 7729635530510 3864817765255 11594453295766 5797226647883 17391679943650 8695839971825 26087519915476 13043759957738 6521879978869 19565639936608 9782819968304 4891409984152 2445704992076 1222852496038 611426248019 1834278744058 917139372029 2751418116088 1375709058044 687854529022 343927264511 1031781793534 515890896767 1547672690302 773836345151 2321509035454 1160754517727 3482263553182 1741131776591 5223395329774 2611697664887 7835092994662 3917546497331 11752639491994 5876319745997 17628959237992 8814479618996 4407239809498 2203619904749 6610859714248 3305429857124 1652714928562 826357464281 2479072392844 1239536196422 619768098211 1859304294634 929652147317 2788956441952 1394478220976 697239110488 348619555244 174309777622 87154888811 261464666434 130732333217 392196999652 196098499826 98049249913 294147749740 147073874870 73536937435 220610812306 110305406153 330916218460 165458109230 82729054615 248187163846 124093581923 372280745770 186140372885 558421118656 279210559328 139605279664 69802639832 34901319916 17450659958 8725329979 26175989938 13087994969 39263984908 19631992454 9815996227 29447988682 14723994341 44171983024 22085991512 11042995756 5521497878 2760748939 8282246818 4141123409 12423370228 6211685114 3105842557 9317527672 4658763836 2329381918 1164690959
Altitude maxi : 1235346792567892 Durée de vol : 188

les vols avec les nombres de Mersenne ont une ascension constante jusqu'à la valeur du double de  l'exposant - 1 . Pour l'exposant 31 tu comptes 61 ascensions constantes, avant de commencer à redescendre; mais tu peux aussi remonter, car parfois, l'altitude maxi se trouve après ce point d'ascension constante.
C'est plus simple avec l'AS2 , en ne calculant qu'avec les nombres pairs....selon la formule avec i un entier impair:
((3*2i)+2)/2 = 2n , si 2n%4 == 0 tu divises par 2 sinon tu réitères soit  par ((2n*3)+2)/2 ou par 2n / 2 , car 2n%4 == 0...etc

Normalement il faudrait modifier cette ligne :


 while True:
        n=n//2 if n%2==0 else 3*n+1
 

par celle ci, avec N=2n où n est l'entier impair :


N=2n
 while True:
        N=N//2 if N%4==0 else (3*N+2)//2
 

mais je pédale dans la choucroute.....pour modifier le reste...., c'est bon.....!!! :


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Simulation de la suite de syracuse "classique"

for n in [27,31,127]:
    maxi,n0,duree = n,n,1
    print("Vol de",n, ":")
    N=2*n0
    while True:
        N=N//2 if N%4==0 else (3*N+2)//2
        duree, maxi=duree+1,max(N,maxi)
        print (N,end=" ")
        if N<=2*n0:
            print()
            break
           
    print ("Altitude maxi :",maxi, "Durée de vol :",duree,"\n")
 

========= RESTART: E:\executable algo\CRIBLE_de Syracuse yoshi.py ========
Vol de 27 :
82 124 62 94 142 214 322 484 242 364 182 274 412 206 310 466 700 350 526 790 1186 1780 890 1336 668 334 502 754 1132 566 850 1276 638 958 1438 2158 3238 4858 7288 3644 1822 2734 4102 6154 9232 4616 2308 1154 1732 866 1300 650 976 488 244 122 184 92 46
Altitude maxi : 9232 Durée de vol : 60

Vol de 31 :
94 142 214 322 484 242 364 182 274 412 206 310 466 700 350 526 790 1186 1780 890 1336 668 334 502 754 1132 566 850 1276 638 958 1438 2158 3238 4858 7288 3644 1822 2734 4102 6154 9232 4616 2308 1154 1732 866 1300 650 976 488 244 122 184 92 46
Altitude maxi : 9232 Durée de vol : 57

Vol de 127 :
382 574 862 1294 1942 2914 4372 2186 3280 1640 820 410 616 308 154
Altitude maxi : 4372 Durée de vol : 16

Dernière modification par LEG (13-06-2020 08:48:42)

Hors ligne

Pied de page des forums