Python en mathématiques - Défis

La simplification du cancre

La simplification du cancre

Un cancre doit simplifier la fraction $\frac{16}{64}$. Il "raisonne" ainsi: $\frac{1{\not{6}}}{{\not{6}}4} = \frac{1}{4}$.

  • Vérifier que le résultat est correct dans ce cas.
  • Donner une autre fraction pour laquelle cette façon de procèder ne donnera pas un résultat correct.
  • Montrer qu'il existe une infinité de couples d'entiers $(a;b)$ pour lesquels une simplification de ce type fonctionne.
  • Question 1
  • Question 2
  • Question 3

$\frac{16}{64} = \frac{16\times 1}{16 \times 4} = \frac{1}{4}$.

Par exemple $\frac{25}{24}$ n'est pas égale à $\frac{5}{4}$.

Si le chiffre des unités de $a$ ($a\neq 0$) est 0 ainsi que le chiffre des unités de $b$, barrer ce chiffre 0 donne un résultat correct. Il y a donc une infinité de couples $(a;b)$ pour lesquels la simplification du cancre est correcte.

La simplification du cancre

Exposé du problème.

Un prof de maths écrit un exercice de contrôle sur le thème des fractions. Pour cela, il choisit un entier à deux chiffres au hasard (cet entier sera le numérateur) puis il choisit le dénominateur au hasard parmi les entiers à deux chiffres distincts du numérateur.

La consigne est de donner la forme irréductible de la fraction ainsi constituée. L'enseignant donne la consigne de ne pas écrire les détails.

La note sera 1 pour une réponse correcte, 0 pour une réponse incorrecte.

Quelle est la probabilité que le cancre gagne un point? On résoudra la question à l'aide d'un script python.

  • Remarque 1
  • Remarque 2
  • Fonction cancreSimplifiable(a,b)
  • Irréductible et non cancre-simplifiable
  • Cancre-simplifiable valide irréductible
  • Probabilité
  • Une liste

Les entiers $a$ et $b$ à manipulés n'ayant que deux chiffres et étant distincts, ils ont au plus un chiffre commun. Si l'on cherche à prolonger la question à des entiers de plus de deux chiffres, le problème se complique. Le cancre pourra en effet chercher à simplifier une fraction telle que $\frac{919}{69}$ de deux façons différentes (obtenant soit $\frac{19}{6}$, soit $\frac{91}{6}$).

Le cancre verra sa réponse comptée comme juste dans les cas suivants:

  • $\frac{a}{b}$ est une fraction sur laquelle une simplification cancre s'applique et pour laquelle le résultat obtenu par cette simplification cancre est correct et irréductible.
  • + $\frac{a}{b}$ est une fraction déjà irréductible et aucune simplification cancre n'est applicable.

Ecrire une fonction python cancreSimplifiable(a,b) prenant en paramètres les entiers naturels $a$ et $b$ ($b\neq 0$) et renvoyant True si une simplification-cancre peut être opérée et False sinon. On se limite ici à une fonction traitant les entiers a et b à deux chiffres.


