Suite de Syracuseđź”—

 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
51
52
53
54
55
#!/usr/bin/env python3
# Time-stamp: <2018-07-26 16:57 ycopin@lyonovae03.in2p3.fr>

__author__ = "Adrien Licari <adrien.licari@ens-lyon.fr>; Yannick Copin <y.copin@ipnl.in2p3.fr>"


def suite_syracuse(n):
    """
    Retourne la suite de Syracuse pour l'entier n.

    >>> suite_syracuse(15)
    [15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
    """

    seq = [n]                     # La suite de Syracuse sera complétée...
    while seq[-1] != 1:           # ...jusqu'Ă  tomber sur 1
        if seq[-1] % 2 == 0:      # u_n est pair
            seq.append(seq[-1] // 2)  # Division euclidienne par 2
        else:                     # u_n est impair
            seq.append(seq[-1] * 3 + 1)

    return seq


def temps_syracuse(n, altitude=False):
    """
    Calcule le temps de vol (Ă©ventuellement en altitude) de la suite
    de Syracuse pour l'entier n.

    >>> temps_syracuse(15)
    17
    >>> temps_syracuse(15, altitude=True)
    10
    """

    seq = suite_syracuse(n)
    if not altitude:            # Temps de vol total
        return len(seq) - 1
    else:                       # Temps de vol en altitude
        # Construction de la séquence en altitude
        alt = []
        for i in seq:
            if i >= n:
                alt.append(i)
            else:
                break
        return len(alt) - 1

if __name__ == '__main__':

    n = 15
    print("Suite de Syracuse pour n =", n)
    print(suite_syracuse(n))
    print("Temps de vol total:      ", temps_syracuse(n))
    print("Temps de vol en altitude:", temps_syracuse(n, altitude=True))
Suite de Syracuse pour n = 15
[15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
Temps de vol total:       17
Temps de vol en altitude: 10

Source: syracuse.py