Calendrier Mathématique Août 2020

Solutions personnelles aux problèmes du Calendrier Mathématique


Calendrier Mathématique Août 2020

Solutions 2020 - Homepage

Lundi 3 Août

schéma

L’angle de la hauteur issue de C et de (AB) est 90°.

Comme la somme des angles d’un triangle est 180°, ∠DAH = 180 - 97 - 90 = 20°

La bissectrice coupe un angle en deux, donc ∠BAC = 2 × 20 = 40°.

On en déduit l’angle ∠BCA = 180 - 60 - 40 = 80°.

réponse: 80°

Mardi 4 Août

En développant:

  • ab + ac = 152
  • bc + ba = 162
  • ca + cb = 170

Notons x = ab, y = bc et z = ca. Les équations peuvent s’écrire:

  • x + z = 152
  • y + x = 162
  • z + y = 170

Ce qui se résout en: x = 72, y = 90, z = 80

xyz = ab × bc × ca = (abc)² = 72 × 90 × 80 = 518400 = 720²

Nota: la solution positive au système initial est: a = 8, b = 9, c = 10

réponse: 720

Mercredi 5 Août

mouvement ① 2 l ② 5/4 l ③ 3/4 l
départ 2,00 0,00 0,00
① dans ② 0,75 1,25 0,00
② dans ③ 0,75 0,50 0,75
③ dans ① 1,50 0,50 0,00
② dans ③ 1,50 0,00 0,50
① dans ② 0,25 1,25 0,50
② dans ③ 0,25 1,00 0,75
③ dans ① 1,00 1,00 0,00

réponse: oui

Jeudi 6 Août

Soient r₁ et r₂ les rayons des deux cercles en centimètres.

A₁ - A₂ = π (r₁² - r₂²) = 72 π

r₁ + r₂ = 1800

(r₁ + r₂)(r₁ - r₂) = 72 ⇒ (r₁ - r₂) = 72 / 1800 = 1 / 25

2r₁ = 1800 + 1 / 25

On en déduit r₁ - 45001 / 50 et r₂ = 45001 / 50 = 1 / 25 = 44999 / 50

réponse: 44999 / 50 et 45001 / 50

Vendredi 7 Août

Comme 100 = 9 + 9 + 82, le plus petit nombre “centenaire” possible est 82. Il faut tester ensuite…

Le programme Python le fait pour nous.

#!/usr/bin/env python3

