ITSkillsCenter
Développement Web

Mathématiques appliquées à l’informatique : le socle pratique

22 دقائق للقراءة

Beaucoup de développeurs traversent des années de carrière sans poser le mot « mathématiques » sur ce qu’ils font. Et pourtant, dès qu’on gratte un peu, les structures mathématiques sont partout : dans les conditions d’un if, dans le JOIN d’une requête SQL, dans le moteur de cache d’un CDN, dans le moteur de recommandation d’une boutique en ligne, dans la signature d’un certificat TLS. Ce guide trace la cartographie du socle mathématique réellement utile à l’informatique appliquée — celui qu’on retrouve dans le code de production, pas celui qu’on revoit la veille d’un examen et qu’on oublie ensuite. Pour chaque grand domaine, on précise à quoi il sert concrètement, dans quelles bibliothèques on le retrouve, et où aller chercher un tutoriel pas-à-pas pour passer de la théorie au code.

Sommaire

Le socle mathématique du développeur Logique conditions, requêtes Ensembles & relations SQL, structures Graphes réseaux, dépendances Probabilités A/B test, p99 Algèbre linéaire ML, vecteurs, NumPy Arith. modulaire RSA, TLS, hash six terrains, six familles d’algorithmes, un même langage formel
Vue d’ensemble des six grands terrains mathématiques abordés dans ce guide.

Pourquoi un développeur ne peut pas y échapper

L’informatique n’est pas née d’un besoin de calcul arithmétique, mais d’une réflexion mathématique sur ce qu’est un calcul. Alan Turing publie en 1936 son article On Computable Numbers, with an Application to the Entscheidungsproblem, où il décrit une machine abstraite — la machine de Turing — qui pose les bases théoriques de tout ce qu’un ordinateur peut, et ne peut pas, calculer. La même année, Alonzo Church introduit le lambda-calcul, modèle équivalent en pouvoir de calcul. L’ordinateur, avant d’être un objet physique, est d’abord une question mathématique : que peut-on, et que ne peut-on pas calculer mécaniquement ?

Près d’un siècle plus tard, ce socle n’a pas disparu. Quand un développeur écrit une boucle while, il manipule de la logique. Quand il modélise une base de données relationnelle, il s’appuie sur la théorie des ensembles et le calcul relationnel formalisés par Edgar F. Codd dans son article fondateur de 1970 A Relational Model of Data for Large Shared Data Banks. Quand il code un moteur de recherche interne, il manipule des graphes. Quand il optimise une requête SQL ou un algorithme de tri, il raisonne sur la complexité algorithmique. La différence entre un développeur opérationnel et un développeur senior tient souvent moins à sa connaissance d’un framework qu’à sa capacité à reconnaître, derrière un problème industriel, le squelette mathématique qui permet de le résoudre proprement.

L’objectif de ce guide n’est pas de redonner un cours universitaire, mais d’aller à l’essentiel : pour chaque domaine, le minimum vital pour le code, les pièges classiques, et les pointeurs vers les tutoriels pas-à-pas qui prolongent la lecture. Chaque grand domaine est introduit ici, puis approfondi dans un tutoriel dédié avec exercices et code testé.

La logique : la grammaire silencieuse de tout programme

La logique propositionnelle et la logique booléenne sont les fondations sur lesquelles s’appuient les conditions, les requêtes, et la moitié des bugs subtils en production. Une expression booléenne combine des variables vraies ou fausses à l’aide d’opérateurs ET (∧, &&), OU (∨, ||), NON (¬, !), IMPLIQUE (→) et XOR (⊕). Les lois de De Morgan, énoncées par Augustus De Morgan au XIXe siècle, indiquent que ¬(A ∧ B) ≡ ¬A ∨ ¬B et ¬(A ∨ B) ≡ ¬A ∧ ¬B. Ce sont elles qui permettent, par exemple, de réécrire if (!(user.isAdmin && user.isActive)) en if (!user.isAdmin || !user.isActive) sans changer le comportement.

En 1854, George Boole publie An Investigation of the Laws of Thought, où il algébrise la logique. Près d’un siècle plus tard, Claude Shannon montre dans son mémoire de master au MIT (soumis en août 1937, publié en 1938 sous le titre A Symbolic Analysis of Relay and Switching Circuits) que cette algèbre permet de concevoir des circuits électriques. C’est le moment de bascule qui ouvre la voie à toute l’électronique numérique. Aujourd’hui, dès qu’on écrit une condition complexe, on manipule une expression qu’un compilateur ou un optimiseur SQL va simplifier en interne avec ces lois. Maîtriser les tables de vérité et les techniques de simplification (tableaux de Karnaugh, lois d’absorption, formes normales conjonctives et disjonctives) permet d’écrire des conditions plus lisibles, donc moins buguées.

