Mathématiques avec Python et Ruby/Fractions en Ruby

Un livre de Wikilivres.

"Dieu fit le nombre entier, le reste est l’œuvre de l'Homme", disait Leopold Kronecker. Le début du reste ce fut incontestablement les fractions, définies comme quotients d'entiers, et pratiquées bien avant les nombres décimaux.

Obtention d'une fraction[modifier | modifier le wikicode]

Pour entrer la fraction , on peut entrer

a=Rational(24,10)
puts(a)

qui la simplifie automatiquement. Alternativement, on peut charger mathn, ce après quoi le symbole de division donne des fractions au lieu de la division euclidienne:

require 'mathn'
a=24/10
puts(a)

On peut également obtenir une fraction à partir d'un réel, avec la méthode to_r (r comme rational). Mais la fraction n'est correcte que si son dénominateur est une puissance de 2:

a=1.2
b=a.to_r
puts(b)

Certes, mais tout de même...


Propriétés d'une fraction[modifier | modifier le wikicode]

Numérateur[modifier | modifier le wikicode]

Pour avoir le numérateur d'une fraction f, on entre f.numerator:

a=Rational(24,10)
puts(a.numerator)


Dénominateur[modifier | modifier le wikicode]

Pour avoir le dénominateur d'une fraction f, on entre f.denominator:

a=Rational(24,10)
puts(a.denominator)


Valeur approchée[modifier | modifier le wikicode]

Pour avoir la valeur approchée d'une fraction, on convertit celle-ci en un réel:

a=Rational(24,10)
puts(a.to_f)

Opérations sur les fractions[modifier | modifier le wikicode]

Opérations unaires[modifier | modifier le wikicode]

Opposé[modifier | modifier le wikicode]

L'opposé d'un nombre, en particulier d'une fraction, s'obtient en le faisant précéder d'un signe -:

a=Rational(2,-3)
puts(-a)

Inverse[modifier | modifier le wikicode]

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

a=Rational(5,4)
puts(1/a)


Addition[modifier | modifier le wikicode]

Pour additionner deux fractions, on met le signe + entre elles, et le résultat est une fraction (même si celle-ci est entière, comme par exemple ):

a=Rational(34,21)
b=Rational(21,13)
puts(a+b)

Soustraction[modifier | modifier le wikicode]

La différence de deux fractions est une fraction :

a=Rational(34,21)
b=Rational(21,13)
puts(a-b)


Multiplication[modifier | modifier le wikicode]

Le produit de deux fractions est une fraction :

a=Rational(34,21)
b=Rational(21,13)
puts(a*b)


Division[modifier | modifier le wikicode]

Le quotient de deux fractions (à condition que la deuxième ne soit pas nulle) est une fraction :

a=Rational(34,21)
b=Rational(21,13)
puts(a/b)

Et même le reste euclidien est défini entre fractions, et le résultat est encore une fraction :

a=Rational(32,7)
b=Rational(7,2)
puts(a%b)


Exemple[modifier | modifier le wikicode]

On voudrait savoir quel est le rapport des longueurs des tuyaux d'orgue :

  1. Entre un gros Nasard et un Nasard;
  2. Entre un gros Nasard et une grosse Tierce.

Ces rapports sont affichés par Ruby sous forme de fractions, même le premier d'entre eux qui est entier (ce qui ne sautait pas aux yeux !) :

gn=5+Rational(1,3)
n=2+Rational(2,3)
gt=3+Rational(1,5)
puts(gn/n)
puts(gn/gt)

Puissance[modifier | modifier le wikicode]

Une puissance entière (même négative) d'une fraction) est encore une fraction :

a=Rational(3,2)
puts(a**12)
puts(a**(-2))

Mais si l'exposant est décimal, même si le résultat est une fraction, Ruby le considère comme un réel :

a=Rational(9,4)
b=a**0.5
puts(b)
puts(b.to_r)

Algorithmes[modifier | modifier le wikicode]

Réduite de Farey[modifier | modifier le wikicode]

Pour calculer la médiane (ou réduite) de Farey de deux fractions a et b, on définit une fonction Ruby de deux variables, qui s'appelle Farey :

def Farey(a,b)
    n=a.numerator+b.numerator
    d=a.denominator+b.denominator
    return Rational(n,d)
end


a=Rational(3,4)
b=Rational(1,13)
puts(Farey(a,b))

Fractions égyptiennes[modifier | modifier le wikicode]

Pour écrire une fraction à l'égyptienne (comme somme de fractions de numérateur 1), on applique l'algorithme de Fibonacci :

def egypt(f)
    e=f.to_i
    f-=e
    liste=[e]
    begin
        e=Rational(1,(1/f).to_i+1)
        f-=e
        liste.push(e)
    end while f.numerator>1
    liste.push(f)
    return liste
end

require 'mathn'

a=21/13
puts(egypt(a))

On peut résumer ce script Ruby aux étapes suivantes :

  1. On commence par extraire la partie entière de f, pour qu'il reste une fraction inférieure à 1 ;
  2. On soustrait à f (fraction restante) le plus grand inverse d'entier possible...
  3. On s'arrête quand le reste est lui-même un inverse d'entier (autrement dit, on continue tant que son numérateur est plus grand que 1).
  4. On ajoute à la liste, la dernière fraction obtenue.