{ "cells": [ { "cell_type": "markdown", "id": "a35eeb9f-df70-4ab1-a243-2d2025888eb0", "metadata": {}, "source": [ "# Exercice 1\n", "2) Écrire une fonction qui prend en entrée n et x et qui calcule si possible l’inverse modulo n d’un nombre x. Vous pouvez pour cela utiliser la commande pow(a,b,c) de Python ou, si votre version de Python est trop vieille, la commande mod_inverse(a,b) de la librairie sympy.\n", "Vous aurez peut-être aussi l’usage de la commande gcd(a,b) de la librairie math." ] }, { "cell_type": "code", "execution_count": 4, "id": "cfbd26eb-d3d4-48e2-afb0-b601390cc4d4", "metadata": {}, "outputs": [], "source": [ "import math" ] }, { "cell_type": "code", "execution_count": 19, "id": "75966219-9371-4df9-ad40-a8100fca47c5", "metadata": {}, "outputs": [], "source": [ "def calcul_modulo(n, x) :\n", " if math.gcd(x,n) != 1 :\n", " return \"Le pgcd n'est pas égale à 1\"\n", " else :\n", " return pow(x, -1, mod=n)" ] }, { "cell_type": "code", "execution_count": 20, "id": "2803c754-77e2-4a23-b83d-5df43bf6d459", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(calcul_modulo(8,5))" ] }, { "cell_type": "code", "execution_count": 21, "id": "54326ddc-7fdf-4d13-92f9-c75b9a71693d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "print(calcul_modulo(5,3))" ] }, { "cell_type": "code", "execution_count": 22, "id": "c684d56b-9fab-45a8-a422-fd1392e6f280", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "print(calcul_modulo(11,4))" ] }, { "cell_type": "code", "execution_count": 23, "id": "ccd9ff86-7bd4-430f-a032-256fc51b7a37", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Le pgcd n'est pas égale à 1\n" ] } ], "source": [ "print(calcul_modulo(8,4))" ] }, { "cell_type": "markdown", "id": "c4aef01f-9b8e-46ec-b255-c611f9f64d21", "metadata": {}, "source": [ "## Exercice 2" ] }, { "cell_type": "code", "execution_count": 24, "id": "46534487-9c13-4d77-b362-10976f5eda01", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n" ] } ], "source": [ "print(calcul_modulo(17,66))" ] }, { "cell_type": "code", "execution_count": 25, "id": "2fc00a68-5c49-4e89-9558-a821f038eb2d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "print(calcul_modulo(11,102))" ] }, { "cell_type": "code", "execution_count": 26, "id": "6355d03c-9fe0-4b19-b159-b77c81232218", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(calcul_modulo(6,187))" ] }, { "cell_type": "markdown", "id": "8bf3422a-a84b-4c49-afe9-8c6e394ec263", "metadata": {}, "source": [ "3) Écrivez une fonction permettant d’effectuer ces calculs pour n’importe quelles équations modulaires satisfaisant les hypothèses du théorème des restes chinois, sur la donnée de la liste des restes et de la liste des modules. Vous aurez peut-être l’usage des opérateurs // (division entière) et % (reste modulaire) de Python." ] }, { "cell_type": "code", "execution_count": 53, "id": "8b85c20c-0720-4c0a-81e8-33db4b5b055c", "metadata": {}, "outputs": [], "source": [ "def TRC(listRest, listMod) :\n", " if len(listRest) != len(listMod):\n", " return \"Erreur, les lists ne font pas la meme taille\"\n", " \n", " n = 1\n", " somme = 0\n", " \n", " for i in range(0, len(listMod)) :\n", " n = n * listMod[i]\n", " if math.gcd(listMod[i-1],listMod[i]) != 1 :\n", " return \"erreur PGCD de \" + listMod[i-1] + \" et \" + listMod[i] + \" différent de 1\"\n", " for i in range(0, len(listMod)) :\n", " ai = listRest[i]\n", " ni = listMod[i]\n", " ei = (n//ni) * (calcul_modulo(ni,n//ni))\n", " somme = somme + ai * ei\n", " return somme % n" ] }, { "cell_type": "code", "execution_count": 54, "id": "b6ffcc2c-dde0-4e27-8807-c6336f440e14", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "785\n" ] } ], "source": [ "lr = [3, 4, 5]\n", "lm = [17, 11, 6]\n", "print(TRC(lr, lm))" ] }, { "cell_type": "code", "execution_count": 69, "id": "8aaa5a8b-aa93-4a0b-8fbb-b351c908cb7f", "metadata": {}, "outputs": [], "source": [ "def TRC(listRest, listMod):\n", " if len(listRest) != len(listMod):\n", " return \"Erreur, les listes n'ont pas la même taille\"\n", "\n", " n = math.prod(listMod)\n", " res = 0\n", "\n", " for ai, ni in zip(listRest, listMod): \n", " res += ai * (n//ni) * calcul_modulo(ni, n // ni)\n", "\n", " return res % n" ] }, { "cell_type": "code", "execution_count": 70, "id": "e0d02ef7-9bda-474f-8137-3209da4df274", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "785\n" ] } ], "source": [ "print(TRC(lr, lm))" ] }, { "cell_type": "code", "execution_count": 81, "id": "6ce01aee-04b6-4dae-a7d0-a46094b331ed", "metadata": {}, "outputs": [], "source": [ "def verif(mods):\n", " for i in range(0, len(mods)) :\n", " if math.gcd(mods[i-1],mods[i]) != 1 :\n", " return \"erreur PGCD de \" + str(mods[i-1]) + \" et \" + str(mods[i]) + \" différent de 1\"\n", " return \"Les modolus satisfait les conditions du TRC\"" ] }, { "cell_type": "code", "execution_count": 82, "id": "28906ad4-853f-4245-8671-10d5ec8e1c24", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Les modolus satisfait les conditions du TRC\n", "erreur PGCD de 3 et 6 différent de 1\n" ] } ], "source": [ "listMods = [3,5,7]\n", "listMods2 = [3,6,7]\n", "\n", "print(verif(listMods))\n", "print(verif(listMods2))" ] }, { "cell_type": "code", "execution_count": null, "id": "98e25038-6b84-42e0-87df-1c9f87793e70", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 }