Pour le pas-à-pas pratique avec exercices et exemples en Python et JavaScript, voir le tutoriel dédié Logique booléenne pour développeurs : tables de vérité, simplification et code.

Théorie des ensembles et relations : les structures invisibles des données

Une base de données relationnelle n’est pas un terme marketing : Codd a démontré qu’une table est une relation au sens mathématique — un sous-ensemble du produit cartésien des domaines de ses colonnes. Une jointure est une intersection projetée, un UNION est une union ensembliste, un EXCEPT une différence. Les opérateurs SQL traduisent presque mot pour mot l’algèbre relationnelle, ce qui explique pourquoi un même résultat peut être obtenu par plusieurs requêtes équivalentes : l’optimiseur du moteur de base de données les ramène à une forme canonique avant d’exécuter.

La théorie des ensembles dépasse les SGBD. Les types Set et Map qu’on retrouve dans la bibliothèque standard de la plupart des langages reposent dessus. Un HashSet Java, un set Python, un Map<K, V> TypeScript : tous matérialisent en structures de données concrètes des concepts formalisés par Georg Cantor à la fin du XIXe siècle. Comprendre la différence entre une relation d’équivalence (réflexive, symétrique, transitive) et un ordre partiel aide à reconnaître quand un graphe doit être trié topologiquement, ou quand un cache doit dédupliquer en se basant sur une clé canonique.

Trois opérations méritent une attention particulière côté code : l’intersection (utile pour calculer « les utilisateurs qui ont acheté ce produit et lu cet article »), la différence (utile pour les déduplications incrémentales et les diffs de versions), et le produit cartésien (à manipuler avec précaution — il fait exploser la cardinalité, et beaucoup d’incidents de performance SQL viennent d’un JOIN accidentellement transformé en produit cartésien par une condition manquante). Les inclusions et les complémentaires interviennent dès qu’on raisonne sur des permissions, des filtres ou des règles métier qui s’expriment en termes d’appartenance.

Combinatoire : compter sans énumérer

La combinatoire répond à la question « combien y en a-t-il ? ». Combien de permutations possibles pour un mot de passe à 8 caractères imprimables ? Combien de chemins distincts dans un graphe ? Combien de paniers d’achat possibles pour un client qui choisit 3 articles parmi 50 ? Sans combinatoire, on tombe vite dans le piège de générer toutes les combinaisons pour les compter, ce qui devient infaisable au-delà d’une vingtaine d’éléments.

Trois formules à garder en tête. Les permutations de n objets distincts sont n!. Les arrangements de k objets parmi n, où l’ordre compte, sont n! / (n−k)!. Les combinaisons de k parmi n, où l’ordre n’importe pas, sont n! / (k! × (n−k)!), notées C(n,k) ou (n choose k). La factorielle croît plus vite que toute exponentielle : 20! vaut exactement 2 432 902 008 176 640 000, soit environ 2,43 × 1018. Cela rend impraticable une recherche par force brute sur des permutations de 20 éléments ou plus, même en distribué.

En pratique, la combinatoire intervient pour estimer la complexité d’un algorithme combinatoire (problème du voyageur de commerce, sac à dos, coloration de graphe), pour dimensionner un espace de clés cryptographiques, ou pour calculer une probabilité. Beaucoup d’optimisations algorithmiques (programmation dynamique, branch and bound, mémoïsation) reposent sur la capacité à éviter d’énumérer un espace combinatoire que l’on peut majorer en amont. Les coefficients binomiaux et le triangle de Pascal apparaissent dans tellement d’analyses de probabilités et d’algorithmes qu’ils méritent leur propre fonction utilitaire dans la boîte à outils mentale du développeur.

Théorie des graphes : modéliser tout ce qui se connecte

Un graphe est un couple (V, E)V est un ensemble de sommets et E un ensemble d’arêtes reliant ces sommets. Cette structure est partout dès qu’on modélise des relations : un réseau social (utilisateurs et amitiés), un système de fichiers (dossiers et liens symboliques), une infrastructure (serveurs et flux réseau), un graphe de dépendances (paquets npm, pip ou cargo), un compilateur (graphe de flot de contrôle, graphe d’appels), un moteur de routage GPS (carte routière).

Graphe pondéré — exemple 4 2 5 1 3 7 A B C D E 5 sommets, 6 arêtes pondérées — Dijkstra(A→E) = A→C→D→E (poids 6)
Un graphe pondéré minimal sur lequel illustrer Dijkstra et BFS.

L’origine du domaine est canonique : Leonhard Euler résout en 1735 le problème des sept ponts de Königsberg en montrant qu’aucun parcours ne peut emprunter chaque pont une et une seule fois. Sa solution, présentée à l’Académie de Saint-Pétersbourg le 26 août 1735 puis publiée sous le titre Solutio problematis ad geometriam situs pertinentis, fonde la théorie des graphes. Trois siècles plus tard, ses successeurs ont produit les algorithmes que les développeurs utilisent quotidiennement.

Les trois parcours fondamentaux à connaître. Le parcours en largeur (BFS) visite les voisins immédiats avant d’explorer plus loin, et trouve le plus court chemin en nombre d’arêtes dans un graphe non pondéré. Le parcours en profondeur (DFS) explore une branche jusqu’au bout avant de remonter, et sert au tri topologique, à la détection de cycles et au calcul de composantes fortement connexes. L’algorithme de Dijkstra, publié dans A Note on Two Problems in Connexion with Graphs (Numerische Mathematik 1, 1959), calcule le plus court chemin dans un graphe pondéré à arêtes positives. La complexité de BFS et DFS est O(V + E). Implémenté avec un tas binaire (file de priorité), Dijkstra atteint O((V + E) log V).

Les bibliothèques modernes encapsulent ces algorithmes — networkx en Python, JGraphT en Java, igraph en R et Python — mais comprendre leur logique reste indispensable pour choisir la bonne structure de données et reconnaître quand un problème industriel se ramène à un parcours de graphe. Un cas classique en production : la résolution d’ordre de démarrage de microservices revient à un tri topologique sur le graphe orienté acyclique des dépendances. Pour la mise en pratique avec code testé, voir le tutoriel Théorie des graphes en pratique : modéliser, BFS, DFS et Dijkstra.

Probabilités et statistiques : raisonner sous incertitude

Dès qu’un système réel reçoit des données qui ne sont pas parfaitement déterminées, les probabilités et les statistiques entrent en scène. Détection d’anomalies sur un flux de logs, A/B testing pour comparer deux versions d’une page, estimation du taux d’erreur d’un classificateur, calcul de la latence p99 d’une API, dimensionnement d’un cache pour minimiser les défauts : tous reposent sur le raisonnement probabiliste.

Quatre concepts forment le minimum vital. La distribution de probabilité décrit comment les valeurs se répartissent (uniforme, normale, exponentielle, Poisson, géométrique). L’espérance et la variance résument respectivement la valeur moyenne attendue et l’étalement autour de cette moyenne ; ce sont les deux premiers paramètres qui caractérisent presque tous les phénomènes stochastiques rencontrés en pratique. La probabilité conditionnelle P(A|B) mesure la probabilité que A se produise sachant que B s’est produit ; elle conduit au théorème de Bayes, énoncé par Thomas Bayes au XVIIIe siècle, qui formalise la mise à jour d’une croyance à la lumière d’une nouvelle information. C’est lui qui sous-tend les classificateurs naïfs bayésiens, les filtres anti-spam historiques, et beaucoup de systèmes de recommandation et de scoring.

Côté statistiques inférentielles, les notions de test d’hypothèse, d’intervalle de confiance et de p-value sont indispensables pour interpréter correctement un résultat expérimental. Une erreur classique : conclure qu’une nouvelle version d’une fonctionnalité est meilleure parce que l’A/B test affiche +1,2 % de conversion, sans vérifier que cet écart est statistiquement significatif compte tenu de la taille de l’échantillon. La p-value, contrairement à une lecture trop rapide, n’est pas la probabilité que l’hypothèse nulle soit vraie : c’est la probabilité d’observer un résultat aussi extrême en supposant que l’hypothèse nulle l’est. Cette nuance change tout dans la prise de décision produit.

Algèbre linéaire : la langue des données massives

L’algèbre linéaire manipule des vecteurs (listes ordonnées de nombres) et des matrices (tableaux rectangulaires de nombres). Cette structure est devenue omniprésente avec l’essor du big data et de l’apprentissage automatique : une image en niveaux de gris est une matrice de pixels, une image couleur un tenseur d’ordre 3, un texte vectorisé un vecteur creux, un ensemble de transactions clients une matrice utilisateurs × produits. Tous les modèles modernes (régression linéaire, régression logistique, réseaux de neurones, transformeurs) reposent sur des opérations matricielles.

