Exercice 1.1

Écrire une fonction qui calcule et stocke dans un tableau les 100 premiers termes de la suite des entiers positifs impairs


In [6]:
def tab():
    impairs = []
    i = 1

    for k in range(0, 100):
        impairs.append(i)
        i = i + 2
    
    return impairs

In [7]:
t = tab()
print (t)


[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199]

In [9]:
def tab2():
    impairs = []
    i = 1

    while i < 200:
        impairs.append(i)
        i = i + 2
    
    return impairs

In [10]:
t = tab2()
print (t)


[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199]

In [11]:
def tab3():
    impairs = []

    for i in range(1, 200, 2):
        impairs.append(i)
    
    return impairs

In [12]:
t = tab3()
print (t)


[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199]

In [15]:
def tab4():
    return [i for i in range(1, 200, 2)]

In [16]:
t = tab4()
print (t)


[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199]

Exercice 1.2

Même exercice cette fois avec les 100 premiers termes de la suite de Fibonacci :


In [22]:
def fib():    
    """Retourne la liste des 100 premiers termes de Fibonacci"""
    a, b = 0, 1
    list_fibo = []
    
    while len(list_fibo) < 100:
        list_fibo.append(b)
        a, b = b, a+b

    return list_fibo

In [23]:
f = fib()
print (f)


[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026, 354224848179261915075]

Exercice 1.3

Modifiez le programme précédent de sorte qu’il crée un tableau contenant les termes de la suite de Fibonacci qui sont des multiples de 7


In [24]:
def fib_multiple7(n):    
    """Retourne la liste des n premiers termes de Fibonacci
    qui sont des multiples de 7"""
    a, b = 0, 1
    list_fibo = []
    
    while len(list_fibo) < n:
        if b % 7 == 0:
            list_fibo.append(b)
        a, b = b, a+b

    return list_fibo

In [25]:
f7 = fib_multiple7(10)
print (f7)


[21, 987, 46368, 2178309, 102334155, 4807526976, 225851433717, 10610209857723, 498454011879264, 23416728348467685]

In [3]:
ma_liste = []
ma_liste.append(2)


Out[3]:
list

Question 2.1

Ecrire une fonction diviseurs qui renvoie dans un tableau la liste des diviseurs d'un entier donné


In [8]:
def diviseurs(i):
    """retourne la liste des diviseurs de l'entier i"""
    tab_div = []
    tab_div.append(1)
    for d in range(2, i+1):
        if i % d == 0:
            tab_div.append(d)
    return tab_div