def cancreSimplifiable(a,b):
    """
    a et b sont deux entiers naturels (b non nul).
    a et b sont compris entre 10 et 99 et distincts.
    La fonction renvoie True si a et b ont un chiffre commun
    (dans leur écriture en base 10).
    """
    assert(10 <= a <= 99)
    assert(10 <= b <= 99)
    a = (a%10, a//10)
    b = (b%10, b//10)
    return a[0]==b[0] or a[1]==b[1] or a[0]==b[1] or a[1]==b[0]

from math import gcd
def nbIrreductibleNonCancreSimplifiable():
    """
    La fonction renvoie le nombre de fractions a/b telles que:
    - a est différent de b
    - a et b sont compris entre 10 et 99
    - aucune simplication du cancre n'est applicable à la fraction a/b
    - la fraction a/b est irréductible
    """
    compteur = 0
    for a in range(10,100):
        for b in range(10,100):
            if gcd(a,b)==1 and not(cancreSimplifiable(a,b)):
                compteur += 1
    return compteur
 

Le résultat: 3284.


def  cancreSimplifiableCorrectIrreductible(a,b):
    """
    a et b sont deux entiers naturels distincts, compris entre 10 et 99.
    La fonction renvoie True si:
    - la fraction a/b peut subir une simplification du cancre.
    - le résultat de cette simplification est correct et irréductible
    La fonction renvoie False sinon.
    """
    A = (a%10, a//10)
    B = (b%10, b//10)
    if A[0]==B[0] and a*B[1]==b*A[1] and gcd(A[1], B[1])==1: return True
    if A[1]==B[1] and a*B[0]==b*A[0] and gcd(A[0], B[0])==1: return True
    if A[0]==B[1] and a*B[0]==b*A[1] and gcd(A[1], B[0])==1: return True
    if A[1]==B[0] and a*B[1]==b*A[0] and gcd(A[0], B[1])==1: return True
    return False

def nbCancreSimplifiableCorrectIrreductible():
    """
    La fonction renvoie le nombre de fractions a/b telles que:
    - a est différent de b
    - a et b sont compris entre 10 et 99.
    - la fraction a/b peut subir une simpliciation du cancre
    - cette simplification-cancre mène à un résultat correct et irréductible
    """
    compteur = 0
    for a in range(10,100):
        for b in [k for k in range(10,100) if k!=a]:
            if cancreSimplifiableCorrectIrreductible(a,b):
                compteur += 1
    return compteur

Le résultat: 60

Nombre de couples (a;b)

Le nombre de couples $(a;b)$ avec $10 \leqslant a \leqslant 99$, $10 \leqslant b \leqslant 99$, $a\neq b$ est égal à $(99-10+1)\times(99-10+1) - 90 = 8010$.


def nbCouples():
    """
    La fonction renvoie le nombre de couples (a,b) tels que
    - a est différent de b
    - a et b sont compris entre 10 et 99
    """
    compteur = 0
    for a in range(10,100):
        for b in [k for k in range(10,100) if k!=a]:
            compteur += 1
    return compteur

Probabilité

La probabilité que l'enseignant choisisse une fraction permettant au cancre de gagner un point est donc égale à $\frac{60+3284}{8010}\approx 0.42$.

Ecrire une fonction python calculant la liste des couples $(a;b)$ tels que $a\neq b$, $10 \leqslant a \leqslant 99$, $10\leqslant b \leqslant 99$ et la fraction $\frac{a}{b}$ peut subir une simplification du cancre donnant un résultat correct (non nécessairement irréductible). On éliminera d'office tous les cas $\frac{20}{60}$, $\frac{80}{30}$, ... (rapport de deux multiples de 10) pour ne pas surcharger l'affichage.


def  cancreSimplifiableCorrect(a,b):
    """
    a et b sont deux entiers naturels distincts, compris entre 10 et 99.
    La fonction renvoie True si:
    - la fraction a/b peut subir une simplification du cancre.
    - le résultat de cette simplification est correct.
    La fonction renvoie False sinon.
    """
    A = (a%10, a//10)
    B = (b%10, b//10)
    if A[0]==B[0] and a*B[1]==b*A[1]: return True
    if A[1]==B[1] and a*B[0]==b*A[0]: return True
    if A[0]==B[1] and a*B[0]==b*A[1]: return True
    if A[1]==B[0] and a*B[1]==b*A[0]: return True
    return False

def listeCancreSimplifiableCorrect():
    """
    Renvoie la liste des couples (a,b) avec:
    - a distinct de b
    - a et b entre 0 et 99
    - une simplification cancre est possible et donne un résultat correct
    - a et b ne sont pas tous deux multiples de 10
    """
    liste = []
    for a in range(10,100):
        for b in [k for k in range(10,100) if k!=a]:
            if not(a%10==0) or not(b%10==0):
                if cancreSimplifiableCorrect(a,b):
                    liste.append((a,b))
    return liste
On obtient:
[(16, 64),
 (19, 95),
 (26, 65),
 (49, 98),
 (64, 16),
 (65, 26),
 (95, 19),
 (98, 49)]