nb = 0
for a in range(80, 100):
    for b in range(a, 100):
        n1 = a + (b // 10) + (b % 10)
        n2 = b + (a // 10) + (a % 10)
        if n1 == n2 == 100:
            print(a, b)
            nb += 1
print("réponse:", nb)

Il y a donc cinq “paires centenaires”: (83, 89) (84, 88) (85, 87) (86, 86) (90, 91)

réponse: 5

Lundi 10 Août

Si Jean choisit le dé 4-0:

  • 0 est toujours perdant (i.e. Léa gagne)
  • 4 est perdant 5 fois sur 18 tirages possibles
  • si Léa choisit le dé 1-5 elle a 2/3 de chance de gagner

2/6 + 4/6 × 5/18 = 14/27

Si Jean choisit le dé 3:

  • 3 est perdant 4+2+3 = 9/18 = 1/2
  • si Léa choisit le dé 0-4 elle a 2/3 de chance de gagner

Si Jean choisit le dé 6-2:

  • 2 est perdant 4+6+3: 4/6 × 13/18 = 13/27
  • 6 est toujours gagnant
  • si Léa choisit le dé 3 elle a 2/3 de chance de gagner

Si Jean choisit le dé 5-1:

  • 1 est perdant 4+6+6 fois: 3/6 × 16/18
  • 5 est perdant 2 fois: 3/6 × 2/18
  • si Léa choisit le dé 2-6 elle a 2/3 de chance de gagner

3/6 × 2/18 + 3/6 × 16/18 = 1/2

Soit au total:

1/4 × (14/27 + 1/2 + 13/27 + 1/2) = 1/4 × 2 = 1/2

Calcul de tous les tirages possibles par programme.

#!/usr/bin/env python3

from fractions import Fraction

des = [
    [0, 0, 4, 4, 4, 4],
    [3, 3, 3, 3, 3, 3],
    [2, 2, 2, 2, 6, 6],
    [1, 1, 1, 5, 5, 5],
]

total_nb = 0
total_lea_gagne = 0
max_lea_f = 0

# Jean choisit un dé
for de_jean in range(4):

    des_lea = set(range(4))
    des_lea.remove(de_jean)

    # Léa choisit un dé parmi les trois restants
    for de_lea in des_lea:

        nb = 0
        lea_gagne = 0

        # Jean tire son dé
        for tirage_jean in des[de_jean]:

            # Léa tire son dé
            for tirage_lea in des[de_lea]:
                nb += 1

                # Léa gagne si son tirage est supérieur à celui de Jean
                if tirage_lea > tirage_jean:
                    lea_gagne += 1

        f = Fraction(lea_gagne, nb)
        # print(
        #     f"de_jean: {des[de_jean]} de_lea: {des[de_lea]} - "
        #     + f"lea_gagne: {lea_gagne}/{nb} = {f}"
        # )
        if f > max_lea_f:
            max_lea_f = f

        total_lea_gagne += lea_gagne
        total_nb += nb

f = Fraction(total_lea_gagne, total_nb)
print(f"total_lea_gagne: {total_lea_gagne}/{total_nb} = {f}")
print(f"max_lea_f: {max_lea_f}")

réponse: Léa a p=1/2 chances de gagner. Si elle choisit bien son dé, elle a p=2/3 chances de gagner

Mardi 11 Août

Soit d le chiffre des dizaines de n et u celui des unités.

Ils sont solutions de l’équation:

d × u + d + u = 10 × d + u

d × u + d = 10 × d

u + 1 = 10 (car d ≠ 0)

Soit, u = 9 et d quelconque.

Autrement dit, tous les nombres qui se terminent par 9 entre 10 et 90.

réponse: 8

Mercredi 12 Août

₁ ₂ ₃ ₄ ₅ ₆
▲ ▲ ▲ ▲ ▲ ▲
▲ ▼ ▼ ▼ ▼ ▼    ①
▼ ▼ ▲ ▲ ▲ ▲    ②
▲ ▲ ▲ ▼ ▼ ▼    ③
▼ ▼ ▼ ▼ ▲ ▲    ④
▲ ▲ ▲ ▲ ▲ ▼    ⑤
▼ ▼ ▼ ▼ ▼ ▼    ⑥
Gagné

Programme du jeu écrit en Python.

#!/usr/bin/env python3

import sys


def read_single_keypress():
    """Waits for a single keypress on stdin.

    This is a silly function to call if you need to do it a lot because it has
    to store stdin's current setup, setup stdin for reading single keystrokes
    then read the single keystroke then revert stdin back after reading the
    keystroke.

    Returns a tuple of characters of the key that was pressed - on Linux,
    pressing keys like up arrow results in a sequence of characters. Returns
    ('\x03',) on KeyboardInterrupt which can happen when a signal gets
    handled.

    """
    import termios, fcntl, sys, os

    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save)  # copy the stored version to update
    # iflag
    attrs[0] &= ~(
        termios.IGNBRK
        | termios.BRKINT
        | termios.PARMRK
        | termios.ISTRIP
        | termios.INLCR
        | termios.IGNCR
        | termios.ICRNL
        | termios.IXON
    )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios.PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(
        termios.ECHONL | termios.ECHO | termios.ICANON | termios.ISIG | termios.IEXTEN
    )
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    ret = []
    try:
        ret.append(sys.stdin.read(1))  # returns a single character
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
        c = sys.stdin.read(1)  # returns a single character
        while len(c) > 0:
            ret.append(c)
            c = sys.stdin.read(1)
    except KeyboardInterrupt:
        ret.append("\x03")
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return tuple(ret)


def play(board, move):
    if move >= 0 and move < len(board):
        move = "    " + "①②③④⑤⑥⑦⑧⑨⑩"[move]
    else:
        move = ""
    line = " ".join("▲" if i > 0 else "▼" for i in board)
    print(f"\033[32m{line}\033[0m{move}", end="\n")

    if all(i == -1 for i in board):
        return True

    print("\033[2m" + " ".join("₁₂₃₄₅₆₇₈₉₀"[: len(board)]) + "\033[0m")
    return False


print("\033[H\033[2J", end="")  # clear

try:
    size = int(sys.argv[1])
    if size < 2 or size > 10:
        raise ValueError
except (IndexError, ValueError):
    size = 6

board = [1] * size
move = -1
while True:
    if play(board, move):
        print("Gagné")
        break

    key = "".join(read_single_keypress())
    if len(key) != 1:
        continue

    if key in "xXqQ\03\033":  # Echap, ^C, x, q pour quitter
        break

    if key == "R":  # recommencer
        board = [1] * len(board)
        continue

    move = "&é\"'(§è!çà".find(key)
    if move == -1:
        move = "1234567890".find(key)
    if move == -1 or move >= len(board):
        continue
    board = [-v if i != move else v for i, v in enumerate(board)]

réponse: oui c’est possible

Jeudi 13 Août

$k=\frac{9n^2+31}{n^2+7}=\frac{9n^2+63-32}{n^2+7}=9-\frac{32}{n^2+7}$

Il faut donc que 𝑛²+7 divise 32.

  • 𝑛=1: 𝑛²+7=8 ✅
  • 𝑛=2: 𝑛²+7=11 et 11 ne divise pas 32 ❌
  • 𝑛=3: 𝑛²+7=16 convient ✅
  • 𝑛=4: 𝑛²+7=23 non ❌
  • 𝑛=5: 𝑛²+7=32 ok ✅

réponse: 𝑛 = ±1 ±3 ±5

Vendredi 14 Août

schéma

Le grand cercle de centre B a pour rayon BA avec AB diagonale du carré de côté r = OB = OA.

L’aire 𝒜 recherchée est l’aire du cercle de centre B de rayon r√2 diminuée de la moitié du cercle de centre O de rayon r et du segment AA’E du grand cercle.

Le segment AA’E a pour aire 𝒶 celle du secteur) ABA’ moins le triangle ABA’.

