Exercice 1
Exercice 1. Exercice 1. 1. Ecrire une fonctions moyenne() prenant en paramètre une séquence numérique (liste ou tuple) et retournant sa moyenne. 2. Ecrire une fonctions variance() prenant en paramètre une séquence numérique (liste ou tuple) et retournant sa variance. On rappelle que V (X ) = E((X E(X )) 2 ) = E(X 2 ) E(X ) 2 et on fera appel à la fonction moyenne(). 3. Quelles sont leur complexité (en fonction de la longueur de la séquence)?
Exercice 1. Correction 1. Pour la fonction moyenne() : def moyenne(tab): s = 0 for x in tab: s += x return s/len(tab) ou plus rapide, à l aide de la fonction sum() : def moyenne(tab): return sum(tab)/len(tab) De complexité linéaire : une boucle for parcourant la séquence. Remarque la fonction len(.) est en temps borné O(1).
Exercice 1. Correction 2. Pour la fonction variance() : A l aide de la définition : V (X ) = E((X E(X )) 2 : def variance(x): m = moyenne(x) Y = [(x - m)**2 for x in X] # Liste (X E(X )) 2 return moyenne(y) ou avec König-Huygens V (X ) = E(X 2 ) E(X ) 2 : def variance(x): X2 = [x**2 for x in X] # Liste X 2 return moyenne(x2) - moyenne(x)**2 Chacune de complexité linéaire : complexité linéaire pour calculer moyenne(x) complexité linéaire pour constituer la liste Y ou la liste X2. complexité linéaire pour calculer moyenne(y) ou moyenne(x2) A la suite.
.. (Oral Banque PT)
. 1. d(4) retourne [1,2,4] d(10) retourne [1,2,5,10]. Pour un entier positif n, la fonction d(n) retourne la liste des diviseurs de son argument. 2. def DNT(n): L=[] for nombre in range(2,n): if n%nombre==0: L.append(nombre) return L
. 3. def sommecarresdnt(n): return sum([x**2 for x in DNT(n)]) 4. L = [] for x in range(1000): if x == sommecarresdnt(x): L.append(x) print(l) retourne : [0, 4, 9, 25, 49, 121, 169, 289, 361, 529, 841, 961] C est la suite des carrés des nombres premiers. Il est évident que le carré d un nombre premier est égal à la somme des carrés de ses diviseurs non-triviaux. On conjecture que si un nombre N égale la somme des carrés de ses diviseurs non triviaux, alors N est le carré d un nombre premier.
.. (Oral Banque PT)
. 1. def nombrezeros(t,i): n = len(t) r = 0 while i < n and t[i] == 0: i += 1 r += 1 return r 2. Il suffit de constituer la liste du nombre max de zéros débutant aux indices allant de 0 à len(t)-1, puis de retourner son maximum : def nombrezerosmax(t): n = len(t) L = [nombrezeros(t,i) for i in range(n) ] return max(l)
. 3. Dans le pire des cas : celui d une liste constituée uniquement de zéros : nombrezeros(t,i) fait de l ordre de len(t)-i opérations. Ainsi la constitution de L effectue de l ordre de len(t) 1 len(t) len(t) i = i=0 k=1 k = O(len(t) 2 ) opérations. La recherche d un maximum est linéaire : O(len(t)) opérations. Ainsi la complexité est dans le pire des cas quadratique O(len(t) 2 ).
. 4. On peut effectuer la recherche en complexité linéaire : il suffit de ne pas calculer nombrezeros(t,i) pour tous les indice i : si on a obtenu a zéros contigus au dernier calcul on poursuit à l indice du premier 1 qui suit, soit à l indice précédent augmenté de a + 1 : def nombrezerosmax1(t): ListeNombreZeros = [] i = 0 while i < len(l): d = nombrezeros(t,i) ListeNombreZeros.append(d) i += d+1 return max(listenombrezeros) Dans la boucle while chaque élément de la liste t est lu une fois : complexité linéaire. Suivi de la recherche du maximum qui est en temps linéaire sur la longueur de la liste ListeNombreZeros, soit en temps au plus linéaire sur la longueur de t.
.. (Oral Banque PT) Indication pour la fonction codage() : créer une liste listephrase des caractères de la chaine phrase ; parcourir les 26 lettres de l alphabet par indice, en appelant les fonctions indices(x,phrase) et decalage(n), modifier chaque lettre x dans listephrase par le caractère codé correspondant. Finalement reconstituer à partir de listephrase la phrase codée.
. 1. alphabet = abcdefghijklmnopqrstuvwxyz 2. def decalage(n): return alphabet[n:] + alphabet[:n] 3. def indices(x,phrase): n = len(phrase) L = [] for i in range(n): if x == phrase[i]: L.append(i) return L
. def codage(n,phrase): alphabetcode = decalage(n) # Obtention de l alphabet codé # Constitution de la liste des caractères de phrase listephrase = [] for x in phrase: listephrase.append(x) % Codage de la liste en utilisant la fonction indices(,) for i in range(26): lettre = alphabet[i] lettrecode = alphabetcode[i] ind = indices(lettre,phrase) for i in ind: listephrase[i] = lettrecode # Obtention de la chaine codée : phrasecode = for lettre in listephrase : phrasecode += lettre return phrasecode
. Remarques : 1. Les fonctions intermédiaires sont là pour être utilisées! 2. On travaille sur des listes car une chaine de caractère est non-modifiable. 3. L algorithme est de complexité linéaire sur la longueur de la chaîne à coder. 5. Pour décoder un message crypté avec un décalage de n, il suffit de coder avec décalage -n (la fonction decalage() marche aussi avec un argument négatif). def decodage(n, phrasecode): return codage(-n, phrasecode)