Implémentation de l'arithmétique modulaire pour les entiers et les polynômes.
Le répertoire lib
contient le code de la librairie statique libmod
. Pour compiler la librairie depuis la racine :
make lib/libmod.a
Quatre arithmétiques différentes sont implémentées :
-
integer
: arithmétique d'entiers -
modint
: arithmétique d’entiers modulo un entier m -
modpoly
: arithmétique de polynômes à coefficients dans Z/mZ -
modpolyp
: arithmétique de polynômes modulo un polynôme P
La librairie contient aussi :
-
extendedGcdInt
: algorithme d’Euclide étendu pour les entiers -
extendedGcdPoly
: algorithme d'Euclide étendu pour les polynômes à coefficients dans Z/mZ
La librairie définit les quatre types suivants :
integer
: entier de 32 bitsmodulus
: entier modulo de 32 bitspolynomial
: polynôme d'entiersdegree
: degré d'un polynôme
Les fichiers fps
définissent des fonctions pour manipuler les séries formelles.
Le type fps
permet de définir une série formelle tronquée, et prec
renseigne sa précision.
Les fichiers polytree
définissent les arbres de polynômes permettant l'implémentation des algorithmes rapides suivants pour les polynômes à coefficients dans Z/mZ :
mp_fast_multipoint_eval
: évaluation multipoint rapidemp_fast_interpolation
: interpolation rapide
Les arbres peuvent être exportés au format dot et visualisés avec Graphviz. Exemples :
Les fichiers matrix
définissent les matrices d'entiers.
Le type matrix
permet de définir une matrice et dim
représente une dimension.
Les matrices d'entiers sont utilisées dans les fonctions suivantes :
p_sylvester
: retourne la matrice de Sylvester de deux polynômesp_resultant
: calcule le résultant de deux polynômes (déterminant de la matrice de Sylvester)
Le répertoire examples
contient des exemples d'utilisation de la librairie libmod
.
- Pour compiler un exemple :
cd examples
make example01.out
- Pour compiler tous les exemples :
cd examples
make
Le README du répertoire examples
montre le rôle de chaque exemple.
Le répertoire src
contient les fonctions principales pour générer des exécutables utilisant la librairie libmod
.
Les exécutables sont créés dans le répertoire build
.
- Pour compiler tous les exécutables :
make
- Pour compiler l'exécutable extendedGcdInt.out :
cd src
make build/extendedGcdInt.out
Protocole similaire pour tous les exécutables ci-dessous.
Voici la liste des exécutables :
- extendedGcdInt.out : algorithme d'Euclide étendu pour les entiers. Exemple (source) :
== Extended Euclidean algorithm for integers ==
a = 240
b = 46
== Iteration 0 ==
(r, u, v) = (240, 1, 0)
== Iteration 1 ==
(r, u, v) = (46, 0, 1)
== Iteration 2 ==
(r, u, v) = (10, 1, -5)
== Iteration 3 ==
(r, u, v) = (6, -4, 21)
== Iteration 4 ==
(r, u, v) = (4, 5, -26)
== Result ==
(r, u, v) = (2, -9, 47)
- extendedGcdPoly.out : algorithme d'Euclide étendu pour les polynômes à coefficients dans Z/mZ. Exemple (source) :
== Extended Euclidean algorithm for polynomials ==
Degree of A: 8
A[0] = 1
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1
A[5] = 0
A[6] = 0
A[7] = 0
A[8] = 1
Degree of B: 6
B[0] = 1
B[1] = 1
B[2] = 0
B[3] = 0
B[4] = 1
B[5] = 0
B[6] = 1
Modulus: 2
A = X^8 + X^4 + X^3 + X + 1
B = X^6 + X^4 + X + 1
== Iteration 0 ==
R = X^8 + X^4 + X^3 + X + 1
U = 1
V = 0
== Iteration 1 ==
R = X^6 + X^4 + X + 1
U = 0
V = 1
== Iteration 2 ==
R = X^2
U = 1
V = X^2 + 1
== Iteration 3 ==
R = X + 1
U = X^4 + X^2
V = X^6 + X^2 + 1
== Result ==
R = 1
U = X^5 + X^4 + X^3 + X^2 + 1
V = X^7 + X^6 + X^3 + X
- evalPoly.out : évaluation d'un polynôme en un point dans Z/mZ. Exemple :
== Polynomial evaluation ==
Degree of P: 3
P[0] = 4
P[1] = 1
P[2] = 2
P[3] = 1
Modulus: 7
P = X^3 + 2 X^2 + X + 4
X = 2
P(2) = 1
- multipointEvalPoly.out : évaluation multipoint d'un polynôme dans Z/mZ. Exemple :
== Polynomial multipoint evaluation ==
Degree of P: 3
P[0] = 4
P[1] = 1
P[2] = 2
P[3] = 1
Modulus: 7
P = X^3 + 2 X^2 + X + 4
n = 4
x0 = 2
x1 = 5
x2 = 3
x3 = 4
== Result ==
P(2) = 1
P(5) = 2
P(3) = 3
P(4) = 6
- euclideanDivisionPoly.out : division euclidienne de polynômes à coefficients dans Z/mZ. Exemple :
== Euclidean division of polynomials ==
Degree of P: 4
P[0] = 9
P[1] = 1
P[2] = 4
P[3] = 7
P[4] = 1
Degree of D: 3
D[0] = 2
D[1] = 1
D[2] = 1
D[3] = 10
Modulus: 11
P = X^4 + 7 X^3 + 4 X^2 + X + 9
D = 10 X^3 + X^2 + X + 2
== Results ==
Q = 10 X + 3
R = 2 X^2 + 3
- interpolationPoly.out : interpolation de Lagrange dans Z/mZ. Exemple :
== Polynomial interpolation ==
Modulus: 7
n = 4
x0 = 2
y0 = 1
x1 = 5
y1 = 2
x2 = 3
y2 = 3
x3 = 4
y3 = 6
Lagrange polynomial:
L = X^3 + 2 X^2 + X + 4
Verification:
L(2) = 1
L(5) = 2
L(3) = 3
L(4) = 6
Voici la liste des algorithmes implémentés (ou à faire) :
- Algorithme d'Euclide étendu (pour les entiers et les polynômes)
- Méthode de Ruffini-Horner
- Évaluation multipoint rapide
- Interpolation lagrangienne
- Interpolation rapide
- Algorithme de Wiedemann
- Algorithme de remontée de Hensel
- Algorithme de Berlekamp
La documentation peut être générée par doxygen
avec la commande :
make docs
Il suffit ensuite d'aller à l'adresse docs/html/index.html
.
Pour supprimer la documentation :
make cleandocs
Le répertoire tests
contient des tests unitaires de la librairie libmod
.
Ces tests sont réalisés par le framework MinUnit.