{"id":25435775,"url":"https://github.com/quentin18/modular-arithmetic","last_synced_at":"2025-06-13T07:04:33.781Z","repository":{"id":112299499,"uuid":"340624237","full_name":"Quentin18/modular-arithmetic","owner":"Quentin18","description":"Implementation of modular arithmetic in C","archived":false,"fork":false,"pushed_at":"2021-04-07T16:34:53.000Z","size":216,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-15T01:11:32.433Z","etag":null,"topics":["arithmetic","extended-euclidean-algorithm","finite-field-arithmetics","formal-power-series","horner-scheme","lagrange-polynomial-interpolation","modular","polynomial-arithmetic","resultant","sylvester"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Quentin18.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-20T10:16:39.000Z","updated_at":"2022-06-02T02:00:01.000Z","dependencies_parsed_at":"2023-05-12T15:30:24.593Z","dependency_job_id":null,"html_url":"https://github.com/Quentin18/modular-arithmetic","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Quentin18/modular-arithmetic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quentin18%2Fmodular-arithmetic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quentin18%2Fmodular-arithmetic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quentin18%2Fmodular-arithmetic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quentin18%2Fmodular-arithmetic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Quentin18","download_url":"https://codeload.github.com/Quentin18/modular-arithmetic/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quentin18%2Fmodular-arithmetic/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259599320,"owners_count":22882353,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arithmetic","extended-euclidean-algorithm","finite-field-arithmetics","formal-power-series","horner-scheme","lagrange-polynomial-interpolation","modular","polynomial-arithmetic","resultant","sylvester"],"created_at":"2025-02-17T07:31:59.088Z","updated_at":"2025-06-13T07:04:33.763Z","avatar_url":"https://github.com/Quentin18.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Arithmétique modulaire\n\nImplémentation de l'arithmétique modulaire pour les entiers et les polynômes.\n\n## Librairie\n\nLe répertoire `lib` contient le code de la librairie statique `libmod`. Pour compiler la librairie depuis la racine :\n```\nmake lib/libmod.a\n```\n\n### Arithmétiques\n\nQuatre arithmétiques différentes sont implémentées :\n\n- [x] `integer` : arithmétique d'entiers\n- [x] `modint` : arithmétique d’entiers modulo un entier m\n- [x] `modpoly` : arithmétique de polynômes à coefficients dans Z/mZ\n- [x] `modpolyp` : arithmétique de polynômes modulo un polynôme P\n\nLa librairie contient aussi :\n- [x] `extendedGcdInt` : algorithme d’Euclide étendu pour les entiers\n- [x] `extendedGcdPoly` : algorithme d'Euclide étendu pour les polynômes à coefficients dans Z/mZ\n\nLa librairie définit les quatre types suivants :\n- `integer` : entier de 32 bits\n- `modulus` : entier modulo de 32 bits\n- `polynomial` : polynôme d'entiers\n- `degree` : degré d'un polynôme\n\n### Séries formelles\n\nLes fichiers `fps` définissent des fonctions pour manipuler les séries formelles.\nLe type `fps` permet de définir une série formelle tronquée, et `prec` renseigne sa précision.\n\n### Arbres de polynômes\n\nLes 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 :\n- `mp_fast_multipoint_eval` : évaluation multipoint rapide\n- `mp_fast_interpolation` : interpolation rapide\n\nLes arbres peuvent être exportés au format dot et visualisés avec [Graphviz](https://graphviz.org/). Exemples :\n![subproduct tree](img/s_tree.png)\n![remainder tree](img/r_tree.png)\n\n### Matrices d'entiers\n\nLes fichiers `matrix` définissent les matrices d'entiers.\nLe type `matrix` permet de définir une matrice et `dim` représente une dimension.\nLes matrices d'entiers sont utilisées dans les fonctions suivantes :\n- `p_sylvester` : retourne la [matrice de Sylvester](https://fr.wikipedia.org/wiki/Matrice_de_Sylvester) de deux polynômes\n- `p_resultant` : calcule le [résultant](https://fr.wikipedia.org/wiki/R%C3%A9sultant) de deux polynômes (déterminant de la matrice de Sylvester)\n\n## Exemples\n\nLe répertoire `examples` contient des exemples d'utilisation de la librairie `libmod`.\n- Pour compiler un exemple :\n```\ncd examples\nmake example01.out\n```\n- Pour compiler tous les exemples :\n```\ncd examples\nmake\n```\nLe README du répertoire `examples` montre le rôle de chaque exemple.\n\n## Exécutables\n\nLe répertoire `src` contient les fonctions principales pour générer des exécutables utilisant la librairie `libmod`.\n\n### Compilation\n\nLes exécutables sont créés dans le répertoire `build`.\n\n- Pour compiler tous les exécutables :\n```\nmake\n```\n- Pour compiler l'exécutable **extendedGcdInt.out** :\n```\ncd src\nmake build/extendedGcdInt.out\n```\nProtocole similaire pour tous les exécutables ci-dessous.\n\n### Description\n\nVoici la liste des exécutables :\n\n- **extendedGcdInt.out** : algorithme d'Euclide étendu pour les entiers. Exemple ([source](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Example)) :\n```\n== Extended Euclidean algorithm for integers ==\na = 240\nb = 46\n== Iteration 0 ==\n(r, u, v) = (240, 1, 0)\n== Iteration 1 ==\n(r, u, v) = (46, 0, 1)\n== Iteration 2 ==\n(r, u, v) = (10, 1, -5)\n== Iteration 3 ==\n(r, u, v) = (6, -4, 21)\n== Iteration 4 ==\n(r, u, v) = (4, 5, -26)\n== Result ==\n(r, u, v) = (2, -9, 47)\n```\n\n- **extendedGcdPoly.out** : algorithme d'Euclide étendu pour les polynômes à coefficients dans Z/mZ. Exemple ([source](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Example_2)) :\n```\n== Extended Euclidean algorithm for polynomials ==\nDegree of A: 8\nA[0] = 1\nA[1] = 1\nA[2] = 0\nA[3] = 1\nA[4] = 1\nA[5] = 0\nA[6] = 0\nA[7] = 0\nA[8] = 1\nDegree of B: 6\nB[0] = 1\nB[1] = 1\nB[2] = 0\nB[3] = 0\nB[4] = 1\nB[5] = 0\nB[6] = 1\nModulus: 2\nA = X^8 + X^4 + X^3 + X + 1\nB = X^6 + X^4 + X + 1\n== Iteration 0 ==\nR = X^8 + X^4 + X^3 + X + 1\nU = 1\nV = 0\n== Iteration 1 ==\nR = X^6 + X^4 + X + 1\nU = 0\nV = 1\n== Iteration 2 ==\nR = X^2\nU = 1\nV = X^2 + 1\n== Iteration 3 ==\nR = X + 1\nU = X^4 + X^2\nV = X^6 + X^2 + 1\n== Result ==\nR = 1\nU = X^5 + X^4 + X^3 + X^2 + 1\nV = X^7 + X^6 + X^3 + X\n```\n\n- **evalPoly.out** : évaluation d'un polynôme en un point dans Z/mZ. Exemple :\n```\n== Polynomial evaluation ==\nDegree of P: 3\nP[0] = 4\nP[1] = 1\nP[2] = 2\nP[3] = 1\nModulus: 7\nP = X^3 + 2 X^2 + X + 4\nX = 2\nP(2) = 1\n```\n\n- **multipointEvalPoly.out** : évaluation multipoint d'un polynôme dans Z/mZ. Exemple :\n```\n== Polynomial multipoint evaluation ==\nDegree of P: 3\nP[0] = 4\nP[1] = 1\nP[2] = 2\nP[3] = 1\nModulus: 7\nP = X^3 + 2 X^2 + X + 4\nn = 4\nx0 = 2\nx1 = 5\nx2 = 3\nx3 = 4\n== Result ==\nP(2) = 1\nP(5) = 2\nP(3) = 3\nP(4) = 6\n```\n\n- **euclideanDivisionPoly.out** : division euclidienne de polynômes à coefficients dans Z/mZ. Exemple :\n```\n== Euclidean division of polynomials ==\nDegree of P: 4\nP[0] = 9\nP[1] = 1\nP[2] = 4\nP[3] = 7\nP[4] = 1\nDegree of D: 3\nD[0] = 2\nD[1] = 1\nD[2] = 1\nD[3] = 10\nModulus: 11\nP = X^4 + 7 X^3 + 4 X^2 + X + 9\nD = 10 X^3 + X^2 + X + 2\n== Results ==\nQ = 10 X + 3\nR = 2 X^2 + 3\n```\n\n- **interpolationPoly.out** : interpolation de Lagrange dans Z/mZ. Exemple :\n```\n== Polynomial interpolation ==\nModulus: 7\nn = 4\nx0 = 2\ny0 = 1\nx1 = 5\ny1 = 2\nx2 = 3\ny2 = 3\nx3 = 4\ny3 = 6\nLagrange polynomial:\nL = X^3 + 2 X^2 + X + 4\nVerification:\nL(2) = 1\nL(5) = 2\nL(3) = 3\nL(4) = 6\n```\n\n## Algorithmes\n\nVoici la liste des algorithmes implémentés (ou à faire) :\n\n- [x] [Algorithme d'Euclide étendu](https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide_%C3%A9tendu) (pour les entiers et les polynômes)\n- [x] [Méthode de Ruffini-Horner](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Ruffini-Horner)\n- [x] Évaluation multipoint rapide\n- [x] [Interpolation lagrangienne](https://fr.wikipedia.org/wiki/Interpolation_lagrangienne)\n- [x] Interpolation rapide\n- [ ] [Algorithme de Wiedemann](https://en.wikipedia.org/wiki/Block_Wiedemann_algorithm)\n- [ ] [Algorithme de remontée de Hensel](https://fr.wikipedia.org/wiki/Lemme_de_Hensel)\n- [ ] [Algorithme de Berlekamp](https://fr.wikipedia.org/wiki/Algorithme_de_Berlekamp)\n\n## Documentation\n\nLa documentation peut être générée par `doxygen` avec la commande :\n```\nmake docs\n```\nIl suffit ensuite d'aller à l'adresse `docs/html/index.html`.\n\nPour supprimer la documentation :\n```\nmake cleandocs\n```\n\n## Tests\n\nLe répertoire `tests` contient des tests unitaires de la librairie `libmod`.\nCes tests sont réalisés par le framework [MinUnit](https://github.com/siu/minunit).\n\n## Auteur\n\n[Quentin Deschamps](mailto:quentindeschamps18@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquentin18%2Fmodular-arithmetic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquentin18%2Fmodular-arithmetic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquentin18%2Fmodular-arithmetic/lists"}