Algèbre de Boole — Exercices

1. Repères historiques

En 1847, le britannique George Boole inventa un formalisme permettant d'écrire des raisonnements logiques : l'algèbre de Boole. La notion même d'informatique n'existait pas à l'époque, même si les calculs étaient déjà automatisés (penser à la Pascaline de 1642).

Bien plus tard, en 1938, l'américain Claude Shannon prouva que des circuits électriques peuvent résoudre tous les problèmes que l'algèbre de Boole peut elle-même résoudre.

L'algèbre de Boole définit des opérations dans un ensemble à deux éléments : 0 et 1, ou FAUX et VRAI, ou encore False et True en Python.
Les trois opérations fondamentales sont : la conjonction (ET), la disjonction (OU) et la négation (NON).

2.1 Conjonction (AND)

Notations : & · ET · and (Python) · a \wedge b · a \cdot b

Exercice 1 — Table de vérité de l'opérateur ET

Cliquez sur les cellules ? pour les faire basculer entre 0 et 1, puis validez.

aba \wedge b
00
?
01
?
10
?
11
?

Exercice 2 — Évaluation d'expressions Python (AND)

Évaluer les expressions suivantes :

>>> (1 + 2 == 3) and (7 + 1 == 8)
>>> (1 + 2 == 3) and (1 + 1 == 3)
(1 + 2 == 3) and (7 + 1 == 8)True (True AND True = True)
(1 + 2 == 3) and (1 + 1 == 3)False (True AND False = False)

Exercice 3 — Court-circuit de AND

Évaluer les expressions suivantes :

>>> (7 / 0 == 1) and (4 / 2 == 2)
>>> (1 + 1 == 3) and (7 / 0 == 2)
(7 / 0 == 1) and (4 / 2 == 2)ZeroDivisionError : la division par zéro est évaluée avant que AND puisse court-circuiter.
(1 + 1 == 3) and (7 / 0 == 2)False : Python évalue d'abord 1+1==3 qui vaut False. Grâce au court-circuit de AND, la seconde expression (division par zéro) n'est jamais évaluée.

2.2 Disjonction (OR)

Notations : | · OU · or (Python) · a \lor b · a + b

Exercice 4 — Table de vérité de l'opérateur OU

aba \lor b
00
?
01
?
10
?
11
?

Exercice 5 — Évaluation d'expressions Python (OR)

>>> n = 20
>>> (n % 10 == 0) or (n % 7 == 0)
>>> (n % 4 == 0) or (n % 5 == 0)
>>> (n % 7 == 0) or (n % 3 == 0)
(n % 10 == 0) or (n % 7 == 0)True (20%10=0 ✓)
(n % 4 == 0) or (n % 5 == 0)True (20%4=0 ✓ ET 20%5=0 ✓)
(n % 7 == 0) or (n % 3 == 0)False (20%7=6 ✗ ET 20%3=2 ✗)

Exercice 6 — Court-circuit de OR

>>> n = 20
>>> (n % 5 == 0) or (n % 0 == 0)
(n % 5 == 0) or (n % 0 == 0)True
La première expression n % 5 == 0 vaut True. Grâce au court-circuit de OR, Python n'évalue pas la seconde expression (qui provoquerait une ZeroDivisionError).

2.3 Négation (NOT)

Notations : ~ · NON · not (Python) · \lnot a · \overline{a}

Exercice 7 — Table de vérité de l'opérateur NON

a\lnot a
0
?
1
?

Exercice 8 — Évaluation d'une expression Python (NOT)

>>> n = 20
>>> not(n % 10 == 0)
n % 10 == 0 vaut True (20 est divisible par 10).
not(True)False

2.4 Quiz

Q1 — Parmi les quatre expressions suivantes, laquelle s'évalue en True ?


Q2 — Si a vaut False et b vaut True, que vaut not(a and b) ?


Q3 — On exécute le code suivant. Quelle est la valeur de d ?

a = 2
b = 3
c = a ** b
d = c % b

Q4 — x = 3, y = 4. Quelle expression s'évalue en True ?


Q5 — À quelle affectation est équivalent ce code (a, b entiers, c booléen) ?

if a == b:
    c = True
elif a > b + 10:
    c = True
else:
    c = False

Q6 — Sachant que not(a or b) vaut True, quelles peuvent être les valeurs de a et b ?


Q7 — Voici la table de vérité d'une formule form. Quelle est cette formule ?

abform
TrueTrueFalse
FalseTrueFalse
TrueFalseTrue
FalseFalseFalse

Q8 — Pour quelles valeurs de a, b et c, l'expression (a or b) and (not c) vaut-elle True ?


Q9 — a et b sont deux booléens. L'expression not(a and b) or a est équivalente à :


Q10 — Si A et B sont des booléens, quelle expression est équivalente à (not A) or B ?



3. Fonctions composées

3.1 Disjonction exclusive (XOR)

XOR = OU EXCLUSIF : vrai seulement si les deux opérandes sont différents.
x \oplus y = (x \wedge \lnot y) \lor (\lnot x \wedge y)

Exercice 9 — Table de vérité de XOR

ab a \wedge \lnot b \lnot a \wedge b a \oplus b
00
?
?
?
01
?
?
?
10
?
?
?
11
?
?
?

3.2 NON-ET (NAND)

NAND = NON ET : x \uparrow y = \lnot(x \wedge y)

Exercice 10 — Table de vérité de NAND

ab a \wedge b \lnot(a \wedge b)
00
?
?
01
?
?
10
?
?
11
?
?

3.3 NON-OU (NOR)

NOR = NON OU : x \downarrow y = \lnot(x \lor y)

Exercice 11 — Table de vérité de NOR

ab a \lor b \lnot(a \lor b)
00
?
?
01
?
?
10
?
?
11
?
?

4. Opérations sur les nombres binaires

Exercice 12 — Opérations bit à bit

Effectuer les opérations suivantes en binaire :

  1011011
& 1101010
---------
  ?
  1011011
& 1101010
---------
  1001010
  1011011
| 1010101
---------
  ?
  1011011
| 1010101
---------
  1011111
  1011011
^ 1010101
---------
  ?
  1011011
^ 1010101
---------
  0001110

Exercice 13 — Calculs bit à bit en Python

Expliquer les résultats obtenus :

>>> 12 & 7   # résultat : 4
>>> 12 | 7   # résultat : 15
>>> 12 ^ 5   # résultat : 9
12 & 7 = 4
12 = 0001100, 7 = 0000111
AND bit à bit : 0000100 = 4

12 | 7 = 15
12 = 0001100, 7 = 0000111
OR bit à bit : 0001111 = 15

12 ^ 5 = 9
12 = 0001100, 5 = 0000101
XOR bit à bit : 0001001 = 9

5. Chiffrement XOR

Le chiffre XOR est une méthode de chiffrement symétrique très efficace à implémenter. Associé au principe du masque jetable, c'est une solution cryptographiquement robuste.

Principe du chiffrement

Pour chiffrer "BONJOUR" avec le masque "LPOSADA" :

  1. Le masque doit être au moins aussi long que le message.
  2. Pour chaque position, on récupère les codes ASCII de la lettre du message et du masque.
  3. On soustrait 64 à chaque code (pour rester dans les lettres majuscules : A=1, B=2, …)
  4. On effectue le XOR des deux valeurs.
  5. On additionne 64 et on convertit en caractère ASCII.

Exemple : chiffrement de 'B' (pos. 0) avec la clé 'L'

ord('B') = 66  →  66 - 64 = 2
ord('L') = 76  →  76 - 64 = 12
2 ^ 12 = 14
14 + 64 = 78  →  chr(78) = 'N'
MessageMasquemsg−64clé−64XOR+64Résultat
B (66)L (76)2121478N
O (79)P (80)15163195_ (souligné)
N (78)O (79)1415165A
J (74)S (83)10192589Y
O (79)A (65)1511478N
U (85)D (68)2141781Q
R (82)A (65)1811983S

BONJOUR chiffré avec LPOSADA → N_AYNAQS

Propriété clé : appliquer deux fois le XOR avec le même masque redonne le message original (le déchiffrement utilise la même opération).

TP — Fonction de chiffrement XOR

Écrire une fonction chiffrement(message, masque) qui chiffre le message à l'aide du masque (en appliquant la transformation décrite ci-dessus).

Vérifier que chiffrement(chiffrement("BONJOUR", "LPOSADA"), "LPOSADA") redonne "BONJOUR".

def chiffrement(message, masque):
    resultat = ""
    for i in range(len(message)):
        code_msg = ord(message[i]) - 64
        code_cle = ord(masque[i % len(masque)]) - 64
        resultat += chr((code_msg ^ code_cle) + 64)
    return resultat

# Test
code = chiffrement("BONJOUR", "LPOSADA")
print(code)                          # N_AYNAQS
print(chiffrement(code, "LPOSADA")) # BONJOUR

6. Exercices avancés — Tables de vérité composées

Exercice A — a \wedge (\lnot a \lor b)

Établir la table de vérité de l'expression a ET (NON a OU b).

a b \lnot a \lnot a \lor b a \wedge (\lnot a \lor b)
00
?
?
?
01
?
?
?
10
?
?
?
11
?
?
?

Exercice B — \lnot a \lor \lnot(a \wedge b)

Établir la table de vérité de l'expression NON a OU NON(a ET b).

a b \lnot a \lnot(a \wedge b) \lnot a \lor \lnot(a \wedge b)
00
?
?
?
01
?
?
?
10
?
?
?
11
?
?
?

Exercice C — \lnot(a \lor \lnot c) \lor \lnot(b \wedge c)

Établir la table de vérité de l'expression NON(a OU NON c) OU NON(b ET c).

abc \lnot(a \lor \lnot c) \lor \lnot(b \wedge c)
000
?
001
?
010
?
011
?
100
?
101
?
110
?
111
?

Exercice D — \lnot(a \wedge b) \lor c

Établir la table de vérité de l'expression NON(a ET b) OU c.

abc \lnot(a \wedge b) \lor c
000
?
001
?
010
?
011
?
100
?
101
?
110
?
111
?