WikiPrépaLivrets

Mines Informatique Commune MP PC PSI 2019Sujet, corrigé et rapport du jury

Autour des nombres premiers

2,0(1 vote)
Faisable en Sup
  • 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

Difficile
Informatique commune : algorithmique autour des nombres premiers (crible d'Ératosthène, tests de primalité, calcul de π(n))
Afficher ou masquer la section

Le 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.

  1. 1Partie I : préliminairesQuestions préparatoires sur la représentation des nombres et la complexité.
  2. 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.
  3. 3Partie III : compter les nombres premiersCalcul de π(n) via un crible, estimation par quadrature numérique et via la fonction Ei.
  4. 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ées
Simplification d'une somme géométrique difficile · Mélange entre notations mathématiques et code Python · Erreurs d'arrondi non identifiées
Afficher ou masquer la section

L'é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

  1. 1
    Simplification 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 »
  2. 2
    Mé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 »
  3. 3
    Erreurs 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 »
  4. 4
    Notion 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 »
  5. 5
    Confusion 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 »
  6. 6
    Clé 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

ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARISTECH, TELECOM PARISTECH, MINES PARISTECH, MINES SAINT-ÉTIENNE, MINES NANCY, IMT Atlantique, ENSAE PARISTECH, CHIMIE PARISTECH.

Concours Centrale-Supélec (Cycle International), Concours Mines-Télécom, Concours Commun TPE/EIVP.

CONCOURS 2019

ÉPREUVE D'INFORMATIQUE COMMUNE

Durée de l'épreuve : 1 heure 30 minutes
L'usage de la calculatrice et de tout dispositif électronique est interdit.
Cette épreuve est commune aux candidats des filières MP, PC et PSI
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

Chiffrer les données est nécessaire pour assurer la confidentialité lors d'échanges d'informations sensibles. Dans ce domaine, les nombres premiers servent de base au principe de clés publique et privée qui permettent, au travers d'algorithmes, d'échanger des messages chiffrés. La sécurité de cette méthode de chiffrement repose sur l'existence d'opérations mathématiques peu coûteuses en temps d'exécution mais dont l'inversion (c'est-à-dire la détermination des opérandes de départ à partir du résultat) prend un temps exorbitant. On appelle ces opérations «fonctions à sens unique». Une telle opération est, par exemple, la multiplication de grands nombres premiers. Il est aisé de calculer leur produit. Par contre, connaissant uniquement ce produit, il est très difficile de déduire les deux facteurs premiers.
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 de x.
  • 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 que n ⩽ 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 de 10^(− 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
|x − y| ⩽ atol + |y| × rtol
où atol et rtol sont deux constantes, à définir dans le corps de la fonction, valant respectivement 10^(− 5) et 10^(− 8). Les paramètres x et y sont des nombres quelconques.
◻ Q3 - On donne la fonction mystere ci-dessous. Que renvoie mystere(1001,10) ? Le paramètre x est un nombre strictement positif et b un entier naturel non nul.
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)
L'exécution de ce code produit le résultat :
x1: 1.0
x2: 0.9999999999980838
Commenter.

Partie II. Génération de nombres premiers

II.a Approche systématique

Le crible d'Ératosthène est un algorithme qui permet de déterminer la liste des nombres premiers appartenant à l'intervalle [ [1, n] ]. Son pseudo-code s'écrit comme suit :
Données : N, entier supérieur ou égal à 1
Résultat : liste_bool, liste de booléens
début
liste_bool ⟵ liste de N booléens initialisés à Vrai;
Marquer comme Faux le premier élément de liste_bool;
pour entier i ← 2 à ⌊√N⌋ faire
si i n'est pas marqué comme Faux dans liste_bool alors
Marquer comme Faux tous les multiples de i différents de i dans liste_bool;
fin
fin
retourner liste_bool
fin

Algorithme 1 : Crible d'Ératosthène

À la fin de l'exécution, si un élément de liste_bool vaut Vrai alors le nombre codé par l'indice considéré est premier. Par exemple pour N = 4 une implémentation Python du crible renvoie [False True True False].
  • 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 :
∑_(p < N, p premier)1/p ≃ ln(ln(N))
La réponse devra être justifiée.
  • 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 chiffres n. Donner une approximation du résultat de la question précédente en fonction de n en précisant la base choisie.

II.b Génération rapide de nombres premiers

L'approche systématique qui précède est inefficace car elle revient à attendre d'avoir généré la liste de tous les nombres premiers inférieurs à une certaine valeur pour en choisir ensuite quelques uns au hasard. Une meilleure idée est d'utiliser des tests probabilistes de primalité. Ces tests ne garantissent pas vraiment qu'un nombre est premier. Cependant, au sens probabiliste, si un nombre
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 :
  1. générer un entier pseudo-aléatoire (voir ci-dessous)
  2. vérifier si cet entier a de fortes chances d'être premier
  3. recommencer tant que le résultat n'est pas satisfaisant.
Pour générer un entier pseudo-aléatoire A on se base sur un certain nombre d'itérations de l'algorithme Blum Blum Shub, décrit comme suit. On initialise A à zéro au début de l'algorithme et pour chaque itération ( i ≥ 1 ) on calcule :
x_i = reste de la division euclidienne de x_(i − 1)^2 par M
où M est le produit de deux nombres premiers quelconques et x_0 une valeur initiale nommée «graine» choisie aléatoirement. On utilise ici l'horloge de l'ordinateur comme source pour x_0. Puis, pour chaque x_i, s'il est impair, on additionne 2^i à A.
◻ Q11 - On répète (2) pour i parcourant [ [1, N − 1] ], quelle sera la valeur de A si x_i est impair à chaque itération?
  • 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)
Le test probabiliste de primalité le plus simple est le test de primalité de Fermat. Ce test utilise la contraposée du petit théorème de Fermat qu'on peut évoquer comme suit : si a ∈ [ [2, p − 1] ] est premier et que le reste de la division euclidienne de a^(p − 1) par p vaut 1 , alors il y a de "fortes" chances pour que p soit premier.
◻ Q13 - En combinant les résultats du test de primalité de Fermat pour a = 2, a = 3, a = 5 et a = 7, écrire une fonction premier_rapide(n_max) qui renvoie un nombre aléatoire inférieur strictement à n_max qui a de fortes chances d'être premier. Le paramètre n_max est un entier supérieur à 12 .
Q14 - On souhaite caractériser le taux d'erreurs de premier_rapide.
Écrire une fonction stats_bbs_fermat ( N, nb) qui contrôle pour nb nombres, inférieurs ou égaux à N, générés par premier_rapide, qu'ils sont réellement premiers. Cette fonction renvoie le taux relatif d'erreur ainsi que la liste des faux nombres premiers trouvés. Les paramètres N et nb sont des entiers strictement positifs.

Partie III. Compter les nombres premiers

La question de la répartition des nombres premiers a été étudiée par de nombreux mathématiciens, dont Euclide, Riemann, Gauss et Legendre. On étudie dans cette partie les propriétés de la fonction π(n), qui renvoie le nombre de nombres premiers appartenant à [ [1, n] ].

III.a Calcul de π(n) via un crible

Q15 - Écrire une fonction Pi(N) qui calcule la valeur exacte de π(n) pour tout entier n de [ [1, N] ]. Les nombres premiers sont déduits de la liste liste_bool renvoyée par la fonction erato_iter de la question 8. On demande que Pi(N) renvoie son résultat sous la forme d'une liste de [n, π(n)]. Par exemple Pi(4) renvoie la liste [[1, 0], [2, 1], [3, 2], [4, 2]].
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 .
Il a été prouvé que n/(ln(n) − 1) < π(n) pour tout n ⩾ 5393. On souhaite vérifier cette inégalité en se basant sur la fonction Pi(N) écrite en Question 15.
  • 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ètre N est un entier supposé supérieur ou égal à 5393 .

III.b Calcul d'une valeur approchée de π(n)

Le calcul de π(n) dépend de la capacité à calculer de manière exhaustive tous les nombres premiers de [ [1, N] ], or le temps nécessaire à ce calcul devient rapidement très grand lorsque N augmente. Il existe en revanche diverses méthodes pour calculer une valeur approchée de π(n). Une méthode utilise la fonction logarithme intégral li, dont une représentation graphique est fournie en figure 1. et qui est définie comme :
Figure 1 - Allure de li sur [0,2.5]
li : ℝ^+∖{1}, → ℝ; x, ↦ ∫_0^x(dt)/(ln(t))
Si x > 1, l'intégrale impropre doit être interprétée comme sa valeur principale de Cauchy qui est définie comme :
li(x) = lim_(ε → 0^+)(∫_0^(1 − ε)(dt)/(ln(t)) + ∫_(1 + ε)^x(dt)/(ln(t)))
L'intérêt de li pour compter les nombres premiers vient de la propriété suivante :
lim_(x → ∞)(π(⌊x⌋))/(li(x)) = 1
On souhaite développer un programme permettant de calculer une valeur approchée de li. On compare ensuite les résultats obtenus à une implémentation de référence qui est nommée ref_li, réputée très précise.

Estimation de li par quadrature numérique

On choisit d'utiliser la méthode des rectangles à droite. On appelle pas la base des rectangles. La figure 4 illustre cette méthode appliquée au calcul de la valeur principale définie équation (4).
Par souci de simplification, on suppose que pas est choisi de manière à ce que 1 et x soient multiples de pas et on utilise ε = pas dans l'équation (4).
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 que a < 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éel b − a est un multiple du réel pas.
    Les paramètres a, 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. Si x = 1 la fonction renvoie − ∞. On rappelle qu'on suppose que pas est choisi de manière à ce que 1 et x 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

Après avoir testé li_d on obtient plusieurs résultats surprenants.
Figure 2 - Écart relatif entre li_d (pas = 10^(− 4) ) et l'implémentation de référence ref_li.
Figure 3 - Écart absolu entre li_d (pas = 10^(− 4) ) et l'implémentation de référence ref_li.
  • 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 ordre 1/(ln(1 + ε)) ≃ − 1/(ln(1 − ε)) quand ε → 0 et s'interroger sur la valeur que devrait avoir l'intégrale impropre de 1/(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.
Figure 4 - Rectangles utilisés par la méthode des rectangles à droite au voisinage de 1 afin de calculer la valeur principale de Cauchy introduite dans l'équation (4). Les paramètres sont pas = ε = 10^(− 2)

Estimation de li via Ei

L'approche par quadrature numérique n'est pas satisfaisante. Non seulement elle rend le temps d'exécution de li_d prohibitif quand x augmente mais de plus l'utilisateur doit choisir un pas sans règle claire à appliquer pour garantir une précision donnée. La fonction exponentielle intégrale Ei permet de pallier ce problème.
Ei : ℝ^∗, → ℝ; x, ↦ ∫_(− ∞)^x(e^t)/tdt
Pour le cas x > 0 on utilise la valeur principale de Cauchy telle que vue pour li.
Le lien entre li et Ei est :
li(x) = Ei(ln(x))
Afin d'évaluer numériquement la valeur de Ei en un point on se base sur son développement (dit en série de Puiseux) sur ℝ^(+ ∗) :
Ei(x) = γ + ln(x) + ∑_(k = 1)^∞(x^k)/(k × k!)
Avec γ ≃ 0.577215664901 la constante d'Euler-Mascheroni.
Comme l'évaluation de la somme jusqu'à l'infini est impossible on utilise en pratique la somme suivante :
Ei_n(x) = γ + ln(x) + ∑_(k = 1)^n(x^k)/(k × k!)
Le choix de n se fait en comparant Ei_(n − 1) à Ei_n jusqu'à ce qu'ils soient considérés comme suffisament proches.
L'évaluation via un ordinateur de ce développement est numériquement stable jusqu'à x = 40. Au delà les résultats sont entachés d'erreurs de calcul et d'autres méthodes doivent être utilisées.
  • Q24 - Écrire une fonction li_dev(x) qui calcule l(x) en se basant sur Ei_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) et Ei_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.
Prendre MAXIT = 100 se révèle largement suffisant à l'usage.
On demande à ce que la complexité dans le pire des cas soit O( MAXIT ). Le paramètre x est un flottant quelconque.

Partie IV. Analyse de performance de code

Au cours du développement des fonctions nécessaires à la manipulation des nombres premiers on s'aperçoit que le choix des algorithmes pour évaluer chaque fonction est primordial pour garantir des performances acceptables. On souhaite donc mener des tests à grande échelle pour évaluer les performances réelles du code qui a été développé. Pour ce faire on effectue un grand nombre de tests sur une multitude d'ordinateurs. Les données sont ensuite centralisées dans une base de données composée de deux tables.
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.
Exemple du contenu de cette table :
nom gflops ram
--------- ---------- ---------
nyarlathotep114 69 32
nyarlathotep119 137 32
…
shubniggurath42 133 16
azathoth137 85 8
La seconde table est fonctions et stocke les informations sur les tests effectués pour différentes fonctions en cours de développement. Ses attributs sont :
  • 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.
Exemple du contenu de cette table :
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 :
  1. Connaître le nombre d'ordinateurs disponibles et leur quantité moyenne de mémoire vive.
  2. Extraire les noms des PC sur lesquels l'algorithme rectangles n'a pas été testé pour la fonction nommée li.
  3. 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 questions
Sur quoi porte le sujet d'informatique commune Mines MP-PC-PSI 2019 ?
Afficher ou masquer la section

Sur 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