Maths, Informatique, Jeux
Site Web réalisé par Frédéric et François WANG
Répertoire principalInformatiqueProgrammationDiversProgrammation de fonctions mathématiques

Sommaire

Introduction

Voilà un sujet bien peu traité dans les tutoriaux de programmation. En effet, la plupart du temps, les auteurs de ces tutoriaux se contentent de donner une liste de fonctions sans rentrer dans les détails, et laissent le lecteur se débrouiller seul.

Pourtant, les fonctions mathématiques sont très utilisées en programmation. La fonction "Reste" peut ainsi servir pour trouver les coordonnées (x ; y) du Nème pixel du image, la racine carrée la distance entre deux pixels de cette image via le fameux théorème de pythagore, tandis que le logarithme permet de convertir un nombre en chaine de caractère...

« Maths, Informatique, Jeux » se devait d'expliquer ces fonctions et de donner un moyen de les "fabriquer" soi-même. C'est ce qui a été fait sur cette page...

Fonctions SNG(x) et ABS(x)

Présentation

La fonction SGN(x) retourne "le signe" de x, c'est à dire -1 si il est strictement négatif, 0 si x est nul et +1 si il est positif. Quant à ABS(x) elle retourne tout simplement la valeur absolue de x (x si x est positif et -x si x est négatif).

Programmons-les !

Est-il nécessaire de vous donner le code source ? C'est à la portée d'un débutant : il suffit de se servir des conditions.

Applications

Elles sont très utilisées, alors je ne vous citerai pas d'exemples particuliers, vous en retrouverez sur cette page ou ailleurs sur notre site comme par exemple sur la page programmation d'instructions graphiques ou lecture d'un mot.

Dans quelques langages

Fonctions d'arrondis

Présentation

Les fonctions d'arrondi sont elles aussi très utilisées. Comme leur nom l'indique, elle retourne l'arrondi d'un nombre. Il y en a trois principales :

Programmons-les !

Lorsque l'on parle d'arrondir un nombre, on a intuitivement l'idée "d'enlever les virgules" de ce nombre. Cependant en terme de programmation, cela se révèle plus difficile. De manière simple on pourrait faire une boucle qui rechercherai l'entier le plus proche de x mais cela prendrait du temps pour les grands nombres.

Pour fabriquer les fonctions d'arrondis, il faut repenser à ce qui est dit dans Le codage des informations : le codage du type "nombre décimal" est différent de celui du type "nombre entier". L'arrondi se voit alors comme une conversion d'un type "nombre décimal" en un type "nombre entier". Mais pour effectuer cette opération, il faut connaitre comment sont codés exactement ces types, donc je ne le ferais pas car je ne connait pas leur codage en javascript (d'ailleurs on ne peut pas choisir le type d'une donnée en javascript).

Heuresement, chaque langage a en général des fonctions d'arrondis intégrés dans ses fonctions standards (voir plus loin "Dans quelques langages"), donc vous n'aurez pas besoin de les créer.

Applications

Je pense que vous voyez tout de suite leur intérêt. Citons tout de même un exemple : je vous laisse vous convaincre de l'équivalence suivante.

b a a b = a b

Dans quelques langages

Fonction reste(a,b)

Présentation

Cette fonction retourne le reste de la division euclidienne de deux entiers.

Dans l'ensemble on définit la division Euclidienne ainsi :
« Soient a et b deux entiers ( b 0 ), alors il existe deux entiers uniques q et r tels que a = b q + r et r < b . »
Cette écriture montre qu'on soustrait q fois le nombre b à l'entier a et qu'à la fin il reste un nombre r qui est le reste recherché (on peut d'ailleurs retenir cette première méthode pour la programmation de notre fonction reste(a,b)).

Maintenant, en programmation, on utilise la fonction reste(a,b) dans . Pour la définir, on se sert des valeurs absolues pour comparer b et r :
« Soient a et b deux entiers ( b 0 ), alors il existe deux entiers q et r tels que a = b q + r et r < b . »

a = b × q + r

a = b × q + r

a = b × q r

a = b × q r

On remarque que alors que reste(a,b) = SGN(a) × reste(|a|,|b|) (SNG(a) retourne le signe de a, cette fonction a été citée plus haut). Si on a trouvé un algorithme pour calculer le reste de deux entiers naturels (ce qui a été plus ou moins expliqué dans le premier paragraphe), on a alors du même coup un algorithme pour calculer le reste de deux entiers relatifs grâce à l'égalité que l'on vient de trouver.

Programmons-la !

Voici donc la première idée de programmation (en javascript) pour la fonction :
function reste(a,b)
{
/* reste(a,b) pour |Z */
if(a<0||b<0)return SGN(a) * reste(Math.abs(a),Math.abs(b));

/* reste (a,b) pour |N */
while(!(a<b))a-=b;// on soustrait plusieurs fois b de a
return a;// à la fin a<b, le nombre a est devenu le reste.
}

Maintenant il y a une deuxième méthode pour programmer reste(a,b) pour qui évite de faire une boucle. D'abord, on montre que q est l'arrondi par défaut de a/b :

a = bq + r et r < b | a = bq + r et r ≥ 0 
a < bq + b          | a ≥ bq
a < (q + 1)b        | q ≤ a/b
a/b < q + 1         | 
a/b - 1 < q         |

Et finalement : a/b - 1 < q ≤ a/b
Or, il n'y a qu'un nombre entier qui réponde à cet encadrement, c'est le nombre q = arrondi_par_defaut(a/b). Après avoir trouvé q , on peut calculer le reste : r = a b q . Ce qui nous donne cette fonction plus compacte que la première :
function reste(a,b)
{
if(a<0||b<0)return SGN(a) * reste(Math.abs(a),Math.abs(b));
return a - b * Math.floor(a/b);
}

Applications

Reprenons l'exemple cité dans l'introduction : on désire connaitre les coordonnées du Nème pixel d'une image de dimensions Lx × Ly. Ces coordonnées sont (reste(N,Lx) ; arrondi_par_defaut(N/Lx)).

Une autre méthode pour savoir si a est divisible par b : il faut que reste(a,b)=0.

Dans quelques langages

Fonction factorielle

Présentation

La fonction factorielle(n) retourne la factorielle de n, c'est à dire le produit (noté n!) des n premiers entiers : 1 × 2 × 3 × ... × n. Cette fonction utilisée en combinatoire, correspond au nombre de permutations de n objets, c'est à dire de manière différente de les ordonner. Lorsque n = 0, il n'y a qu'une seule manière de ranger ces objets donc 0! = 1.

Bien qu'elle soit souvent présente dans les tutoriaux de programmation pour illustrer les fonctions récursives (qui s'appellent elles même), je ne crois pas qu'elle soit énormément utilisée en programmation.

Programmons-la !

Il y a deux approches possibles : "la boucle" et "la fonction récursive". Je vous laisse les comparer. Vous pouvez rentrer des nombres entier de 0 à 170, au delà, les fonctions retourne "infinity". Et pour la fonction récursive elle provoque une erreur pour un n trop élevé car elle s'est appelée trop de fois (n'essayez pas sinon vous aurez à réactualiser la page pour que les script fonctionnent).

/* Boucle de calcul */
function fact(n)
{
for(a=1,f=1;a<n+1;f*=a,a++);
return f;
}
/* Fonction récursive */
function fact(n)
{
if(n>0)return n*fact(n-1); else return 1;
}

Applications

Comme je l'ai dit plus haut, je n'en ai pas eu souvent besoin. Elle sert en combinatoire pour calculer le nombre de permutations, d'arrangements et de combinaisons. C'est d'ailleurs grâce ces dernières, nécessaires pour le calcul du binôme de Newton, que je me suis servi de la fonction factorielle.

Dans quelques langages

Ce que j'ai dit à propos de l'utilisation de la fonction semble se confirmer puisqu'il ne parait pas y avoir beaucoup de langages qui l'inclussent dans leurs fonctions standards. Je n'ai rien trouvé dans l'aide du QBASIC, rien non plus avec mon compilateur C et je n'ai pas vu de tutorial sur l'objet Math du javascript qui en parle.

Fonction puissance

Présentation

La fonction puissance(x,y) retourne le nombre décimal x élevé à la puissance y. Si elle est relativement facile à programmer lorsque y est un nombre entier, on se heurte à quelques difficultés lorsque ce n'est pas le cas. Je donnerai donc les explications en même temps que la programmation pour permettre de comprendre la fonction pas à pas. Cette approche est un bon moyen pour étudier «l'analyse descendante » (voir partie structure d'un programme).

Cependant, pour éviter de charger la page et à cause du fait qu'il faille s'y connaitre un peu en maths pour comprendre la partie programmation, j'ai placé la partie programmation sur une autre page.

Programmons-la !

Vous pouvez accéder à la page de programmation, ou directement

Application

Comme cité dans l'intro, elle peut être utilisée pour calculer la distance entre deux points. Pour les deux points A(x_A ; y_A) et B(x_B ; y_B), on a :

AB=puissance(puissance(x_B-x_A,2)+puissance(y_B-y_A,2),.5)
On voit que l'on s'en sert à la fois pour calculer le carré et la racine carré d'un nombre.

Dans quelques langages

Cette page est conforme aux normes du W3C - Auteur : Frédéric WANG - Dernière mise à jour : jeudi 8 juillet 2003
Valid XHTML 1.1 Valid MathML 2.0 Valid SVG Valid CSS Amaya, the W3C browser/editor Déclaration qualité Opquast Foxkeh banners for Firefox 2