In [1]:
def diviseurs(i):
    """retourne la liste des diviseurs de l'entier i"""
    if i == 1: return []
    tab_div = []
    tab_div.append(1)
    for d in range(2, i//2+1):
        if i % d == 0:
            tab_div.append(d)
    tab_div.append(i)
    return tab_div

In [9]:
print ("diviseurs de 10: ", diviseurs(10))
print ("diviseurs de 30: ", diviseurs(30))
print ("diviseurs de 11: ", diviseurs(11))
print ("diviseurs de 1: ", diviseurs(1))


diviseurs de 10:  [1, 2, 5, 10]
diviseurs de 30:  [1, 2, 3, 5, 6, 10, 15, 30]
diviseurs de 11:  [1, 11]
diviseurs de 1:  [1]

In [10]:
def est_premier(i):
    """teste si l'entier i est premier"""
    tab_div = diviseurs (i)
    if len(tab_div) == 2: return True
    else: return False

In [13]:
def est_premier(i):
    """teste si l'entier i est premier"""
    return len(diviseurs (i)) == 2

In [12]:
print ("7 est premier ?", est_premier(7))
print ("11 est premier ?", est_premier(11))
print ("20 est premier ?", est_premier(20))
print ("1 est premier ?", est_premier(1))


7 est premier ? True
11 est premier ? True
20 est premier ? False
1 est premier ? False

In [11]:
def liste_premiers(n):
    """retourne la liste des nombres premiers strictement inférieur à n"""
    tab_premiers = []
    for i in range(1, n):
        if est_premier(i): 
            tab_premiers.append(i)
    return tab_premiers

In [15]:
print (liste_premiers(100))


[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

In [17]:
%timeit liste_premiers(100)


299 µs ± 4.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Question 3


In [2]:
def liste_parfait(n):
    """retourne la liste des n premiers nombres parfaits"""
    parfait_tab = list()
    nombre = 6
    while len(parfait_tab) < n:
        d = diviseurs(nombre)
        somme = 0
        for i in range(len(d)-1):
            somme += d[i]
        if somme == nombre: parfait_tab.append(nombre)
        nombre += 1
    return parfait_tab

In [5]:
lp = liste_parfait(4)
for parfait in lp:
    print (parfait, ':', diviseurs(parfait))


6 : [1, 2, 3, 6]
28 : [1, 2, 4, 7, 14, 28]
496 : [1, 2, 4, 8, 16, 31, 62, 124, 248, 496]
8128 : [1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064, 8128]

Question 4


In [9]:
def crible(n):
    """retourne les n premiers nombres premiers par la méthode d'Eratosthène"""
    premiers = list()
    non_premiers = list()
    for i in range (2, n+1):
        if i in non_premiers: 
            continue
        else:
            premiers.append(i)
            m = 2
            while i * m <= n:
                non_premiers.append(i * m)
                m += 1
    return premiers

In [15]:
print (crible(10))
print (liste_premiers(10))


[2, 3, 5, 7]
[2, 3, 5, 7]

In [16]:
%timeit crible(100)


88.1 µs ± 1.47 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [17]:
%timeit liste_premiers(100)


194 µs ± 7.19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [8]:
liste = [2, 3, 5, 7, 3, 3]
3 in liste


Out[8]:
True

Question 4

utiliser une liste de nombre et un masque, soit avec des 0/1 soit avec des booléens

Utiliser les set pour supprimer les doublons


In [17]:
def crible_premiers(n):
    """retourne la liste des nombres premiers inférieurs à n"""
    nombres = list()
    for i in range(n+1):
        nombres.append(i)
    # équivalent à nombres = [i for i in range(n+1)]
    masque = list()
    for i in range(n+1):
        if i == 0 or i == 1:
            masque.append(False) # 0 et 1 ne sont pas premiers
        else:
            masque.append(True) # pour le reste on ne sait pas encore
    # équivalent à 
    # masque = [False if i == 0 or i == 1 else True for i in range(n+1)]
    for p in nombres:
        if masque[p] == True:  # C'est un nombre premier
            # on masque les multiples du nombre
            m = 2
            while p * m <= n:
                masque[p * m] = False
                m = m + 1
                
    premiers = list()
    for p in nombres:
        if masque[p] == True:
            premiers.append(p)
    return premiers

In [18]:
l = crible_premiers(10)
print (l)


[2, 3, 5, 7]

In [23]:
def crible_premiers2(n):
    """retourne la liste des nombres premiers inférieurs à n"""
    nombres = list()
    for i in range(n+1):
        nombres.append(i)

    masque = [False, False]
    for i in range(2, n+1):
            masque.append(True) 
    # équivalent à 
    # masque = [False if i == 0 or i == 1 else True for i in range(n+1)]
    
    premiers = list()
    for p in nombres:
        if masque[p] == True:  # C'est un nombre premier
            premiers.append(p)
            # on masque les multiples du nombre
            m = 2
            while p * m <= n:
                masque[p * m] = False
                m = m + 1
    return premiers

In [24]:
l = crible_premiers2(10)
print (l)


[2, 3, 5, 7]

In [28]:
%timeit crible_premiers(1000)


514 µs ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [27]:
%timeit crible_premiers2(1000)


441 µs ± 6.41 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [53]:
def crible_premiers3(n):
    """retourne la liste des nombres premiers inférieurs à n"""
    premiers =  set(range(2, n))
    nombres = [i for i in range(n+1)]
    for i in nombres:
        if i in premiers:
            # on supprime les multiples du nombre
            m = 2
            while i * m <= n:
                if i*m in premiers:
                    premiers.remove(i*m)
                m = m + 1
                
    return list(premiers)

In [54]:
nombres = set(range(2, 11))
print(nombres)
nombres.remove(4)
print(nombres)


{2, 3, 4, 5, 6, 7, 8, 9, 10}
{2, 3, 5, 6, 7, 8, 9, 10}

In [55]:
crible_premiers3(10)


Out[55]:
[2, 3, 5, 7]

In [56]:
%timeit crible_premiers3(1000)


448 µs ± 8.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [ ]: