You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
7.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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 linverse modulo n dun 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 lusage 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 deffectuer ces calculs pour nimporte 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 lusage 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
}