PCSI - informatique commune Mardi 14 janvier 2014 : DS 1 Avertissement : ce sujet est très (trop !) long, mais il n’y a pas de piège particulier, de chose tordue (sauf l’avant-dernière question !). Vous serez payés pour ce que vous faites ; pas sanctionnés pour ce que vous ne faites pas. En première approximation, quelqu’un faisant correctement trois problèmes aura 20, et le premier problème est suffisant pour approcher la moyenne. Vous pouvez traiter les exercices dans l’ordre que vous voulez, pourvu que ceux-ci soient CLAIREMENT identifiés. Vous veillerez à mettre votre nom et votre classe, et vous numéroterez vos copies (pas les pages...). 1 Suite et sommes On considère dans cette partie la suite définie par ses premiers termes u0 = u1 = u2 = 1 et, pour tout n ∈ N, la relation un+3 = 2un + un+1 . 1. Écrire une fonction prenant en entrée un entier n > 0 et renvoyant un . Expliquer son comportement lors de l’appel sur l’entrée n = 9. Attention, il est interdit d’écrire un programme récursif 1 . 2. Dans votre programme précédent, évaluer le nombre d’additions réalisées lors du calcul de un . n P 3. Écrire un programme prenant en entrée un entier n > 0 et renvoyant uk . Expliquer son comk=0 portement pour les entrées n = 2 et n = 6. 4. Dans le programme précédent, évaluer le nombre d’additions réalisées lors du calcul de n P uk . k=0 5. Écrire un programme prenant en entrée un entier n > 0 et renvoyant n P uk un−k . Expliquer son k=0 comportement pour l’entrée n = 5. 6. Dans votre programme précédent, évaluer le nombre d’additions réalisées lors du calcul de n P uk un−k . k=0 >>> [1, >>> [1, >>> [1, [u(n) for n in range(10)] 1, 1, 3, 3, 5, 9, 11, 19, 29] [somme(n) for n in range(10)] 2, 3, 6, 9, 14, 23, 34, 53, 82] [somme_produit(n) for n in range(10)] 2, 3, 8, 13, 22, 43, 68, 117, 202] 2 Des tableaux 1. Écrire une fonction prenant en entrée un tableau d’entiers et retournant le produit des éléments de ce tableau (autant de fois qu’ils sont présents 2 ). Le résultat renvoyé devra être égal à 1 si le tableau est vide. 2. Écrire une fonction prenant en entrée un tableau d’entiers et retournant le produit des éléments de ce tableau qui sont supérieurs ou égaux à 10. 3. Écrire un programme prenant en entrée un tableau, ( disons t1 et retournant un autre tableau, 0 si t1 [i] < 0 disons t2 tel que pour tout i ∈ [[0, |t1 | − 1]], t2 [i] = t1 [i] sinon On veillera à ce que t1 ne soit pas modifié. 1. i.e. : qui s’appelle. 2. Bref : il n’y a pas de piège ou de difficulté sur ce point ; même remarque pour la question suivante ! 1 >>> produit([10, 5, 20, 3, 20]) 60000 >>> produit10([10, 5, 20, 3, 20]) 4000 3 Mystère On considère dans cet exercice la fonction suivante : def mystere(a, b): x, y = a, 0 while x >= b: x = x-b y = y+1 return x,y 1. Donner (en expliquant) le résultat renvoyé à l’exécution de mystere(42, 10) 2. On suppose : a ∈ N et b ∈ N∗ . Justifier la terminaison de la boucle lors de l’appel mystere(a, b) 3. On suppose : a ∈ N et b ∈ N∗ . Quel sera le résultat renvoyé par l’appel mystere(a, b) ? Justifier au mieux ! 4. Quelle est la complexité de ce programme ? On évaluera le nombre d’opérations élémentaires effectuées en fonction des données. 4 Lecture dans un fichier On suppose qu’on dispose dans un fichier premiers.txt des 1000 premiers nombres premiers, disposés par deux sur 500 lignes et séparés par des virgules : les deux premières lignes sont : 2,3 5,7 1. Comment calculer la somme des 1000 premiers nombres premiers grâce à ce fichier ? Bonus à ceux qui ont une réponse en une ligne :-) 2. Comment calculer le nombre de lignes du fichier telles que les deux nombres premiers ont une somme divisible par 10 ? 3. Comment déterminer le nombre de couples (i, j) tels que i < j, et en notant (ai , bi ) et (aj , bj ) les entiers présents aux lignes i et j, on a ai + bi [10] = aj + bj [10] (la notation [10] signifiant «modulo 10»). 4. Si on remplace 1000 par n, quelle est (en fonction de n) la complexité du programme précédent ? Si ce n’est pas le cas 3 , écrire un programme répondant au problème en temps linéaire en n. 5. Bonus : expliquer comment créer ce fichier de nombres premiers ! 3. Et normalement, ce n’est effectivement pas le cas ! 2