𝒶 = π (r√2)² / 4 - r × 2r / 2 = r² × (π / 2 - 1)

𝒜 = π (r√2)² - π (r²) / 2 - 𝒶 = r² × (2π - π / 2 - π / 2 + 1) = r² × (π + 1)

réponse: r² × (π + 1)

Lundi 17 Août

Les candidats de carré d’entiers sont 1, 4, 9 et 16. Soit:

  • pour 1: 1-0 ⇒ 1 nombre (10)
  • pour 4: 2-2 1-3 4-0 ⇒ 4 nombres (22 13 31 40)
  • pour 9: 1-8 2-7 3-6 4-5 9-0 ⇒ 9 nombres (18 27 36 45 81 72 63 54 90)
  • pour 16: 7-9 8-8 ⇒ 3 nombres (79 97 88)

Programme Python de vérification.

#!/usr/bin/env python3

carres = list(n * n for n in range(5))
nb = 0
for n in range(10, 100):
    d, u = divmod(n, 10)
    if d + u in carres:
        print(n)
        nb += 1
print("réponse:", nb)

réponse: 17

Mardi 18 Août

Soit respectivement p < m < g le poids des petits, moyens et grands poissons, et X le nombre de poissons de moyenne taille recherché.

3p + X × m + 3g = P

P - 3g = P - 0.35 × P = 0.65 P ⇒ 3g = 7 / 20 × P

0.65 × P - 3p = 0.65 × P - 5 / 13 × 0.65 P ⇒ 3p = 1 / 4 × P

D’où: 1 / 4 × P + X × m + 7 / 20 × P = P

X × m = P × (1 - 3 / 5) = 2 / 5 × P

On doit avoir X entier et 1 / 12 P < m < 7 / 60 P

En remplaçant m par 2 / 5 × P / X:

5 / 60 < 2 / (5 × X) < 7 / 60

12 > 5 / 2 X > 60 / 7

24 / 5 > X > 24 / 7

X = 4

réponse: 4

Mercredi 19 Août

Pour $n \leq 1$, $2^{2^n}+9$ vaut:

  • $n = 0 : 2^{2^0} + 9 = 2^1 + 9 = 11$ ✅
  • $n = 1 : 2^{2^1} + 9 = 2^2 + 9 = 13$ ✅

Pour $n \geq 2$: $2^{2^n} = 2^{4 \times 2^{n-2}} = 16^{n-2}$

Or, toutes les puissances de 16 se terminent par une puissance du chiffre de l’unité, à savoir 6:

$(10d+u)^n = 100 d^2 + 20d+ u^2 = 10 D+u^2$

Et plus généralement:

\[(10d+u)^n=\sum_{k=0}^n {n \choose k} (10d)^{k} u^{n-k}=\sum_{k=1}^n {n \choose k} (10d)^{k} u^{n-k}+u^n=10D+u^n\]

Et comme $6\times6=36$ se termine aussi par 6, c’est invariablement 6 à la fin. Ajouté 9, le nombre se terminera toujours par 5, et est donc divisible par 5.

réponse: n = 0 ou n = 1

Jeudi 20 Août

365 mod 52 = 1 : on “avance” d’un jour de semaine par année non bissextile, et de deux sinon.

  • 2021 n’est pas bissextile, vendredi 20 août 2021
  • 2022 samedi 20 août 2022
  • 2023 dimanche 20 août 2023
  • 2024 est bissextile mardi 20 août 2024
  • 2025 mercredi 20 août 2025
  • 2026 jeudi 20 août 2026

