Structures algébriques#

L’algèbre n’est qu’une géométrie écrite, la géométrie n’est qu’une algèbre figurée.

Sophie Germain

Les structures algébriques abstraites permettent d’unifier et de généraliser des propriétés communes à des objets mathématiques très divers : entiers, polynômes, matrices, permutations…

Loi de composition interne#

Définition 26 (Loi de composition interne)

Soit \(E\) un ensemble. Une loi de composition interne (lci) est une application \(\star : E \times E \to E\). On dit que \(E\) est stable pour \(\star\).

Définition 27 (Propriétés d’une lci)

Soit \((E, \star)\) un magma.

  • Associativité : \(\forall x, y, z \in E,\ (x \star y) \star z = x \star (y \star z)\)

  • Commutativité : \(\forall x, y \in E,\ x \star y = y \star x\)

  • Élément neutre : \(\exists e \in E,\ \forall x \in E,\ e \star x = x \star e = x\)

  • Élément absorbant : \(\exists a \in E,\ \forall x \in E,\ a \star x = x \star a = a\)

  • Idempotence d’un élément : \(x \star x = x\)

Proposition 20 (Unicité de l’élément neutre et de l’absorbant)

Si un élément neutre existe, il est unique. Si un élément absorbant existe, il est unique.

Proof. Neutre : Soient \(e\) et \(e'\) deux neutres. Alors \(e = e \star e' = e'\) (car \(e'\) est neutre pour la première égalité, \(e\) pour la seconde).

Absorbant : Soient \(a\) et \(a'\) deux absorbants. Alors \(a = a \star a' = a'\) (car \(a'\) est absorbant).

Groupe#

Définition 28 (Groupe)

\((G, \star)\) est un groupe si :

  1. \(\star\) est associative,

  2. Il existe un élément neutre \(e\),

  3. Tout élément \(x \in G\) admet un symétrique (ou inverse) \(x^{-1}\) tel que \(x \star x^{-1} = x^{-1} \star x = e\).

Un groupe est abélien (ou commutatif) si \(\star\) est commutative.

Proposition 21 (Propriétés dans un groupe)

Soit \((G, \star)\) un groupe d’élément neutre \(e\).

  1. L’inverse est unique.

  2. \((x^{-1})^{-1} = x\)

  3. \((x \star y)^{-1} = y^{-1} \star x^{-1}\) (anti-automorphisme)

  4. Régularité : \(a \star b = a \star c \implies b = c\) et \(b \star a = c \star a \implies b = c\)

Proof. 1. Si \(x'\) et \(x''\) sont deux inverses de \(x\) : \(x' = x' \star e = x' \star (x \star x'') = (x' \star x) \star x'' = e \star x'' = x''\). 2. \(x^{-1} \star x = e\), donc \(x\) est l’inverse de \(x^{-1}\). 3. \((x \star y) \star (y^{-1} \star x^{-1}) = x \star (y \star y^{-1}) \star x^{-1} = x \star e \star x^{-1} = e\). 4. Composer à gauche par \(a^{-1}\).

Exemple 12

  • \((\mathbb{Z}, +)\), \((\mathbb{Q}, +)\), \((\mathbb{R}, +)\), \((\mathbb{C}, +)\) : groupes abéliens, neutre \(0\), inverse \(-x\).

  • \((\mathbb{Q}^*, \cdot)\), \((\mathbb{R}^*, \cdot)\), \((\mathbb{C}^*, \cdot)\) : groupes abéliens, neutre \(1\), inverse \(1/x\).

  • \((\mathbb{N}, +)\) n’est pas un groupe (\(1\) n’a pas d’inverse).

  • \((\mathbb{Z}, \cdot)\) n’est pas un groupe (\(2\) n’a pas d’inverse dans \(\mathbb{Z}\)).

  • \((GL_n(\mathbb{R}), \cdot)\) : groupe des matrices inversibles de taille \(n\) (non abélien pour \(n \geq 2\)).

  • \((S_n, \circ)\) : groupe symétrique des permutations de \(\{1, \ldots, n\}\), d’ordre \(n!\) (non abélien pour \(n \geq 3\)).

Sous-groupe#

Définition 29 (Sous-groupe)

\(H \subseteq G\) est un sous-groupe de \((G, \star)\) si \((H, \star)\) est lui-même un groupe.

Proposition 22 (Critère du sous-groupe)

\(H \neq \varnothing\) est un sous-groupe de \(G\) si et seulement si

\[\forall x, y \in H,\ x \star y^{-1} \in H\]

Proof. \((\implies)\) Si \(H\) est un sous-groupe, \(x, y \in H \implies y^{-1} \in H \implies x \star y^{-1} \in H\).

\((\impliedby)\) Soit \(a \in H\). Alors \(e = a \star a^{-1} \in H\) (neutralité). Pour \(x \in H\) : \(x^{-1} = e \star x^{-1} \in H\). Pour \(x, y \in H\) : \(x \star y = x \star (y^{-1})^{-1} \in H\) (stabilité). L’associativité est héritée.

Exemple 13

  • \(n\mathbb{Z} = \{nk \mid k \in \mathbb{Z}\}\) est un sous-groupe de \((\mathbb{Z}, +)\).

  • \(\{e, r, r^2\} \subset S_3\)\(r = (123)\) est un sous-groupe cyclique d’ordre 3.

Sous-groupes de \((\mathbb{Z}, +)\)#

Proposition 23

Tout sous-groupe de \((\mathbb{Z}, +)\) est de la forme \(n\mathbb{Z}\) pour un unique \(n \in \mathbb{N}\).

Proof. Soit \(H\) un sous-groupe de \(\mathbb{Z}\). Si \(H = \{0\}\), \(H = 0\mathbb{Z}\). Sinon, \(H\) contient des éléments strictement positifs (car \(x \in H \implies -x \in H\)). Soit \(n = \min(H \cap \mathbb{N}^*)\).

Pour tout \(h \in H\), écrivons \(h = qn + r\) avec \(0 \leq r < n\). Comme \(h \in H\) et \(qn \in H\) (car \(n \in H\) et \(H\) stable), \(r = h - qn \in H\). Par minimalité de \(n\), \(r = 0\), donc \(h \in n\mathbb{Z}\).

Morphismes de groupes#

Définition 30 (Morphisme de groupes)

Un morphisme (ou homomorphisme) de groupes est une application \(f : (G, \star) \to (H, \cdot)\) telle que

\[\forall x, y \in G,\ f(x \star y) = f(x) \cdot f(y)\]

Proposition 24 (Propriétés d’un morphisme)

  • \(f(e_G) = e_H\)

  • \(f(x^{-1}) = f(x)^{-1}\)

  • L”image \(f(G)\) est un sous-groupe de \(H\)

  • Le noyau \(\ker(f) = \{x \in G \mid f(x) = e_H\}\) est un sous-groupe de \(G\)

  • \(f\) est injective \(\iff \ker(f) = \{e_G\}\)

Proof. \(f(e_G) = f(e_G \star e_G) = f(e_G) \cdot f(e_G)\), d’où \(f(e_G) = e_H\) (simplification dans \(H\)).

\(e_H = f(e_G) = f(x \star x^{-1}) = f(x) \cdot f(x^{-1})\), d’où \(f(x^{-1}) = f(x)^{-1}\).

Si \(f\) injective et \(f(x) = e_H\) : \(f(x) = f(e_G)\), donc \(x = e_G\). Réciproquement, si \(\ker(f) = \{e_G\}\) et \(f(x) = f(y)\) : \(f(x \star y^{-1}) = e_H\), donc \(x \star y^{-1} = e_G\), d’où \(x = y\).

Groupe quotient et théorème d’isomorphisme#

Définition 31 (Sous-groupe distingué)

\(N\) est un sous-groupe distingué (ou normal) de \(G\), noté \(N \trianglelefteq G\), si

\[\forall g \in G,\ gNg^{-1} = N \quad \text{(i.e. } \forall n \in N,\ gng^{-1} \in N\text{)}\]

Remarque 14

Tout sous-groupe d’un groupe abélien est distingué. Le noyau d’un morphisme est toujours distingué.

Définition 32 (Groupe quotient)

Si \(N \trianglelefteq G\), l’ensemble des classes à gauche \(G/N = \{gN \mid g \in G\}\) est un groupe pour la loi

\[(gN) \cdot (g'N) = (gg')N\]

appelé groupe quotient.

Proposition 25 (Premier théorème d’isomorphisme)

Soit \(f : G \to H\) un morphisme de groupes. Alors

\[G/\ker(f) \cong f(G)\]

(isomorphisme canonique donné par \(g \ker(f) \mapsto f(g)\)).

Proof. Notons \(K = \ker(f)\). L’application \(\varphi : G/K \to f(G)\), \(gK \mapsto f(g)\) est bien définie (si \(gK = g'K\), alors \(g^{-1}g' \in K\), soit \(f(g^{-1}g') = e_H\), d’où \(f(g) = f(g')\)).

\(\varphi\) est un morphisme : \(\varphi(gK \cdot g'K) = \varphi((gg')K) = f(gg') = f(g)f(g') = \varphi(gK)\varphi(g'K)\).

\(\varphi\) injective : \(\varphi(gK) = e_H \implies f(g) = e_H \implies g \in K \implies gK = K = e_{G/K}\).

\(\varphi\) surjective : pour tout \(f(g) \in f(G)\), \(\varphi(gK) = f(g)\).

Exemple 14

Le morphisme \(f : \mathbb{Z} \to \mathbb{Z}/n\mathbb{Z}\), \(k \mapsto \bar{k}\) a pour noyau \(n\mathbb{Z}\). Le premier théorème donne \(\mathbb{Z}/n\mathbb{Z} \cong \mathbb{Z}/n\mathbb{Z}\) (trivial ici), mais la structure du groupe quotient est celle de \(\mathbb{Z}/n\mathbb{Z}\).

Plus intéressant : le morphisme \(\exp : (\mathbb{R}, +) \to (\mathbb{R}^{+*}, \cdot)\) est surjectif de noyau \(\{0\}\), donc \(\mathbb{R} \cong \mathbb{R}^{+*}\).

Hide code cell source

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.patches import FancyBboxPatch
from itertools import permutations

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

Hide code cell source

# Tables de Cayley : Z/4Z et Z/2Z x Z/2Z (Klein)
fig, axes = plt.subplots(3, 1, figsize=(9, 14))

def cayley_table(ax, elements, op, title):
    n = len(elements)
    table = np.array([[op(i, j) for j in range(n)] for i in range(n)])

    im = ax.imshow(table, cmap='Blues', vmin=0, vmax=n-1)
    ax.set_xticks(range(n))
    ax.set_yticks(range(n))
    ax.set_xticklabels([str(e) for e in elements], fontsize=12)
    ax.set_yticklabels([str(e) for e in elements], fontsize=12)
    ax.set_title(title, fontsize=11, fontweight='bold')
    ax.set_xlabel('$j$'); ax.set_ylabel('$i$')

    for i in range(n):
        for j in range(n):
            val = table[i, j]
            ax.text(j, i, str(elements[val]), ha='center', va='center',
                   fontsize=13, color='white' if val > n//2 else 'black', fontweight='bold')
    return table

# Z/4Z
cayley_table(axes[0], ['0','1','2','3'],
             lambda i, j: (i + j) % 4,
             r'$\mathbb{Z}/4\mathbb{Z}$ (cyclique)')

# Groupe de Klein Z/2Z x Z/2Z
klein = [(0,0), (0,1), (1,0), (1,1)]
def klein_op(i, j):
    a, b = klein[i]; c, d = klein[j]
    res = ((a+c)%2, (b+d)%2)
    return klein.index(res)
cayley_table(axes[1], ['(0,0)','(0,1)','(1,0)','(1,1)'],
             klein_op,
             r'$\mathbb{Z}/2\mathbb{Z} \times \mathbb{Z}/2\mathbb{Z}$ (Klein)')

# S3 - groupe symétrique
S3 = list(permutations([0, 1, 2]))
S3_labels = ['e', '(12)', '(13)', '(23)', '(123)', '(132)']
def s3_op(i, j):
    p, q = S3[i], S3[j]
    comp = tuple(p[k] for k in q)
    return S3.index(comp)

cayley_table(axes[2], S3_labels, s3_op, '$S_3$ (symétrique, non abélien)')

plt.suptitle('Tables de Cayley de quelques groupes', fontsize=13, fontweight='bold', y=1.01)
plt.tight_layout()
plt.show()
_images/d491b4b06a5df825ca48989ace7e6c90eae2c266e5a0bc9083dbdd0330cc7e20.png

Hide code cell source

# Sous-groupes de Z/12Z et diagramme en treillis
fig, axes = plt.subplots(2, 1, figsize=(9, 11))

# Sous-groupes de Z/12Z : diviseurs de 12
n = 12
diviseurs = [d for d in range(1, n+1) if n % d == 0]  # 1,2,3,4,6,12
sous_groupes = {d: list(range(0, n, d)) for d in diviseurs}

ax = axes[0]
colors_sg = plt.cm.Blues(np.linspace(0.3, 0.9, len(diviseurs)))

# Cercle de Z/12Z
angles = np.linspace(0, 2*np.pi, n, endpoint=False)
r = 1.5
xs = r * np.cos(angles - np.pi/2)
ys = r * np.sin(angles - np.pi/2)

for k in range(n):
    ax.scatter([xs[k]], [ys[k]], s=300, color='#ecf0f1', edgecolor='#bdc3c7', zorder=5)
    ax.text(xs[k], ys[k], str(k), ha='center', va='center', fontsize=9)

# Afficher le sous-groupe d'ordre 4 (multiples de 3)
sg = sous_groupes[3]  # {0,3,6,9}
for k in sg:
    ax.scatter([xs[k]], [ys[k]], s=400, color='#3498db', alpha=0.8, zorder=6)
    ax.text(xs[k], ys[k], str(k), ha='center', va='center', fontsize=9, color='white', fontweight='bold')

ax.set_xlim(-2.2, 2.2); ax.set_ylim(-2.2, 2.2)
ax.set_aspect('equal'); ax.axis('off')
ax.set_title('Sous-groupe $3\\mathbb{Z}/12\\mathbb{Z} = \\{0,3,6,9\\}$ dans $\\mathbb{Z}/12\\mathbb{Z}$\n(ordre 4, diviseur 3)', fontsize=10)

# Diagramme de Hasse des sous-groupes de Z/12Z
ax2 = axes[1]
# ordre des sous-groupes = n/d, on place selon l'ordre
positions = {12: (2, 4), 6: (1, 3), 4: (3, 3), 3: (1, 2), 2: (3, 2), 1: (2, 1)}
inclusions = [(12, 6), (12, 4), (6, 3), (6, 2), (4, 2), (3, 1), (2, 1)]

for (big, small) in inclusions:
    x1, y1 = positions[big]
    x2, y2 = positions[small]
    ax2.plot([x1, x2], [y1, y2], 'k-', alpha=0.5, lw=1.5)

for d, (x, y) in positions.items():
    sg_elems = sous_groupes[d]
    order = n // d
    ax2.scatter([x], [y], s=800, color='#3498db', alpha=0.7, zorder=5)
    ax2.text(x, y, f'$\\langle {d} \\rangle$\nord.{order}', ha='center', va='center', fontsize=8, color='white', fontweight='bold')

ax2.set_xlim(0, 4); ax2.set_ylim(0, 5)
ax2.axis('off')
ax2.set_title('Treillis des sous-groupes de $\\mathbb{Z}/12\\mathbb{Z}$\n(ordonné par inclusion)', fontsize=11)

plt.tight_layout()
plt.show()
_images/198c910fa8c5dbf308ba7dc9b14868f7b734f1215fd6a5fb2b16f5be5168ae48.png

Anneau#

Définition 33 (Anneau)

\((A, +, \cdot)\) est un anneau si :

  1. \((A, +)\) est un groupe abélien (neutre \(0_A\))

  2. \((A, \cdot)\) est un monoïde (neutre \(1_A\), associatif)

  3. La multiplication est distributive par rapport à l’addition

Un anneau est commutatif si \(\cdot\) est commutative. Un anneau intègre est un anneau commutatif sans diviseur de zéro.

Proposition 26 (Propriétés immédiates)

Dans tout anneau \((A, +, \cdot)\) :

  • \(a \cdot 0_A = 0_A \cdot a = 0_A\)

  • \((-a) \cdot b = a \cdot (-b) = -(a \cdot b)\)

  • \((-a)(-b) = ab\)

Proof. \(a \cdot 0_A = a \cdot (0_A + 0_A) = a \cdot 0_A + a \cdot 0_A\). Par régularité additive : \(a \cdot 0_A = 0_A\).

\(a \cdot b + a \cdot (-b) = a \cdot (b + (-b)) = a \cdot 0_A = 0_A\), donc \(a \cdot (-b) = -(ab)\).

\((-a)(-b) = -(a \cdot (-b)) = -(-(ab)) = ab\).

Sous-anneau et idéal#

Définition 34 (Idéal)

Un idéal à gauche de \(A\) est un sous-groupe \((I, +)\) de \((A, +)\) tel que \(\forall a \in A, \forall x \in I, ax \in I\). Un idéal bilatère (souvent appelé juste idéal) satisfait de plus \(xa \in I\).

Exemple 15

Dans \(\mathbb{Z}\), tout idéal est de la forme \(n\mathbb{Z}\). Dans \(\mathcal{M}_n(\mathbb{R})\), les matrices à trace nulle forment un sous-espace vectoriel mais pas un idéal.

Définition 35 (Anneau quotient)

Si \(I\) est un idéal bilatère de \(A\), le groupe quotient \(A/I\) est un anneau pour la multiplication \((a + I)(b + I) = ab + I\).

Exemple 16

\(\mathbb{Z}/n\mathbb{Z}\) est l’anneau quotient de \(\mathbb{Z}\) par l’idéal \(n\mathbb{Z}\). C’est un corps si et seulement si \(n\) est premier.

Morphisme d’anneaux#

Définition 36 (Morphisme d’anneaux)

\(f : A \to B\) est un morphisme d’anneaux si \(f(a + b) = f(a) + f(b)\), \(f(ab) = f(a)f(b)\) et \(f(1_A) = 1_B\).

Proposition 27 (Premier théorème d’isomorphisme pour les anneaux)

Si \(f : A \to B\) est un morphisme d’anneaux, \(A/\ker(f) \cong f(A)\).

Corps#

Définition 37 (Corps)

\((K, +, \cdot)\) est un corps si c’est un anneau et si \((K \setminus \{0\}, \cdot)\) est un groupe (tout élément non nul est inversible).

Un corps est commutatif si la multiplication est commutative (en France, « corps » désigne souvent un corps commutatif).

Exemple 17

  • \(\mathbb{Q}\), \(\mathbb{R}\), \(\mathbb{C}\) : corps commutatifs.

  • \(\mathbb{Z}/p\mathbb{Z}\) pour \(p\) premier : corps fini à \(p\) éléments (noté \(\mathbb{F}_p\)).

  • \(\mathbb{H}\) (quaternions) : corps non commutatif.

  • \(\mathbb{Z}\) : anneau mais pas corps (\(2\) non inversible).

Proposition 28 (Corps finis)

Pour tout premier \(p\) et tout \(n \geq 1\), il existe un unique corps (à isomorphisme près) à \(p^n\) éléments, noté \(\mathbb{F}_{p^n}\) ou \(GF(p^n)\).

Remarque 15

Il n’existe pas de corps fini d’ordre \(n\) si \(n\) n’est pas une puissance d’un nombre premier. Par exemple, il n’existe pas de corps à 6 éléments.

Résumé de la hiérarchie#

Remarque 16

Structure

Opération(s)

Propriétés clés

Magma

\(\star\)

Stabilité

Semi-groupe

\(\star\)

+ Associativité

Monoïde

\(\star\)

+ Neutre

Groupe

\(\star\)

+ Inverses

Groupe abélien

\(\star\)

+ Commutativité

Anneau

\(+\), \(\cdot\)

Groupe ab. + Monoïde + Distrib.

Anneau intègre

\(+\), \(\cdot\)

+ Pas de div. de zéro

Corps

\(+\), \(\cdot\)

+ Inverses multiplicatifs

Hide code cell source

# Diagramme de la hiérarchie des structures algébriques
fig, ax = plt.subplots(figsize=(12, 8))
ax.set_xlim(0, 10); ax.set_ylim(0, 9)
ax.axis('off')

structures = {
    'Magma':           (5, 8),
    'Semi-groupe':     (5, 7),
    'Monoïde':         (5, 6),
    'Groupe':          (5, 5),
    'Groupe abélien':  (5, 4),
    'Anneau':          (3, 3),
    'Corps':           (3, 1.5),
    'Anneau\nintègre': (5.5, 2),
    'Ann. commutatif': (4.3, 2.5),
}

colors_struct = {
    'Magma': '#ecf0f1',
    'Semi-groupe': '#d5dbdb',
    'Monoïde': '#aab7b8',
    'Groupe': '#5dade2',
    'Groupe abélien': '#2e86c1',
    'Anneau': '#e67e22',
    'Corps': '#c0392b',
    'Anneau\nintègre': '#f39c12',
    'Ann. commutatif': '#e59866',
}

edges_struct = [
    ('Magma', 'Semi-groupe', '+ assoc.'),
    ('Semi-groupe', 'Monoïde', '+ neutre'),
    ('Monoïde', 'Groupe', '+ inverses'),
    ('Groupe', 'Groupe abélien', '+ commut.'),
    ('Groupe abélien', 'Anneau', '+ $\\times$, distrib.'),
    ('Anneau', 'Ann. commutatif', '+ commut. $\\times$'),
    ('Ann. commutatif', 'Anneau\nintègre', '+ intègre'),
    ('Ann. commutatif', 'Corps', '+ inverses $\\times$'),
]

for (src, dst, label) in edges_struct:
    x1, y1 = structures[src]
    x2, y2 = structures[dst]
    ax.annotate('', xy=(x2, y2+0.3), xytext=(x1, y1-0.3),
               arrowprops=dict(arrowstyle='->', color='#555', lw=1.5))
    xm, ym = (x1+x2)/2, (y1+y2)/2
    ax.text(xm+0.2, ym, label, fontsize=8, color='#666')

for name, (x, y) in structures.items():
    color = colors_struct.get(name, '#ecf0f1')
    ax.add_patch(FancyBboxPatch((x-1.0, y-0.35), 2.0, 0.7,
                  boxstyle='round,pad=0.05', facecolor=color,
                  edgecolor='#555', lw=1.5))
    ax.text(x, y, name, ha='center', va='center', fontsize=10, fontweight='bold')

# Exemples
examples = {
    'Groupe abélien': ('$\\mathbb{Z}, \\mathbb{R}, \\mathbb{C}$', 8.0, 4),
    'Groupe':         ('$S_n, GL_n$', 8.0, 5),
    'Anneau':         ('$\\mathbb{Z}, \\mathcal{M}_n$', 1.5, 3),
    'Corps':          ('$\\mathbb{Q}, \\mathbb{R}, \\mathbb{F}_p$', 1.5, 1.5),
}
for name, (ex, x, y) in examples.items():
    ax.text(x, y, ex, fontsize=9, color='#888', style='italic')

ax.set_title('Hiérarchie des structures algébriques', fontsize=14, fontweight='bold', y=0.99)
plt.tight_layout()
plt.show()
_images/e09d118e97ada44e95fd823306180a163e7bffb1821982a6bc59e1f9364ebf6f.png

Hide code cell source

# Corps Z/pZ : table de multiplication pour p=5
fig, axes = plt.subplots(2, 1, figsize=(9, 9))

p = 5
mult_table = np.array([[(i * j) % p for j in range(p)] for i in range(p)])
add_table  = np.array([[(i + j) % p for j in range(p)] for i in range(p)])

for ax, table, title in [(axes[0], add_table, f'Addition dans $\\mathbb{{F}}_{p}$'),
                          (axes[1], mult_table, f'Multiplication dans $\\mathbb{{F}}_{p}$')]:
    im = ax.imshow(table, cmap='Blues', vmin=0, vmax=p-1)
    ax.set_xticks(range(p)); ax.set_yticks(range(p))
    ax.set_xticklabels(range(p)); ax.set_yticklabels(range(p))
    ax.set_title(title, fontsize=12, fontweight='bold')
    for i in range(p):
        for j in range(p):
            v = table[i, j]
            ax.text(j, i, str(v), ha='center', va='center',
                   fontsize=13, color='white' if v >= p//2 else 'black', fontweight='bold')

plt.suptitle(f'Corps fini $\\mathbb{{F}}_{p} = \\mathbb{{Z}}/{p}\\mathbb{{Z}}$ ($p = {p}$ premier)',
             fontsize=13, fontweight='bold')
plt.tight_layout()
plt.show()
_images/68d3fb3023b01916df9ab909fd10d3a9432f4f1c1e5e6d3bdb57b4463424b367.png