Parcours
/
WebAssembly
WebAssembly
/
Exercices
/
Nombres rationnels
Nombres rationnels

Nombres rationnels

Moyen

Instructions

Un nombre rationnel est défini comme le quotient de deux entiers a et b, appelés respectivement numérateur et dénominateur, où b != 0.

Note

D'un point de vue mathématique, le dénominateur ne peut pas être nul. Cependant, dans de nombreuses implémentations des nombres rationnels, on constate que le dénominateur peut être nul, avec un comportement semblable à celui de l'infini positif ou négatif des nombres à virgule flottante. Dans ces cas, le dénominateur et le numérateur ne peuvent généralement toujours pas être nuls en même temps.

La valeur absolue |r| du nombre rationnel r = a/b est égale à |a|/|b|.

La somme de deux nombres rationnels r₁ = a₁/b₁ et r₂ = a₂/b₂ est r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂).

La différence de deux nombres rationnels r₁ = a₁/b₁ et r₂ = a₂/b₂ est r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂).

Le produit (la multiplication) de deux nombres rationnels r₁ = a₁/b₁ et r₂ = a₂/b₂ est r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂).

Diviser un nombre rationnel r₁ = a₁/b₁ par un autre r₂ = a₂/b₂ donne r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁) si a₂ n'est pas nul.

L'élévation d'un nombre rationnel r = a/b à une puissance entière non négative n donne r^n = (a^n)/(b^n).

L'élévation d'un nombre rationnel r = a/b à une puissance entière négative n donne r^n = (b^m)/(a^m), où m = |n|.

L'élévation d'un nombre rationnel r = a/b à un nombre réel (à virgule flottante) x donne le quotient (a^x)/(b^x), qui est un nombre réel.

L'élévation d'un nombre réel x à un nombre rationnel r = a/b donne x^(a/b) = root(x^a, b), où root(p, q) est la racine q-ième de p.

Implémente les opérations suivantes :

  • l'addition, la soustraction, la multiplication et la division de deux nombres rationnels,
  • la valeur absolue, l'élévation d'un nombre rationnel donné à une puissance entière, l'élévation d'un nombre rationnel donné à une puissance réelle (à virgule flottante), l'élévation d'un nombre réel à un nombre rationnel.

Ton implémentation des nombres rationnels doit toujours être réduite sous forme irréductible. Par exemple, 4/4 doit se simplifier en 1/1, 30/60 doit se simplifier en 1/2, 12/8 doit se simplifier en 3/2, etc. Pour réduire un nombre rationnel r = a/b, divise a et b par le plus grand commun diviseur (PGCD) de a et b. Ainsi, par exemple, gcd(12, 8) = 4, donc r = 12/8 peut être réduit en (12/4)/(8/4) = 3/2. La forme réduite d'un nombre rationnel doit être sous « forme standard » (le dénominateur doit toujours être un entier positif). Si le dénominateur est un entier négatif, multiplie le numérateur et le dénominateur par -1 pour obtenir la forme standard. Par exemple, 3/-4 doit être réduit en -3/4

Pars du principe que le langage de programmation que tu utilises n'a pas d'implémentation des nombres rationnels.

L'exponentiation de nombres rationnels avec un nombre réel nécessite de calculer un nombre élevé à une puissance non entière, une fonctionnalité qui n'est pas disponible nativement en WebAssembly.

Cependant, on peut aussi exprimer x ^ y sous la forme x ^ y = exp(y * ln(x)).

Et heureusement, on peut utiliser différentes séries pour calculer l'exponentielle et le logarithme népérien.

Fonction exponentielle

La meilleure solution pour l'exponentielle est une série de Taylor :

exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!

Fonction logarithme (pour x positif)

Il existe plusieurs façons de calculer efficacement un logarithme népérien. L'une d'elles est une série basée sur une tangente hyperbolique inverse :

ln(x) / 2 ≃ y + y ^ 3 / 3 + y ^ 5 / 5 + ... + y ^ n / n where y = (x - 1) / (x + 1)

Il existe aussi une autre série de Taylor pour calculer le logarithme népérien :

ln(x) = (x - 1) - (x - 1) ^ 2 / 2 + (x  - 1) ^ 3 / 3 - (x - 1) ^ 4 / 4 ... + (x - 1) ^ n / n

Elle n'est précise que pour x compris entre 0 et 2. Cependant, on peut aussi utiliser ln(x) = - ln(1 / x)

Exponentiation entière

Pour l'exponentiation entière, il vaut mieux utiliser la multiplication et soit une boucle, soit la récursion, à la fois pour des raisons de performance et de précision. Pour gagner en performance, on peut utiliser la méthode de Horner afin de réduire le nombre de multiplications.


Source

WikipediaLe lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
WebAssembly Exercism

Prêt à commencer Nombres rationnels ?

Inscris-toi sur Exercism pour apprendre et maîtriser WebAssembly avec 87 exercices, et un vrai mentorat humain, le tout gratuitement.