Inscription / Connexion Nouveau Sujet
Niveau Prepa (autre)
Partager :

python

Posté par
nullptr19
23-01-21 à 11:37

Bonjour à toutes et à tous , voici que j'arrive au terme d'une longue série de TP python , et je clôture par la programmation du théorème chinois , il m'est demandé de distinguer 3 cas .

1. k=1
2.k=2
3. k>2 (k=n)

je sais que Euclide étendu joue un rôle décisif pour trouver les restes chinois notamment pour k=1 , j'ai donc besoin de la fonction qui permet de calculer le pgcd et l'autre qui me renvoie les coeff de Bézout , sauf que pour le cas 1. je ne sais pas comment récupérer le coefficient de Bézout qui m'intéresse , sachant que dans la fonction concerné les coefficient de Bézout sont renvoyé sous forme de liste , je lai fait ainsi en espérant que ce serait plus facile de récupérer , mais je n'y arrive pas j'ai eu quelques indications sur le net avec "args" mais je sais pas trop comment ça marche .

j'ai pas encore commencé le programme , je vois pas comment faire je but des le début .
merci de me donner juste quelques indices je vois pas trop comment faire

Posté par
carpediem
re : python 23-01-21 à 11:39

salut

qui est k ?

Posté par
nullptr19
re : python 23-01-21 à 11:39

le nombre d' équations

Posté par
flight
re : python 23-01-21 à 13:55

salut

l'enoncé est vraiment mal posé  , mais bon  vois ici :

Posté par
nullptr19
re : python 23-01-21 à 14:02

flight merci , bon je vais essayer de bricoler quelques chose ,

Posté par
flight
re : python 23-01-21 à 14:04

..c'est quasiment une recette de cuisine à programmer

Posté par
nullptr19
re : python 23-01-21 à 14:04

du coup ma fonction au départ doit prendre arg en paramètre n'est ce pas ?

Posté par
flight
re : python 23-01-21 à 14:04

tiens pour m'amuser je vais le faire

Posté par
nullptr19
re : python 23-01-21 à 14:04

pour au moins pouvoir mettre le nombre de paramètre souhaités

Posté par
flight
re : python 23-01-21 à 14:08

la seule petite difficulté réside dans le fait de trouver les Mi tel que  yi = Mi-1modulo mi  ...mais c'est jouable

Posté par
nullptr19
re : python 23-01-21 à 14:10

mais Euclide étendu le règle très bien , non ?

Posté par
flight
re : python 23-01-21 à 16:35

pas vraiment utile Euclide pour la partie programmation
j'ai pu réaliser un programme qui fait tout ca avec un nombre d'équations à choisir .

je peux pas te donner une solution toute faite sur le site au risque d'etre puni par les modo .
par contre si tu rencontre une étape du type résoudre  a.yi=1[b]   pour rechercher yi
tu peux procéder ainsi : (j'ai fais ça en vba mais le principe est le même dans les autres langages:

Citation :
k=0
Do
k = k + 1
Loop Until (b * k + 1) Mod a = 0
yi= (b * k + 1) / a


à toute fin utile ...
  

Posté par
verdurin
re : python 23-01-21 à 16:57

Bonsoir,
je crois que l'énoncé suggère une solution récursive.
Si on a une équation de la forme x\equiv a \mod n les solutions sont évidentes.

Si on a deux équations \begin{cases}x\equiv a_0 \mod n_0\\x\equiv a_1 \mod n_1\end{cases} on a deux cas possibles

      -- le système a une solution de la forme x\equiv a \mod n
      -- le système n'a pas de solution.

Si on a plus de deux équations on résout le système formé par les deux premières ( ou les deux dernières ou deux prises suivant un critère quelconques ) ;
      si ce système n'a pas de solutions, le système de départ n'en a pas non plus,
      si il en a une on remplace les deux équations par leur solution et on résout le nouveau système.

Pour l'algorithme d'Euclide étendu tu peux regarder Wikipédia

Posté par
mathafou Moderateur
re : python 23-01-21 à 17:39

bonjour,

Citation :
pas vraiment utile Euclide pour la partie programmation

je ne suis pas d'accord

calcul de l'inverse avec Euclide étendu (en JavaScript (copier collé d'un de mes vieux scripts)

