L’ensemble \(\mathbb{Q}\)#

Les fractions sont l’une des créations les plus anciennes et les plus durables de l’esprit humain.

Otto Neugebauer

Construction de \(\mathbb{Q}\)#

L’équation \(bx = a\) n’a pas toujours de solution dans \(\mathbb{Z}\). On construit \(\mathbb{Q}\) pour remédier à cela.

Définition 51 (Relation d’équivalence sur \(\mathbb{Z} \times \mathbb{Z}^*\))

\((a, b) \sim (c, d) \iff ad = bc\) (représente \(\frac{a}{b} = \frac{c}{d}\)).

\(\mathbb{Q} = (\mathbb{Z} \times \mathbb{Z}^*)/{\sim}\).

Proposition 57 (\((\mathbb{Q}, +, \cdot)\) est un corps commutatif ordonné)

\[\frac{a}{b} + \frac{c}{d} = \frac{ad + bc}{bd}, \qquad \frac{a}{b} \cdot \frac{c}{d} = \frac{ac}{bd}\]

L’inverse de \(\frac{a}{b} \neq 0\) est \(\frac{b}{a}\).

L’ordre : \(\frac{a}{b} \leq \frac{c}{d}\) (\(b, d > 0\)) \(\iff\) \(ad \leq bc\).

\(\mathbb{Q}\) est dense : \(\forall x < y \in \mathbb{Q},\ \exists r \in \mathbb{Q},\ x < r < y\).

Définition 52 (Fraction irréductible)

Tout rationnel admet une unique représentation \(\frac{p}{q}\) avec \(q > 0\) et \(\gcd(|p|, q) = 1\).

Développements décimaux#

Proposition 58 (Caractérisation des rationnels par leur développement décimal)

Un réel \(x \in \: ]0, 1[\) est rationnel si et seulement si son développement décimal est éventuellement périodique.

Proof. \((\implies)\) Soit \(x = \frac{p}{q}\) avec \(0 < p < q\). L’algorithme de la division longue de \(p\) par \(q\) produit des restes \(r_n \in \{0, 1, \ldots, q-1\}\). Il y a au plus \(q\) restes distincts, donc le reste se répète, produisant une période de longueur \(\leq q\).

\((\impliedby)\) Soit \(x = 0.a_1 \ldots a_k \overline{b_1 \ldots b_l}\) (période à partir du rang \(k+1\)). Alors

\[10^k x = a_1 \ldots a_k + 0.\overline{b_1 \ldots b_l} = A + \frac{B}{10^l - 1}\]

avec \(A, B \in \mathbb{Z}\), donc \(x \in \mathbb{Q}\).

Exemple 21

\(\frac{1}{7} = 0.\overline{142857}\) (période \(6 = \text{ordre de } 10 \pmod 7\)).

\(\frac{1}{3} = 0.\overline{3}\), \(\frac{1}{6} = 0.1\overline{6}\) (préperiode de longueur 1).

\(0.123123123\ldots = 0.\overline{123} = \frac{123}{999} = \frac{41}{333}\).

Remarque 24

La longueur de la période de \(\frac{1}{p}\) (\(p\) premier \(\neq 2, 5\)) est exactement l’ordre de \(10\) dans \((\mathbb{Z}/p\mathbb{Z})^*\). C’est un diviseur de \(p - 1\) (par Fermat).

Fractions continues#

Définition 53 (Fraction continue)

Un réel \(x\) admet une représentation en fraction continue :

\[x = a_0 + \cfrac{1}{a_1 + \cfrac{1}{a_2 + \cfrac{1}{a_3 + \cdots}}} = [a_0; a_1, a_2, a_3, \ldots]\]

\(a_0 \in \mathbb{Z}\) et \(a_n \in \mathbb{N}^*\) pour \(n \geq 1\) (les quotients partiels).

Si la suite \((a_n)\) est finie, on obtient une fraction continue finie, qui est un rationnel.

Définition 54 (Réduites)

La \(n\)-ième réduite est \(\frac{p_n}{q_n} = [a_0; a_1, \ldots, a_n]\), avec la récurrence :

\[p_{-1} = 1,\ p_0 = a_0,\quad p_n = a_n p_{n-1} + p_{n-2}\]
\[q_{-1} = 0,\ q_0 = 1,\quad q_n = a_n q_{n-1} + q_{n-2}\]

Proposition 59 (Propriétés des réduites)

  • \(p_n q_{n-1} - p_{n-1} q_n = (-1)^{n-1}\) (en particulier \(\gcd(p_n, q_n) = 1\)).

  • Les réduites de rang pair sont inférieures à \(x\), celles de rang impair supérieures.

  • Les réduites sont les meilleures approximations rationnelles de \(x\) (théorème de Lagrange).

Proof. Par récurrence : \(p_n q_{n-1} - p_{n-1} q_n = (a_n p_{n-1} + p_{n-2})q_{n-1} - p_{n-1}(a_n q_{n-1} + q_{n-2}) = p_{n-2}q_{n-1} - p_{n-1}q_{n-2} = -(p_{n-1}q_{n-2} - p_{n-2}q_{n-1}) = \cdots = (-1)^{n-1}\).

Exemple 22

\(\sqrt{2} = [1; 2, 2, 2, \ldots] = [1; \overline{2}]\) : les réduites sont \(\frac{1}{1}, \frac{3}{2}, \frac{7}{5}, \frac{17}{12}, \frac{41}{29}, \ldots\)

Ce sont les solutions de \(|p^2 - 2q^2| = 1\) (équation de Pell).

\(\pi = [3; 7, 15, 1, 292, 1, 1, 1, 2, \ldots]\) : \(\frac{22}{7}\) et \(\frac{355}{113}\) sont d’excellentes approximations.

Remarque 25

Tout rationnel a une représentation finie (unique avec \(a_n \geq 2\) pour la dernière), tout irrationnel a une représentation infinie unique. La fraction continue de \(x\) est périodique si et seulement si \(x\) est un irrationnel quadratique (racine d’un polynôme de degré 2 à coefficients entiers) — théorème de Lagrange.

Insuffisance de \(\mathbb{Q}\) : irrationalité#

Proposition 60 (\(\sqrt{2} \notin \mathbb{Q}\))

Proof. Par l’absurde. Si \(\sqrt{2} = \frac{p}{q}\) irréductible, alors \(p^2 = 2q^2\), \(2 \mid p^2\), \(2 \mid p\) (Euclide), \(p = 2k\), \(4k^2 = 2q^2\), \(2 \mid q\) : contradiction.

Proposition 61 (Irrationalité de \(\sqrt{p}\) pour \(p\) premier)

Proof. Si \(\sqrt{p} = \frac{a}{b}\) irréductible, \(a^2 = pb^2\), \(p \mid a^2\), \(p \mid a\) (Euclide), \(a = pk\), \(p^2k^2 = pb^2\), \(p \mid b\) : contradiction.

Proposition 62 (Irrationalité de \(e\) (Hermite, 1873))

\(e \notin \mathbb{Q}\).

Proof. Supposons \(e = \frac{p}{q}\). Considérons \(J = q! \left(e - \sum_{k=0}^{q} \frac{1}{k!}\right)\). D’une part, \(J = q! \sum_{k=q+1}^{\infty} \frac{1}{k!}\), donc \(0 < J < \frac{q!}{q! \cdot q} \cdot \frac{1}{1-1/q} \to 0\). D’autre part, \(J = q! \frac{p}{q} - \sum_{k=0}^{q} \frac{q!}{k!} \in \mathbb{Z}\). On a donc un entier strictement entre \(0\) et \(1\) : contradiction.

Dénombrabilité de \(\mathbb{Q}\)#

Proposition 63 (\(\mathbb{Q}\) est dénombrable)

Il existe une bijection \(\mathbb{N} \to \mathbb{Q}\).

Proof. On construit une injection de \(\mathbb{Q}^+\) dans \(\mathbb{N}\) par la diagonale de Cantor (voir chapitre 2). Comme \(|\mathbb{N}| \leq |\mathbb{Q}^+| \leq |\mathbb{N}^2| = |\mathbb{N}|\), par Schröder-Bernstein, \(|\mathbb{Q}^+| = |\mathbb{N}|\).

Remarque 26

