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}$).
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]
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)]