Trois opérations dominent. Le produit scalaire ⟨u, v⟩ = Σ ui × vi mesure la similarité entre deux vecteurs ; c’est le cœur du moteur de recommandation par cosinus, et de la couche dense d’un réseau de neurones. Le produit matriciel C = A × B est l’opération sur laquelle reposent la plupart des frameworks de calcul scientifique. La décomposition en valeurs singulières (SVD) permet d’extraire les directions principales d’un nuage de données et fonde l’analyse en composantes principales (PCA), utilisée pour la réduction de dimensionnalité et la compression d’information.

NumPy, en Python, est la bibliothèque de référence. Sa fonction numpy.dot ou l’opérateur @ exécute un produit matriciel en s’appuyant sur des routines BLAS (Basic Linear Algebra Subprograms) écrites en C ou en Fortran, qui exploitent les instructions SIMD du processeur. Comprendre que for i in range(n): for j in range(n): ... en Python pur est typiquement cent fois plus lent qu’un appel A @ B vectorisé est l’un des leviers de performance les plus rentables dans une carrière de développeur. Les frameworks d’apprentissage profond (PyTorch, TensorFlow, JAX) reprennent cette philosophie en l’étendant aux GPU et aux TPU, avec des temps d’exécution accélérés d’un ou deux ordres de grandeur supplémentaires sur les opérations matricielles massives. Pour le pas-à-pas avec NumPy et exemples, voir Algèbre linéaire pour développeurs : vecteurs, matrices et NumPy en pratique.

Arithmétique modulaire et théorie des nombres : la base de la cryptographie

L’arithmétique modulaire travaille avec les classes de restes modulo un entier n. Quand on écrit 7 mod 3 = 1, on dit que 7 et 1 appartiennent à la même classe modulo 3. Cette structure, en apparence anecdotique, fonde toute la cryptographie asymétrique moderne : RSA repose sur la difficulté de factoriser un grand entier en produit de deux nombres premiers, et la cryptographie sur courbes elliptiques sur la difficulté du logarithme discret dans certains groupes finis.

Trois résultats sont à connaître. Le petit théorème de Fermat énonce que pour un nombre premier p et un entier a non divisible par p, ap−1 ≡ 1 (mod p). Le théorème d’Euler généralise ce résultat à un module quelconque n avec la fonction indicatrice φ(n). L’algorithme d’Euclide étendu calcule l’inverse modulaire, indispensable au déchiffrement RSA et à la résolution d’équations diophantiennes.

La signature numérique d’un certificat TLS, la dérivation d’une clé partagée par échange Diffie-Hellman, l’authentification d’un commit Git signé : toutes ces opérations s’appuient sur l’arithmétique modulaire exécutée sur de très grands nombres (typiquement 2048 à 4096 bits pour RSA aujourd’hui, 256 bits pour les courbes elliptiques courantes comme secp256r1 ou Curve25519). Comprendre le pourquoi mathématique de ces choix permet d’éviter les pièges classiques : utiliser une clé RSA de 1024 bits en 2026 (devenue insuffisante face aux capacités actuelles), réutiliser un nonce dans un protocole, mal initialiser un générateur pseudo-aléatoire. Pour le pas-à-pas avec implémentation en Python, voir Arithmétique modulaire pour développeurs : du modulo à RSA en code.

Analyse de complexité : prédire le coût d’un algorithme

La notation O, introduite par Paul Bachmann dans le second volume de son Analytische Zahlentheorie (1894) puis popularisée par Edmund Landau en 1909, a été adoptée en informatique par Donald Knuth dans les années 1970 pour décrire le comportement asymptotique d’un algorithme. O(f(n)) signifie que le coût de l’algorithme, pour une entrée de taille n suffisamment grande, est borné supérieurement par une constante fois f(n).

Classes de complexité — coût en fonction de n taille de l’entrée n opérations O(1) O(log n) O(n) O(n log n) O(n²) O(2ⁿ)
L’écart entre O(n log n) et O(n²) s’accentue dès quelques milliers d’éléments — c’est ce qui sépare un produit utilisable d’un produit qui rame.

Les classes courantes, par ordre croissant de coût : O(1) constant (accès à un tableau par index, insertion dans une table de hachage en moyenne), O(log n) logarithmique (recherche dans un arbre binaire équilibré, recherche dichotomique), O(n) linéaire (parcours d’une liste, recherche d’un élément maximum), O(n log n) (tri par comparaison optimal — c’est le cas de mergesort, heapsort et quicksort dans son cas moyen), O(n²) quadratique (tri à bulles, double boucle imbriquée, certaines requêtes SQL mal indexées), O(2n) exponentielle (énumération de tous les sous-ensembles), O(n!) factorielle (énumération de toutes les permutations).

Une borne inférieure classique : tout algorithme de tri qui ne fait que comparer des éléments deux à deux a une complexité d’au moins Ω(n log n) dans le pire cas. C’est un résultat démontré (l’arbre de décision a une hauteur d’au moins log2(n!)), pas une convention. À l’inverse, le tri par comptage et le tri radix peuvent atteindre O(n), mais à condition d’exploiter la structure des données (entiers bornés, longueurs fixes). Reconnaître la classe de complexité d’un code juste en le lisant est l’un des réflexes les plus rentables qu’un développeur puisse acquérir : il sépare le code qui passe à l’échelle de celui qui s’effondre dès la première mise en charge sérieuse. Pour la pratique avec mesures et benchmarks, voir Notation big-O et analyse de complexité : mesurer le coût d’un algorithme.

Calcul différentiel pour l’apprentissage automatique

Quand un réseau de neurones apprend, il ajuste ses paramètres pour réduire une fonction d’erreur (la loss). Cette descente repose sur le gradient : un vecteur qui pointe dans la direction de plus forte croissance de la fonction. La descente de gradient, popularisée en informatique par les travaux de Cauchy au XIXe siècle puis adaptée à l’apprentissage statistique au XXe, met à jour itérativement les paramètres θ selon θt+1 = θt − η × ∇L(θt), où η est le taux d’apprentissage.