// calcul de l'inverse de a modulo m
function inv(a,m) {
  var aa,bb,q,r, x2, x1, xx;
  aa=a; bb=m;
  x2=-1; x1=0;
  while (bb!=0) {
    q=Math.floor(aa/bb); r=aa%bb;
    aa=bb; bb=r
    xx = -q*x1 + x2;
    x2= x1; x1=xx;
    }
  return (m-x2)%m;
}


largement pas optimisé du point de vue écriture, et fait n'importe quoi si PGCD(a,m) ≠ 1
(manque un test avant le return, et décider quoi renvoyer si ce test échoue car pas d'inverse)

"Euclide étendu" évite de remonter ensuite pour obtenir les "coefficients de Bézout" alias solutions de ax + by = 1
tout se fait dans la même boucle avec des variables supplémentaires ici x2 et x1
en Python on peut largement condenser ça avec des "tuples".

notons aussi une variante qui dans la même boucle effectue cette "division euclidienne" sur des lignes de matrices
résolvant ainsi un système de n équations linéaires de Diophante à p inconnues
les restes chinois étant un cas particulier où n = p-1
par exemple 2 équations à 3 inconnues x et k, m :
x = a0 + k n0
x = a1 + m n1

cette méthode est un peu hors de propos ici, ça emmènerait trop loin.

Posté par
nullptr19
re : python 23-01-21 à 18:26

Merci pour vos retours  , je suis en train de le coder ce programme , je tiens bien compte de vos remarques , je reviendrai vers vous après avoir bien avancé dans le programme pour l'instant je suis dans le cas d'une solutions , .

Posté par
nullptr19
re : python 23-01-21 à 19:45

mathafou pour le calcul de l'inverse modulaire j'ai pu le coder sans utiliser Euclide étendu , je reviens

Posté par
nullptr19
re : python 23-01-21 à 19:51

def InverseModulaire(x,p):
    for n in range(p):
        if (x * n) % p == 1:
            return n
        elif n == p - 1:
            return "Null"
        else:
            continue


voici pour l'inverse modulaire

Posté par
nullptr19
re : python 23-01-21 à 19:54

en fait pour vous dire je comprend le procédé ou du moins à peu prés sauf que j'ai un problème au niveau des paramètres de ma fonction , puisque c'est appelé à ne pas rester constant c'est à dire que je pourrai avoir un système a un nombre voulu d'équation , que puis je donc mettre en paramètre  cette phase me gène

Posté par
mathafou Moderateur
re : python 23-01-21 à 20:06

on peut balayer les entiers un par un comme le propose flight ... ça marche
quant à l'efficacité ...
ça marchera très bien avec des nombres jusqu'à quelques milliers / millions
mais calculer l'inverse de 457896512 modulo 719925474157 ?
ça donne quoi les ≈ 1012 boucles exécutée avant de le trouver ?
(exemple véridique, l'inverse est 715912543778 obtenu en seulement 13 boucles de Euclide)

Posté par
mathafou Moderateur
re : python 23-01-21 à 20:24

pour le nombre variable de paramètres d'une fonction en Python, il faut donner une liste en guise de paramètres.

Posté par
nullptr19
re : python 23-01-21 à 20:37

mathafou concernat le code que j'ai proposé ce que vous me dite c'est que il marche certes pour les petits nombres mais pour de très gros nombres mon code ne serait pas fiable en terme d'efficacité ?

Posté par
mathafou Moderateur
re : python 23-01-21 à 21:11

c'est ce que j'ai dit .

maintenant on peut s'en contenter (après tout il n'y a pas que ce bout là à coder ! et ce n'est qu'un exercice)
de toute façon des très grands nombres vont se heurter à des problèmes de débordement de taille des nombres en machine, que ce soit avec une méthode ou une autre.

par contre return soit un nombre soit un texte, ("Null" est un texte !)
ce n'est pas très pratique à utiliser.
pour dire que ce n'est pas possible on pourrait plutôt par exemple renvoyer le nombre 0, vu qu'il ne peut pas être l'inverse de quoi que ce soit.

Posté par
nullptr19
re : python 23-01-21 à 23:32

pour une équation j'y arrive

def InverseModulaire(a,m):
    aa=a; bb=m
    x2=-1; x1=0
    while (bb!=0):
        q=aa//bb; r=aa%bb
        aa=bb ; bb=r
        xx = -q*x1 + x2
        x2= x1; x1=xx 
    return (m-x2)%m

def ChinoixReste1(a,b,mod):

    if pgcd(a,mod)!=1:

        return False
    return (InverseModulaire(a,mod)*b)%mod
print(ChinoixReste1(7,8,9))

Posté par
nullptr19
re : python 24-01-21 à 02:14

pour un système de deux équations je ne comprend pas correctement ce vous me demandez de faire , je pense que j'aurais besoins de 4 paramètres pour ce code .

en fait si vous voulez , il a été demandé de coder le cas d'une équation , le cas de deux équation , ensuite le cas >2 , sachant qu'en pratique on se remmène souvent à résoudre deux équations dans un premier temps et de refaire la même chose

Posté par
verdurin
re : python 24-01-21 à 18:33

Je crois que ton objectif est mal défini.
C'est pratiquement ce qu'il y a de pire en informatique.

Quand on parle d'utiliser le théorème chinois on a, en principe, une liste d'équations de la forme x\equiv a_i \mod n_i avec les n_i premiers entre eux deux à deux.

J'ai l'impression que ta fonction "ChinoixReste1" résout une équation du type ax\equiv b \mod n.
C'est hors sujet.

Pour trouver les solutions de
\begin{cases}x\equiv a_0 \mod n_0\\x\equiv a_1 \mod n_1\end{cases}
avec n_0 et n_1 premiers entre eux tu peux  regarder Wikipédia théorème des restes chinois dans la partie algorithme.

Et je crois vraiment que tu devrais préciser ton problème.

Posté par
mathafou Moderateur
re : python 24-01-21 à 18:49

je ne disais rien de plus que

Citation :
j'ai eu quelques indications sur le net avec "args" mais je sais pas trop comment ça marche
.
si je veux par exemple une fonction qui résout un nombre quelconque de congruences de la forme x = ai [mi]
par exemple pour
x =5 [6]
x =7 [10]
x=2 [7]
j'appellerais ma fonction avec chinois(5, 6, 7, 10, 2, 7)
et elle devra me renvoyer (107, 210) c'est à dire x = 107 [210]
comme on ne sait pas le nombre de paires de valeurs (le nombre de congruences) on définit les paramètres d'appels ainsi :

def chinois(*T) :
   ici T est un tuple contenant l'ensemble des valeurs lors de l'appel

pour pouvoir retirer ou ajouter ou remplacer des éléments au cours de l'exécution de la fonction (par exemple lors d'appels récursifs suggérés par verdurin, ou d'une simple boucle while qui diminue de une équation à chaque boucle)
on peut transformer ce tuple en liste (muable) :
L =list(T)
ou vice versa : T1 = tuple(L)

Posté par
verdurin
re : python 24-01-21 à 19:41

Salut mathafou.
J'ai écrit une fonction qui marche en passant deux listes comme paramètres : la liste des  restes et la liste des modules.
Ces listes doivent avoir la même longueur.

Un petit défi pour flight : trouver les solutions de

\begin{cases}x\equiv 22222 \mod 524287\\x\equiv 111111 \mod 2147483647\end{cases}



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1674 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !