Arithmétique modulaire
Nous avons déjà vu des exemples d’entiers modulaires au cours des séances de TD précédentes. Par exemple, nous avons travaillé avec les anneaux et lorsque nous avons étudié le chiffre de Hill et le chiffre VIC, et avec le corps lorsque nous avons étudié les Codes linéaires.
Nous allons maintenant étudier plus en profondeur l’arithmétique des entiers modulaires pour un quelconque.
Structure additive
-
Lesquelles des égalités suivantes sont vraies? Lesquelles sont fausses?
-
Calculer les produits suivants
-
Calculer les tables d’addition et de multiplication de .
Jusqu’ici on s’est largement servi des propriétés de sans les démontrer: le moment est arrivé de vérifier que nos calculs sont bien fondés.
-
Soit un entier quelconque, montrer les deux propriétés suivantes:
- Si alors pour tout entier on a ,
- Si alors pour tout entier on a .
Structure multiplicative
Voici la table de multiplication de . À partir de maintenant on va arrêter d’écrire partout: lorsque le module est clair du contexte, on se contentera d’écrire , plutôt que .
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
2 | 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 1 | 3 | 5 | 7 | 9 | 11 | 13 |
3 | 0 | 3 | 6 | 9 | 12 | 0 | 3 | 6 | 9 | 12 | 0 | 3 | 6 | 9 | 12 |
4 | 0 | 4 | 8 | 12 | 1 | 5 | 9 | 13 | 2 | 6 | 10 | 14 | 3 | 7 | 11 |
5 | 0 | 5 | 10 | 0 | 5 | 10 | 0 | 5 | 10 | 0 | 5 | 10 | 0 | 5 | 10 |
6 | 0 | 6 | 12 | 3 | 9 | 0 | 6 | 12 | 3 | 9 | 0 | 6 | 12 | 3 | 9 |
7 | 0 | 7 | 14 | 6 | 13 | 5 | 12 | 4 | 11 | 3 | 10 | 2 | 9 | 1 | 8 |
8 | 0 | 8 | 1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 |
9 | 0 | 9 | 3 | 12 | 6 | 0 | 9 | 3 | 12 | 6 | 0 | 9 | 3 | 12 | 6 |
10 | 0 | 10 | 5 | 0 | 10 | 5 | 0 | 10 | 5 | 0 | 10 | 5 | 0 | 10 | 5 |
11 | 0 | 11 | 7 | 3 | 14 | 10 | 6 | 2 | 13 | 9 | 5 | 1 | 12 | 8 | 4 |
12 | 0 | 12 | 9 | 6 | 3 | 0 | 12 | 9 | 6 | 3 | 0 | 12 | 9 | 6 | 3 |
13 | 0 | 13 | 11 | 9 | 7 | 5 | 3 | 1 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |
14 | 0 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
-
Quel est l’inverse (multiplicatif) de 2, 4, 7?
-
Trouver un élément qui n’a pas d’inverse multiplicatif.
-
Combien d’éléments contient (le groupe des éléments inversibles de )?
-
Calculer , et .
Pour tout élément inversible , on définit son ordre comme la plus petite puissance telle que .
-
Quel est l’ordre de 2? de 13?
-
Sans écrire de table de multiplication, calculer l’ordre de . Calculer .
Un peu d’algorithmique
Pas de squelette pré-remplie, cette fois-ci: ces programmes sont trop simples!
Exponentiation binaire
-
Écrivez un programme qui prend en entrée trois entiers , et et qui calcule . Ne vous servez pas de la fonction
Math.pow
(ou de toute autre fonction de librairie Java). -
Calculez la complexité de votre algorithme: à et fixés, combien de multiplications fait-il?
Sans doute, vous avez utilisé une boucle for
pour résoudre le point
précédent, ce qui vous a donné un algorithme de complexité
linéaire. On peut faire beaucoup mieux en utilisant l’exponentiation
binaire.
L’idée de l’exponentiation binaire consiste à écrire en base 2 et à utiliser les propriétés des puissances. Vous avez déjà appliqué cet algorithme de façon intuitive lorsque vous avez fait des calculs à la main, par exemple:
Plutôt que faire 14 multiplications, vous n’avez donc qu’à calculer les éléments suivants (trois multiplications):
- ,
- ,
- ,
- ,
et à multiplier entre eux ceux qui apparaissent dans le produit (deux multiplications, dans ce cas).
Plus généralement, l’algorithme d’exponentiation binaire gauche-droite calcule de la façon suivante:
- Si alors
- calculer ,
- ;
- Sinon
- calculer ,
- .
-
Écrivez l’algorithme d’exponentiation binaire en utilisant une fonction récursive.
-
Transformez l’algorithme précédent en un algorithme itératif (i.e. pas d’appel récursif, mais une boucle
for
ouwhile
à la place). -
Quelle est la complexité des deux algorithmes?
Calcul d’ordre naïf
On ne connaît pas d’algorithme vraiment efficace pour calculer l’ordre d’un élément . Une méthode vraiment (trop) simple consiste à énumérer toutes les puissances , , , … jusqu’à trouver un tel que .
- Écrivez un programme qui prend en entrée deux entiers et et qui calcule l’ordre de modulo . Quelle est sa complexité?