Le calcul différentiel sert également à comprendre la convergence : une fonction convexe a un unique minimum global atteignable par descente de gradient, alors qu’une fonction non convexe peut piéger l’algorithme dans des minima locaux. La rétropropagation, fondamentale pour entraîner les réseaux profonds, n’est qu’une application répétée de la règle de la chaîne ((f ∘ g)' = f'(g) × g') le long des couches du réseau, calculée efficacement par les frameworks modernes (PyTorch, TensorFlow, JAX) via la différentiation automatique.

Sans connaître les démonstrations rigoureuses, comprendre intuitivement ce qu’est une dérivée (la pente d’une fonction en un point), un gradient (sa généralisation à plusieurs variables) et une différentielle (l’approximation locale linéaire) suffit pour lire la documentation des principaux frameworks d’apprentissage automatique et pour interpréter une courbe de perte d’entraînement. La connaissance plus approfondie (matrice hessienne, méthodes de Newton, optimiseurs comme Adam ou L-BFGS) devient utile dès qu’on passe du statut d’utilisateur de modèles à celui de concepteur.

Erreurs fréquentes à éviter quand on (re)met le pied dans les maths

Erreur Cause Solution
Vouloir tout réviser avant de commencer Peur de manquer un prérequis Choisir un domaine appliqué et apprendre les concepts au fil des besoins, pas dans l’ordre du manuel
Confondre p-value et probabilité que H₀ soit vraie Mauvaise vulgarisation héritée Lire la définition exacte : probabilité d’observer un résultat aussi extrême sachant H₀
Implémenter en Python pur des opérations matricielles Habitude des boucles Vectoriser avec NumPy, ou utiliser un framework dédié comme PyTorch ou JAX
Ignorer la stabilité numérique Confondre maths exactes et arithmétique flottante Connaître les pièges : addition de très petits nombres, soustraction de proches, division par presque zéro
Sous-estimer la complexité Tester sur de petites entrées seulement Mesurer avec un profileur sur des entrées réalistes et tracer le coût en fonction de n
Confondre corrélation et causalité Lecture trop rapide d’une statistique Vérifier la causalité par expérimentation contrôlée, pas seulement par observation
Réutiliser un nonce ou un sel Méconnaissance de l’arithmétique modulaire et des hypothèses de sécurité Toujours générer un aléa neuf par opération critique avec un CSPRNG

FAQ

Faut-il être bon en mathématiques pour devenir développeur ?

Non, pas au sens scolaire. Pour la majorité des postes (développement web, mobile, applications métier), un niveau correct en logique et en raisonnement suffit. La maîtrise des structures mathématiques devient critique surtout pour les rôles spécialisés : data engineer, data scientist, ingénieur en sécurité, développeur de moteurs de recherche, architecte big data, chercheur en apprentissage automatique, ingénieur en performance et calcul scientifique.

Quelles mathématiques sont indispensables pour la data et l’apprentissage automatique ?

Trois socles minimum : algèbre linéaire (vecteurs, matrices, produit scalaire, valeurs propres), probabilités et statistiques (distributions, espérance, variance, tests d’hypothèse), et calcul différentiel (gradient, descente de gradient, règle de la chaîne). On peut commencer avec un niveau d’introduction et approfondir au fil des modèles utilisés.

Quelles mathématiques pour la cybersécurité ?

L’arithmétique modulaire et la théorie des nombres sont au cœur de la cryptographie asymétrique. La théorie de l’information et l’entropie de Shannon servent à mesurer la qualité des clés et des mots de passe. Les probabilités servent au calcul des risques et à l’analyse statistique du trafic réseau. Les graphes interviennent dans la modélisation des réseaux et la propagation des attaques.

Faut-il apprendre les mathématiques avant ou pendant le code ?

La progression la plus efficace consiste à apprendre en alternance : un concept mathématique, puis une mise en application immédiate en code. C’est la philosophie des tutoriels associés à ce guide — chaque domaine est accompagné d’un pas-à-pas qui transforme la théorie en programme exécutable, avec exercices et cas concrets.

Quelle différence entre mathématiques discrètes et mathématiques continues en informatique ?

Les mathématiques discrètes (logique, ensembles, combinatoire, graphes, arithmétique modulaire) dominent l’informatique théorique et les algorithmes classiques. Les mathématiques continues (analyse réelle, calcul différentiel, intégration) prennent le relais dès qu’on touche au traitement du signal, à l’apprentissage automatique, à la simulation numérique ou à l’infographie 3D. Les deux sont complémentaires et non concurrentes.

Existe-t-il des ressources gratuites sérieuses pour reprendre les bases ?

Oui. Les cours en ligne du MIT OpenCourseWare (notamment 6.042J Mathematics for Computer Science), les manuels de Donald Knuth (The Art of Computer Programming), le manuel Mathematics for Computer Science de Lehman, Leighton et Meyer disponible librement sur le site du MIT, et la documentation officielle de NumPy, SymPy et SciPy constituent un parcours sérieux et gratuit.

Combien de temps pour atteindre un niveau professionnel ?

Avec deux à trois heures par semaine consacrées à un domaine ciblé (par exemple algèbre linéaire pour l’apprentissage automatique), on atteint un niveau opérationnel en trois à quatre mois. La maîtrise de plusieurs domaines simultanément demande typiquement un à deux ans, en alternance avec la pratique en projet réel.

Ressources et références

  • Lehman, Leighton, Meyer — Mathematics for Computer Science, MIT (PDF en libre accès) : ocw.mit.edu/courses/6-042j
  • Donald Knuth — The Art of Computer Programming, Addison-Wesley
  • Cormen, Leiserson, Rivest, Stein — Introduction to Algorithms (CLRS), MIT Press
  • Documentation officielle NumPy : numpy.org/doc/stable/
  • Documentation officielle SciPy : docs.scipy.org/doc/scipy/
  • Documentation officielle NetworkX : networkx.org/documentation/stable/
  • Edsger W. Dijkstra — A Note on Two Problems in Connexion with Graphs, Numerische Mathematik 1, 269-271 (1959)
  • Alan Turing — On Computable Numbers, with an Application to the Entscheidungsproblem, Proceedings of the London Mathematical Society (1936)
  • Claude Shannon — A Symbolic Analysis of Relay and Switching Circuits, MIT (1937, publié 1938)
  • Edgar F. Codd — A Relational Model of Data for Large Shared Data Banks, Communications of the ACM, 13(6), 377-387 (1970)
  • Leonhard Euler — Solutio problematis ad geometriam situs pertinentis, Commentarii academiae scientiarum Petropolitanae 8, 128-140 (1741, présenté en 1735)

Mots-clés associés : mathématiques informatique, algèbre linéaire programmation, théorie des graphes développeurs, complexité algorithmique, arithmétique modulaire cryptographie, probabilités statistiques code, calcul différentiel apprentissage automatique.

Sponsoriser ce contenu

Cet emplacement est à vous

Position premium en fin d'article — c'est l'instant où les lecteurs sont le plus engagés. Réservez cet espace pour votre marque, votre formation ou votre offre.

Recevoir nos tarifs
Publicité