Mines Informatique Commune MP PC PSI 2019Sujet, corrigé et rapport du jury
Autour des nombres premiers
- Complexité algorithmique
- Représentation des flottants et erreurs d'arrondi
- Crible d'Ératosthène et tests de primalité
- Méthodes d'intégration numérique (rectangles, trapèzes)
- Bases de données et langage SQL (clé primaire, jointures, sous-requêtes)
Téléchargements
Présentation du sujet
DifficileInformatique commune : algorithmique autour des nombres premiers (crible d'Ératosthène, tests de primalité, calcul de π(n))Afficher ou masquer la section
Présentation du sujet
DifficileLe sujet d'informatique commune porte sur des techniques algorithmiques autour du thème des nombres premiers, en abordant un large spectre des notions vues durant les deux années de préparation. Il comprend des préliminaires, la génération de nombres premiers par crible d'Ératosthène puis par une méthode rapide, le comptage des nombres premiers, et une partie d'analyse de performance de code ainsi que des questions de bases de données.
- 1Partie I : préliminairesQuestions préparatoires sur la représentation des nombres et la complexité.
- 2Partie II : génération de nombres premiersApproche systématique par crible d'Ératosthène puis méthode de génération rapide de nombres premiers.
- 3Partie III : compter les nombres premiersCalcul de π(n) via un crible, estimation par quadrature numérique et via la fonction Ei.
- 4Partie IV : analyse de performance de codeAnalyse de complexité de code, complétée par des questions de bases de données (clé primaire, jointures, sous-requêtes).
Difficile. Le rapport signale que la simplification d'une somme géométrique pose des problèmes à plus d'un tiers des candidats, et que seule une solution parfaitement correcte sur dix a été obtenue à la question 8.
Ce qu'a observé le jury
6 erreurs relevéesSimplification d'une somme géométrique difficile · Mélange entre notations mathématiques et code Python · Erreurs d'arrondi non identifiéesAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesL'épreuve aborde un large spectre des notions vues durant les deux années de préparation. Le jury relève beaucoup d'erreurs de calcul incongrues à ce niveau, un mélange fréquent entre notations mathématiques et code Python, et une notion de complexité algorithmique encore mal acquise par une partie des candidats.
Les erreurs les plus sanctionnées
- 1Simplification d'une somme géométrique difficileRemarques générales
Une aisance calculatoire minimale est attendue même dans une épreuve d'informatique.
« Bien qu’il ne s’agisse pas d’une épreuve de mathématique, on est en droit d’attendre des candidats une »
- 2Mélange entre notations mathématiques et code PythonRemarques générales
Un algorithme en Python doit utiliser les opérateurs du langage et non du pseudo-code mathématique.
« un algorithme en python n’est pas du pseudo -code, il faut »
- 3Erreurs d'arrondi non identifiéesQ5
Beaucoup de candidats ne reconnaissent pas que l'erreur observée provient de la représentation des flottants sur un nombre limité de bits, invoquant plutôt « l'ordinateur » ou « le langage Python ».
« reconnaître une manifestation des erreurs d’arrondis due à la représentation des flottants »
- 4Notion de bit mal compriseQ7
Certains candidats pensent à tort qu'un booléen doit être codé sur au moins deux bits car il ne peut prendre que deux valeurs.
« un booléen doit être codé au minimum sur 2 bits »
- 5Confusion entre les opérateurs % et //Q12
Cette confusion conduit à une solution fausse pour tester la divisibilité d'un nombre.
« des confusions entre les opérateurs % et // . A ce propos, on a lu »
- 6Clé primaire mal compriseQ25
Certains candidats pensent à tort qu'un attribut de même nom dans deux tables ne peut servir de clé primaire pour l'une d'elles.
« cela n’a rien à voir avec la définition d’une clé primaire. »
Ce qui a été bien réussi
- La question 3, une application simple de fonction récursive, a été généralement comprise.
- La question 17 a été en général bien réussie.
- La syntaxe d'une jointure SQL semble mieux maîtrisée que les années précédentes.
Conseils du jury
- Utiliser les opérateurs propres au langage Python plutôt que des notations mathématiques hybrides.
- Privilégier systématiquement L.append(a) plutôt que L=L+[a] pour ajouter un élément à une liste.
- Avoir conscience de la complexité algorithmique de son code, notamment en évitant d'appeler une fonction coûteuse au cœur d'une double boucle.
- Proposer une seule solution fonctionnelle et lisible plutôt que plusieurs solutions, car la notation se fait sur la moins bonne.
- Prêter une grande attention aux détails d'implémentation : initialisations, bornes de boucles et indices.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARISTECH, TELECOM PARISTECH, MINES PARISTECH, MINES SAINT-ÉTIENNE, MINES NANCY, IMT Atlantique, ENSAE PARISTECH, CHIMIE PARISTECH.
CONCOURS 2019
ÉPREUVE D'INFORMATIQUE COMMUNE
L'usage de la calculatrice et de tout dispositif électronique est interdit.
Les candidats sont priés de mentionner de façon apparente sur la première page de la copie :
INFORMATIQUE COMMUNE
L'énoncé de cette épreuve comporte 9 pages de texte.
Si, au cours de l'épreuve, un candidat repère ce qui lui semble être une erreur d'énoncé, il le signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives qu'il est amené à prendre.
Autour des nombres premiers
Préambule
Le sujet étudie différentes questions sur les nombres premiers.
Les programmes demandés sont à rédiger en langage Python 3. Si toutefois le candidat utilise une version antérieure de Python, il doit le préciser. Il n'est pas nécessaire d'avoir réussi à écrire le code d'une fonction pour pouvoir s'en servir dans une autre question. Les questions portant sur les bases de données sont à traiter en langage SQL.
Définitions, rappels et notations
- Un nombre premier est un entier naturel qui admet exactement deux diviseurs : 1 et lui-même. Ainsi 1 n'est pas considéré comme premier.
- Un flottant est la représentation d'un nombre réel en mémoire.
- Quand une fonction Python est définie comme prenant un « nombre » en paramètre cela signifie que ce paramètre pourra être indifféremment un flottant ou un entier.
- On note
⌊x⌋ la partie entière dex . - abs(x) renvoie la valeur absolue de x . La valeur renvoyée est du même type de données que celle en argument.
- int(x) convertit vers un entier. Lorsque x est un flottant positif ou nul, elle renvoie la partie entière de x , c'est-à-dire l'entier
n tel quen ⩽ x < n + 1 . - round(x) renvoie la valeur de l'entier le plus proche de x . Si deux entiers sont équidistants, l'arrondi se fait vers la valeur paire.
-
floor(x) renvoie la valeur du plus grand entier inférieur ou égal àx . - ceil(x) renvoie la valeur du plus petit entier supérieur ou égal à
x . -
log(x) renvoie sous forme de flottant la valeur du logarithme népérien de x (supposé strictement positif). -
log(x, n) renvoie sous forme de flottant la valeur du logarithme de x en base n . - La fonction time() du module time renvoie un flottant représentant le nombre de secondes depuis le
01/01/1970 avec une résolution de10^(− 7) seconde (horloge de l'ordinateur). - L'opérateur usuel de division / renvoie toujours un flottant, même si les deux opérandes sont des multiples l'un de l'autre.
- L'infini
+ ∞ en Python s'écrit float("inf"). - En Python 3, on peut utiliser des entiers illimités de plus de 32 bits avec le type long.
Partie I. Préliminaires
- Q1 - Dans un programme Python on souhaite pouvoir faire appel aux fonctions log, sqrt, floor et ceil du module math (round est disponible par défaut). Écrire des instructions permettant d'avoir accès à ces fonctions et d'afficher le logarithme népérien de 0.5.
- Q2 - Écrire une fonction sont_proches (x, y) qui renvoie True si la condition suivante est remplie et False sinon
def mystere(x,b):
if x < b:
return 0
else:
return 1 + mystere(x / b, b)
- Q4 - Exprimer ce que renvoie mystere en fonction de la partie entière d'une fonction usuelle.
- Q5 - On donne le code suivant :
pas = 1e-5
x2 = 0
for i in range(100000):
x1 = (i + 1) * pas
x2 = x2 + pas
print("x1:", x1)
print("x2:", x2)
x1: 1.0
x2: 0.9999999999980838
Partie II. Génération de nombres premiers
II.a Approche systématique
Résultat : liste_bool, liste de booléens
début
liste_bool
Marquer comme Faux le premier élément de liste_bool;
pour entier
si
Marquer comme Faux tous les multiples de
fin
fin
retourner liste_bool
fin
Algorithme 1 : Crible d'Ératosthène
- Q6 - Sachant que le langage Python traite les listes de booléens comme une liste d'éléments de 32 bits, quel est (approximativement) la valeur maximale de N pour laquelle liste_bool est stockable dans une mémoire vive de 4 Go?
- Q7 - Quel facteur peut-on gagner sur la valeur maximale de N en utilisant une bibliothèque permettant de coder les booléens non pas sur 32 bits mais dans le plus petit espace mémoire possible pour ce type de données (on demande de le préciser) ?
- Q8 - Écrire la fonction erato_iter(N) qui implémente l'algorithme 1 pour un paramètre
N qui est un entier supérieur ou égal à 1 . - Q9 - Quelle est la complexité algorithmique du crible d'Ératosthène en fonction de N? On admettra que :
- Q10 - Quand on traite des nombres entiers il est intéressant d'exprimer la complexité d'un algorithme non pas en fonction de la valeur
N du nombre traité mais de son nombre de chiffresn . Donner une approximation du résultat de la question précédente en fonction den en précisant la base choisie.
II.b Génération rapide de nombres premiers
réussit un de ces tests alors la probabilité qu'il ne soit pas premier est prouvée être inférieure à un seuil calculable.
En suivant cette idée, une nouvelle approche est la suivante :
- générer un entier pseudo-aléatoire (voir ci-dessous)
- vérifier si cet entier a de fortes chances d'être premier
- recommencer tant que le résultat n'est pas satisfaisant.
- Q12 - Compléter (avec le nombre de lignes que vous jugerez nécessaire) la fonction bbs (N) donnée ci-dessous qui réalise ces itérations. La graine est un entier représentant la fraction de secondes du temps courant, par exemple 1528287738.7931523 donne la graine 7931523 . Le paramètre N est un entier non nul.
...
def bbs(N):
p1 = 24375763
p2 = 28972763
M = p1 * p2
# calculer la graine
(à compléter)
A = 0
for i in range(N):
if ... (à compléter) # si xi est impair
A = A + 2** i
# calculer le nouvel xi
xi = ... (à compléter)
return (A)
Q14 - On souhaite caractériser le taux d'erreurs de premier_rapide.
Écrire une fonction stats_bbs_fermat (
Partie III. Compter les nombres premiers
III.a Calcul de
π(n) via un crible
Un seul appel à erato_iter est autorisé et on exige une fonction dont la complexité, en dehors de cet appel, est linéaire en fonction de N . Le paramètre N est un entier supérieur à 1 .
- Q16 - Écrire une fonction verif_Pi(N) qui renvoie True si l'inégalité est vérifiée jusqu'à
N inclus, False sinon. Le paramètreN est un entier supposé supérieur ou égal à 5393 .
III.b Calcul d'une valeur approchée de
π(n)

Estimation de li par quadrature numérique
Par souci de simplification, on suppose que pas est choisi de manière à ce que 1 et
Q17-La fonction qui est évaluée sur l'intervalle d'intégration est supposée avoir une complexité constante quelles que soient ses valeurs d'entrée. Quelle est la complexité en temps de la méthode des rectangles à droite? On prendra soin d'expliciter en fonction de quelle variable d'entrée cette complexité est exprimée.
- Q18 - Dans les mêmes conditions d'évaluation, quelle est la complexité en temps de la méthode des rectangles centrés? Donner aussi celle de la méthode des trapèzes.
- Q19 - Écrire une fonction inv_ln_rect_d(a, b, pas) qui calcule par la méthode des rectangles à droite une valeur approchée de
∫_a^b(dt)/(ln(t)) avec un incrément valant pas. On suppose dans cette question quea < b et que 1 n'appartient pas à l'intervalle[a, b] de sorte que la fonction intégrée est définie et continue sur[a, b] .
On considère que le réelb − a est un multiple du réel pas.
Les paramètresa, b et pas sont des flottants. - Q20 - Écrire une fonction li_d(x, pas) qui calcule une valeur approchée de li(
x ) avec la méthode des rectangles à droite en se basant sur inv_ln_rect_d. Six = 1 la fonction renvoie− ∞ . On rappelle qu'on suppose que pas est choisi de manière à ce que 1 etx soient multiples de pas et qu'on utiliseε = pas dans l'équation (4). Les paramètres x et pas sont des flottants.
Analyse des résultats de li_d
.jpg)

- Q21 - Expliquer le comportement de l'écart relatif entre li_d et ref_li, illustré figure 2 au voisinage de
x ≃ 1.4 . - Q22 - On constate un écart absolu important entre li_d et ref_li au delà de
x = 1 , illustré figure 3. Expliquer succinctement d'où vient ce phénomène. On ne demande pas une démonstration mathématique rigoureuse.
Pour répondre à cette question on pourra remarquer qu'au premier ordre1/(ln(1 + ε)) ≃ − 1/(ln(1 − ε)) quandε → 0 et s'interroger sur la valeur que devrait avoir l'intégrale impropre de1/(ln(x)) sur un intervalle[1 − ε, 1 + ε] avecε≪1 . Une analyse géométrique de la figure 4 peut aussi s'avérer utile. - Q23 - Proposer, en justifiant votre choix, une ou des modifications de l'algorithme utilisé afin d'éliminer le problème constaté sur l'écart absolu. Il n'est pas demandé d'écrire le code mettant en œuvre ces propositions.

Estimation de li via Ei
Le lien entre li et Ei est :
Comme l'évaluation de la somme jusqu'à l'infini est impossible on utilise en pratique la somme suivante :
L'évaluation via un ordinateur de ce développement est numériquement stable jusqu'à
- Q24 - Écrire une fonction li_dev(x) qui calcule
l(x) en se basant surEi_n et la fonction sont_proches de la question 2 (on pourra utiliser la fonction associée même si la question n'a pas été traitée). li_dev doit renvoyer False si : -
Ei_(n − 1) etEi_n ne peuvent pas être considérés comme proches au bout de MAXIT itérations. - la valeur de x ne permet pas d'aboutir à un résultat.
On demande à ce que la complexité dans le pire des cas soit
Partie IV. Analyse de performance de code
La première table est ordinateurs et permet de stocker des informations sur les ordinateurs utilisés pour les tests. Ses attributs sont :
- nom TEXT, clé primaire, le nom de l'ordinateur.
- gflops INTEGER la puissance de l'ordinateur en milliards d'opérations flottantes par seconde.
- ram INTEGER la quantité de mémoire vive de l'ordinateur en Go.
| nom | gflops | ram |
| --------- | ---------- | --------- |
| nyarlathotep114 | 69 | 32 |
| nyarlathotep119 | 137 | 32 |
|
|
||
| shubniggurath42 | 133 | 16 |
| azathoth137 | 85 | 8 |
- id INTEGER l'identifiant du test effectué.
- nom TEXT le nom de la fonction testée (par exemple li, Ei, etc).
- algorithme TEXT le nom de l'algorithme qui permet le calcul de la fonction testée (par exemple BBS si on teste une fonction de génération de nombres aléatoires).
- teste_sur TEXT le nom du PC sur lequel le test a été effectué.
- temps_exec INTEGER le temps d'exécution du test en millisecondes.
| id | nom | algorithme | teste_sur | temps_exec |
| 1 | li | rectangles | nyarlathotep165 | 2638 |
| 2 | li | rectangles | shubniggurath28 | 736 |
| 3 | li | trapezes | nyarlathotep165 | 4842 |
| 2154 | Ei | puiseux | nyarlathotep145 | 2766 |
| 2155 | aleatoire | BBS | azathoth145 | 524 |
- Q25 - Expliquer pourquoi il n'est pas possible d'utiliser l'attribut nom comme clé primaire de la table fonctions.
- Q26 - Écrire des requêtes SQL permettant de :
- Connaître le nombre d'ordinateurs disponibles et leur quantité moyenne de mémoire vive.
- Extraire les noms des PC sur lesquels l'algorithme rectangles n'a pas été testé pour la fonction nommée li.
- Pour la fonction nommée Ei, trier les résultats des tests du plus lent au plus rapide. Pour chaque test retenir le nom de l'algorithme utilisé, le nom du pc sur lequel il a été effectué et la puissance du PC.
Fin de l'épreuve.
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines MP-PC-PSI 2019 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines MP-PC-PSI 2019 ?
Le sujet porte sur des techniques algorithmiques autour des nombres premiers : crible d'Ératosthène, tests de primalité, calcul de π(n) et analyse de performance de code.
Ce sujet d'informatique commune Mines 2019 est-il difficile ?
Le rapport indique que plus d'un tiers des candidats a eu des difficultés sur une simplification de somme géométrique, et seulement environ 10% ont produit une solution parfaitement correcte à la question 8.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet Mines informatique commune 2019 ?
Le jury relève un mélange fréquent entre notations mathématiques et code Python, une mauvaise compréhension de la notion de bit, et des confusions entre les opérateurs % et //.
Ce sujet Mines informatique commune 2019 nécessite-t-il des connaissances en bases de données ?
Oui, la dernière partie comporte des questions de SQL portant sur les clés primaires, les jointures et les sous-requêtes.
Pas de description pour le moment