Vérification avec programme en Python.

#!/usr/bin/env python3

from datetime import datetime

annee = 2020
ref = datetime(2020, 8, 20).weekday()
while True:
    annee += 1
    d = datetime(annee, 8, 20)
    print(f"{d.year} : {d.strftime('%A')}")
    if d.weekday() == ref:
        break

réponse: 2026

Vendredi 21 Août

Le petit rectangle a un rapport largeur/hauteur égal à 2 puisqu’il “contient” deux cercles côte à côte. Calculons ses dimensions dont on déduira le diamètre des cercles (égal à la hauteur du petit rectangle) et ainsi le périmètre du grand rectangle.

2 (l + h) = 2 × (2h + h) = 6h = 60 cm

D’où h = 10 cm et 𝑃 = 2 × (3h + 2h) = 10h = 100 cm

réponse: 100 cm

Lundi 24 Août

Il faut que $0\leq 1 - x$ et $0\leq x$ pour que les racines carrées soient définies. Donc $0 \leq x \leq 1$.

On en déduit que: $0\leq\left(\sqrt{x}\right)^{2019} \leq 1$ et $0\leq\left(\sqrt{1-x}\right)^{2020} \leq 1 - x$

Soit: $0\leq\left(\sqrt{x}\right)^{2019} + \left(\sqrt{1-x}\right)^{2020} \leq 1$. Cependant 0 n’est pas possible car les deux racines ne peuvent être nulles en même temps. On a donc:

\[\left(\sqrt{x}\right)^{2019} + \left(\sqrt{1-x}\right)^{2020} =1\]

Il y a deux solutions évidentes: $x = 0$ et $x = 1$.

La fonction est décroissante puis croissante sur l’intervalle [0; 1]. Les deux solutions sont donc les seules.

réponse: 0 et 1

Mardi 25 Août

C’est l’ensemble des nombres 1x0 ou x10 avec x ≠ 9 qui soient multiples de 30.

[100+i*10 for i in range(10) if (100+i*10)%30==0]
[10+i*100 for i in range(10) if (10+i*100)%30==0]
[i for i in range(100,1000) if i%30==0 and str(i).find('1')!=-1 and str(i).find('9')==-1]

réponse: 120, 150, 180, 210, 510, 810

Mercredi 26 Août

Soit x l’âge de Xavier.

(x - 55) × (x + 55) = x² - 55² = p³

Admettons qu’il a moins de 120 ans. Il faut donc trouver un cube de premier inférieur à 11375 < 23³ = 12167.

On va tester les premiers inférieurs à 23 un par un à l’aide d’un programme en Python.

#!/usr/bin/env python3

from sympy.ntheory import sieve

sieve.extend(23)
primes = sieve._list

cubes = [n ** 3 for n in sieve._list]

for n in range(55, 121):
    if (n - 55) * (n + 55) in cubes:
        print("réponse:", n)
        break

réponse: 66 ans

Jeudi 27 Août

damier

Code source du dessin réalisé avec TikZ en LaTeX .

réponse: cf. damier

Vendredi 28 Août

\[\begin{aligned} a_2&=1\times(a_0+a_1)=1\times(1+1)=2 \\ a_3&=2\times(a_1+a_2)=2\times(1+2)=6 \\ a_4&=3\times(a_2+a_3)=3\times(2+6)=24 \\ \end{aligned}\]

$a_n$ semble être la fonction factorielle. Montrons que $a_n=n!$ par récurrence: c’est vrai pour $a_n, n\leq 4$, on suppose que c’est vrai pour $n$ et on vérifie pour $n+1$:

\[\begin{aligned} a_{n+1}&=n(a_{n-1}+a_n) \\ &=n \bigl((n-1)!+n! \big) \\ &=n!+n\times n! \\ &=n!\times(1+n) \\ &=(n+1)! \\ \end{aligned}\]

Donc, à partir de 5!, le chiffre des unités est 0 car il y a 2×5=10 comme facteur.

On peut le vérifier à l’aide d’un programme en Python.

#!/usr/bin/env python3

from math import factorial

a0, a1 = 1, 1

for n in range(1, 2021):
    a = n * (a0 + a1)
    n += 1
    a1, a0 = a, a1
    if n <= 6 or n == 2020:
        s = str(a)
        if len(s) > 20:
            s = "[...]" + s[-20:]
        print(f"a({n}) = {s}", factorial(n) == a)

réponse: 0

Lundi 31 Août

schéma

Il y a un quart de l’hémisphère sud qui intercepte le carré.

réponse: 1 / 8