# Mathématiques avec Python et Ruby/Fractions en Python
## Ruby

[ Modifier le sommaire ]
L'écriture de nombres non entiers sous forme de fractions a de loin précédé celle des nombres décimaux, puisque les égyptiens et les babyloniens les utilisaient déjà. Chaque fois que le dénominateur n'est pas une puissance de 10, on continue encore de nos jours à utiliser des écritures fractionnaires plus ou moins cachées, comme dans les exemples suivants :
* Lorsqu'on dit qu'un homme mesure 5 pieds 7 pouces, ça signifie que sa taille, en pieds, est $5+{\frac {7}{12}}={\frac {67}{12}}$ (il y a douze pouces dans un pied);
* Lorsqu'on dit qu'il est 8 heures 13, c'est que depuis minuit, il est passé exactement $8+{\frac {13}{60}}={\frac {493}{60}}$ heures (soit 493 minutes).
* Lorsque Roméo se plaint d'avoir attendu Juliette pendant plus de trois quarts-d'heure, il exprime la durée de son attente insoutenable sous la forme d'une fraction...
* Les probabilités se donnent aussi souvent sous forme de fractions (le plus souvent des fractions égyptiennes). Comme dans "j'ai une chance sur 10 millions de recevoir une météorite sur la tête" ou "Casaque Jaune est donné favori à 5 contre 1".
* Idem parfois pour les statistiques : "5 Français sur 7 estiment qu'il y a trop de sondages sur les sondages"...
L'égalité 0,2+0,5=0,7 peut s'écrire ${\frac {1}{5}}+{\frac {1}{2}}={\frac {7}{10}}$ mais l'égalité ${\frac {1}{2}}+{\frac {1}{3}}={\frac {5}{6}}$ ne peut pas s'écrire sous forme décimale exacte parce que le résultat n'est pas décimal. Python affiche 1/2+1/3=0.8333333333333333 et malgré l'abondance de chiffres, cette égalité n'est pas exacte.
Pour faire des calculs exacts avec des fractions, Python a un module fractions.py. Pour transformer Python en un langage de programmation spécialisé dans les fractions, il suffit de précéder les scripts de ce chapitre de la ligne
qui importe le module fractions en entier (pourquoi faire dans le détail?). Une alternative est de chercher le fichier __init__.py, initialement vide, et d'y mettre la ligne précédente.

## Obtention d'une fraction

Pour entrer la fraction ${\frac {n}{d}}$ dans Python, on entre Fraction(n,d) après avoir importé le module fractions :
On constate que la fraction ${\frac {24}{10}}$ a été automatiquement simplifiée par Python au moment de son instanciation.
Si on entre 0 comme dénominateur, la fraction ne se crée pas et on a un message d'erreur : Comme une fraction est un quotient, on ne peut pas diviser par 0.
Une fois qu'une fraction est calculée, on peut obtenir son numérateur et son dénominateur par
Bien entendu, le numérateur de ${\frac {24}{10}}$ n'est pas 24...
Pour obtenir la valeur de la fraction (le quotient de son numérateur par son dénominateur), on peut lui additionner 0.0 : La somme d'une fraction et d'un réel, même nul, est un réel.
Réciproquement, on peut convertir un nombre réel en fraction, mais le résultat est parfois surprenant, si on prend un nombre dont le développement décimal s'arrête alors que le développement binaire ne le fait pas :
On s'attendait à ${\frac {6}{5}}$, on a l'approximation un peu surprenante ${\frac {5404319552844595}{4503599627370496}}$...

## Opérations

Les opérations sur les fractions se notent comme celles sur les autres nombres, mais en général le résultat est une fraction.

### Opérations unaires
#### Opposé

L'opposée d'une fraction s'obtient en la faisant précéder du signe -. Par exemple, la fraction suivante est positive :

#### Inverse

Pour obtenir l'inverse d'une fraction, on divise 1 par celle-ci :

### Addition

La somme de deux fractions est une fraction :

### Soustraction

La différence de deux fractions est une fraction :

### Multiplication

Le produit de deux fractions est une fraction :

### Division

Le quotient de deux fractions est une fraction (à condition que la deuxième ne soit pas nulle) :
Le reste euclidien continue à être défini pour des fractions, et le résultat est une fraction :

### Puissance

Si l'exposant est entier, la puissance d'une fraction est une fraction :
Mais si l'exposant est un réel, la puissance n'est pas une fraction mais un réel :

## Algorithmes
### Réduite de Farey

La création de réduite de Farey est aisée avec le module fractions de Python:
C'est si facile qu'on en vient tout de suite à la question suivante : à quoi ça peut bien servir ?
Si on répond que ça sert à fabriquer un arbre de Stern-Brocot, ça n'éclaire peut-être pas beaucoup, mais disons que ça sert à quelque chose de mathématique...

### Fractions égyptiennes

Une fraction égyptienne est définie comme une somme d'inverses d'entiers. En effet les égyptiens avaient la réputation de ne pas utiliser de numérateurs. Toute fraction peut s'écrire comme une somme de fractions égyptiennes, et l'algorithme de Fibonacci permet d'en trouver un exemple à partir de la fraction. Dans la version Python ci-dessous, l'algorithme fournit une liste de fractions, toutes de numérateur 1, dont la somme est une fraction donnée f. Mais au cas où f serait supérieure à 1, on commence la liste par un entier :
Quelques explications sur le bricolage ci-dessus : Le dénominateur d'une fraction égyptienne est choisi entier (bien sûr) et plus grand que l'inverse de la fraction f (pour que l'algorithme converge). Une solution serait de prendre la troncature int de l'inverse de f et ajouter 1. Mais si l'inverse de f est entier, on ne doit pas ajouter 1 (sinon la suite est infinie). Alors on utilise la fonction ceil. Donc
* Il a fallu importer le module math qui contient cette fonction ceil;
* Du coup l'objet ceil(1/f) n'est plus un entier mais un réel, et ne peut plus être le dénominateur d'une fraction (message d'erreur de Python). Alors il faut convertir ce réel (qui est déjà entier, mais Python ne le sait pas) en entier, ce qui se fait par int.
Enfin, Python ne possédant pas de boucle do..while, il faut ajouter la dernière fraction égyptienne à la liste, pour que celle-ci soit complète.
En lançant le script ci-dessus, on apprend que $1+{\frac {1}{2}}+{\frac {1}{9}}+{\frac {1}{234}}={\frac {21}{13}}$.