Paradoxe : \(\mathbb{Q}\) est dénombrable, mais dense dans \(\mathbb{R}\) ! Entre deux rationnels, il y en a une infinité, mais l’ensemble total est de « même taille » que \(\mathbb{N}\).

Hide code cell source

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from fractions import Fraction

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.1)

Hide code cell source

# Développements décimaux périodiques et fractions continues
fig, axes = plt.subplots(3, 1, figsize=(9, 14))

# --- Périodicité de 1/n ---
ax = axes[0]
fracs = [(1, n) for n in [3, 6, 7, 9, 11, 13]]
colors_frac = plt.cm.tab10(np.linspace(0, 1, len(fracs)))

for i, (p, q) in enumerate(fracs):
    # Division longue
    digits = []
    r = p
    for _ in range(40):
        r *= 10
        digits.append(r // q)
        r = r % q
    digits_arr = np.array(digits)
    ax.plot(range(40), digits_arr + i * 10.5, color=colors_frac[i], lw=2,
            label=f'$1/{q}$ (pér.~{q//np.gcd(q,10) if q > 1 else 1})')

ax.set_xlabel('Rang décimal')
ax.set_ylabel('Chiffre (décalé pour lisibilité)')
ax.set_title('Développements décimaux\nde $1/q$ (périodicité visible)', fontsize=10)
ax.legend(fontsize=8, loc='right')
ax.set_yticks([])

# --- Réduites de sqrt(2) ---
ax2 = axes[1]
def continued_fraction_sqrt(n, nterms=10):
    """Fractions continues de sqrt(n)."""
    m, d, a0 = 0, 1, int(n**0.5)
    a = a0
    terms = [a]
    for _ in range(nterms - 1):
        m = d * a - m
        d = (n - m*m) // d
        a = (a0 + m) // d
        terms.append(a)
    return terms

terms_sqrt2 = continued_fraction_sqrt(2, 15)
# Réduites
ps = [terms_sqrt2[0]]
qs = [1]
for k in range(1, len(terms_sqrt2)):
    if k == 1:
        p_new = terms_sqrt2[1] * terms_sqrt2[0] + 1
        q_new = terms_sqrt2[1]
    else:
        p_new = terms_sqrt2[k] * ps[-1] + ps[-2]
        q_new = terms_sqrt2[k] * qs[-1] + qs[-2]
    ps.append(p_new)
    qs.append(q_new)

reduites = [p/q for p, q in zip(ps, qs)]
sqrt2 = np.sqrt(2)
errors = [abs(r - sqrt2) for r in reduites]

ax2.semilogy(range(len(errors)), errors, 'o-', color='#e74c3c', lw=2, markersize=7)
ax2.axhline(y=1e-10, color='gray', linestyle='--', alpha=0.7)
ax2.set_xlabel('Rang de la réduite')
ax2.set_ylabel('$|p_n/q_n - \\sqrt{2}|$ (log)')
ax2.set_title('Réduites de $\\sqrt{2} = [1;\\overline{2}]$\n(meilleures approx. rationnelles)', fontsize=10)

for k, (p, q, e) in enumerate(zip(ps[:6], qs[:6], errors[:6])):
    ax2.annotate(f'$\\frac{{{p}}}{{{q}}}$', (k, e),
                textcoords='offset points', xytext=(8, 5), fontsize=8)

# --- Fractions continues de pi ---
ax3 = axes[2]
# pi = [3; 7, 15, 1, 292, ...]
pi_cf = [3, 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14]
ps_pi = [pi_cf[0]]
qs_pi = [1]
for k in range(1, len(pi_cf)):
    if k == 1:
        p_new = pi_cf[1] * pi_cf[0] + 1
        q_new = pi_cf[1]
    else:
        p_new = pi_cf[k] * ps_pi[-1] + ps_pi[-2]
        q_new = pi_cf[k] * qs_pi[-1] + qs_pi[-2]
    ps_pi.append(p_new)
    qs_pi.append(q_new)

errors_pi = [abs(p/q - np.pi) for p, q in zip(ps_pi, qs_pi)]

ax3.semilogy(range(len(errors_pi)), errors_pi, 's-', color='#3498db', lw=2, markersize=7)
ax3.set_xlabel('Rang')
ax3.set_ylabel('$|p_n/q_n - \\pi|$ (log)')
ax3.set_title('Réduites de $\\pi = [3; 7, 15, 1, 292, \\ldots]$', fontsize=10)

for k, (p, q) in enumerate(zip(ps_pi[:6], qs_pi[:6])):
    ax3.annotate(f'$\\frac{{{p}}}{{{q}}}$', (k, errors_pi[k]),
                textcoords='offset points', xytext=(5, 5), fontsize=8)

plt.tight_layout()
plt.show()
_images/2ebde27f4a7baa05004227a8f92154d456e9d64274c278cad565083c82f85333.png

Hide code cell source

# Densité de Q dans R et diagonale de Cantor
fig, axes = plt.subplots(2, 1, figsize=(9, 9))

# Densité : fractions p/q avec q <= N
N_dens = 15
fracs_dense = sorted(set(
    Fraction(p, q) for q in range(1, N_dens + 1) for p in range(0, q + 1)
))
vals = [float(f) for f in fracs_dense]

ax = axes[0]
ax.scatter(vals, np.zeros(len(vals)), s=30, color='#3498db', alpha=0.7)
ax.axhline(0, color='black', lw=0.5)
ax.set_xlim(-0.05, 1.05)
ax.set_ylim(-0.3, 0.3)
ax.set_yticks([])
ax.set_xlabel('$x$')
ax.set_title(f'Densité de $\\mathbb{{Q}}$ : fractions $p/q$, $q \\leq {N_dens}$\n({len(vals)} points dans $[0,1]$)', fontsize=10)

# Zoom
ax_inset = ax.inset_axes([0.6, 0.3, 0.38, 0.6])
vals_zoom = [v for v in vals if 0.3 < v < 0.4]
ax_inset.scatter(vals_zoom, np.zeros(len(vals_zoom)), s=20, color='#e74c3c', alpha=0.8)
ax_inset.axhline(0, color='black', lw=0.5)
ax_inset.set_xlim(0.3, 0.4); ax_inset.set_ylim(-0.5, 0.5)
ax_inset.set_yticks([]); ax_inset.set_title('Zoom $[0.3, 0.4]$', fontsize=7)
ax.indicate_inset_zoom(ax_inset, edgecolor='#e74c3c')

# Diagonale de Cantor pour Q+
ax2 = axes[1]
N_diag = 6
diag_pts = []
order = 0
for s in range(1, N_diag * 2):
    for p in range(0, s + 1):
        q = s - p
        if q > 0:
            f = Fraction(p, q)
            if 0 <= float(f) <= N_diag and (p, q) == (f.numerator, f.denominator) or (p == 0 and q == 1):
                diag_pts.append((q, p, float(f), order))
                order += 1

ax2.set_xlim(0, N_diag + 1); ax2.set_ylim(0, N_diag + 1)
ax2.set_xlabel('Dénominateur $q$'); ax2.set_ylabel('Numérateur $p$')
ax2.set_title('Diagonales de Cantor\n(énumération de $\\mathbb{Q}^+$)', fontsize=10)

# Grille des fracs
for p in range(N_diag + 1):
    for q in range(1, N_diag + 1):
        f = Fraction(p, q)
        is_irred = (f.numerator == p and f.denominator == q) or (p == 0)
        color = '#3498db' if is_irred else '#ecf0f1'
        ax2.scatter([q], [p], s=200, color=color, zorder=5, alpha=0.8)
        ax2.text(q, p, f'{p}/{q}' if is_irred else '', ha='center', va='center',
                fontsize=6, color='white' if is_irred else 'gray')

# Diagonales
for s in range(1, N_diag + 1):
    xs = list(range(1, s + 1))
    ys = list(range(s - 1, -1, -1))
    valid = [(x, y) for x, y in zip(xs, ys) if x <= N_diag and y <= N_diag]
    if len(valid) > 1:
        ax2.plot([v[0] for v in valid], [v[1] for v in valid],
                'gray', alpha=0.3, lw=1, linestyle='--')

ax2.grid(True, alpha=0.2)
plt.tight_layout()
plt.show()
_images/d72e22bf2dc04b78575065a58c632c39c4bc9a84ecc345f6d69fc609c156b654.png