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

encore du python

Posté par
nullptr19
09-12-20 à 16:20

Bonjour à toutes et à tous , je suis toujours dans l'exploration du langage python et surtout de la traduction mathématique de certains problème en machine

faire un programme qui revoit un générateur de Z/pZ avec p premier . Voici ce que je propose , c'est le même procédé que l'exercice que j'ai posté hier  sur l'ordre ,sauf qu'il fait intervenir la primalité mon programme sur le test de primalité et je l'ai juste importé . Voici ce que ca donne:


from TestPrimalite import primalite
def Generateur (p):
    k=primalite(p)
    for i in range (2,p):
        
        if (i**(p-1))%p==1 and k is True :
            return i
    
    return False

print (Generateur(23))


juste besoin de savoir si j'ai bien compris le principe, merci .

Posté par
nullptr19
re : encore du python 09-12-20 à 16:24

mais ca me renvoit des résultats pas très claire  j'ai l'impression que quand je compile ca ne fait pas les instruction de la boucle ca prend à chaque fois le premier i

Posté par
nullptr19
re : encore du python 09-12-20 à 16:51

OOOHHH LALA !!! Je raconte des bêtises!!  oubliez   désolé , je pense qu'il me faut déjà faire intervenir la fonction phi d'Euler pour ,bof je me m'y met

Posté par
carpediem
re : encore du python 09-12-20 à 17:48

salut

je suppose que primalité (p) renvoie True si p est premier

ensuite tu parles donc d'un générateur du groupe multiplicatif (Z/pZ*, x)

il me semble que pour tout p <> 2 alors 2 convient ...

Posté par
nullptr19
re : encore du python 09-12-20 à 18:08

carpediem Bonsoir , effectivement True si p premier  , par-contre je comprend pas comme vous dite 2 convient ?  j'étais en train de chercher une solution depuis ,.

vous voulez dire que je dois mettre  ca comme condition ?

pour tout p<>2 and p<>2i ?

ou je comprend pas votre idée

Posté par
carpediem
re : encore du python 09-12-20 à 19:00

il me semble que tout élément autre que le neutre est un générateur de (Z/pZ*, x) lorsque p est premier ...puisque ce groupe est cyclique ...

Posté par
nullptr19
re : encore du python 09-12-20 à 19:08

oui du coup en machine ma boucle si je la parcourt pour i range(2,p) la fonction va immédiatement me renvoyer 2 si j'exclus 2 et je commence à 3 elle  va me renvoyer 3 ect ,

Je suis un peu perdu pour le coup

Posté par
verdurin
re : encore du python 09-12-20 à 19:21

Bonsoir,
ton programme ne fait pas du tout ce que tu veux : il renvoie toujours 2 si p est premier, mais 2 n'est pas toujours un générateur de (\Z/p\Z)^*, même si p est premier.

Je ne sais pas si tu veux la liste des générateurs ou seulement un générateur.

Disons que j'écrirais une fonction est_generateur(a,p) qui suppose p premier, il faut donc faire le test avant de l'utiliser.

def est_generateur(a,p):
	b=a%p
        if b==0 : 
                return False
	for i in range(1,p-1):
		if b==1 :
			return False
		b=b*a%p
	return True

L'idée est que l'on a toujours ap-11 mod p quand p est premier ( et que a est un entier qui n'est pas un multiple de p ).
Si a est générateur c'est la première puissance de a qui vérifie cette propriété.

Posté par
verdurin
re : encore du python 09-12-20 à 19:25

J'ai mis un peu trop de temps à taper mon message : je fais autre chose en même temps.
Mais tous les éléments d'un groupe cyclique ne sont pas forcément des générateurs de ce groupe, et je ne parle pas que de l'élément neutre.

Posté par
carpediem
re : encore du python 09-12-20 à 19:27

effectivement !!

merci verdurin

Posté par
nullptr19
re : encore du python 09-12-20 à 19:33

Bonsoir verdurin merci pour votre intervention .J'ai bien du mal à comprendre pourquoi votre fonction prend 2 paramètre , je croyais qu'il devais juste contenir P et l'objectif est que ca nous revoit a^(p-1)=1mod(p) pour p premier , mais dans ce cas a appartient à (Z/pZ,x)* ;

Posté par
nullptr19
re : encore du python 09-12-20 à 19:42

pour répondre à votre questions , c'est un générateur qu'on cherche

Posté par
nullptr19
re : encore du python 09-12-20 à 19:45

c'est justement pas de vérifier que c'est un générateur , mais chercher un générateur ,

Posté par
nullptr19
re : encore du python 09-12-20 à 19:49

ahhhh oui pardon j'ai totalement compris ce que vous me proposez , en fait le programme n'est pas fini , ok je complète et je vous montre , merci verdurin

Posté par
nullptr19
re : encore du python 09-12-20 à 19:55

je pense que il y'a une  coquille c'est plutôt  if i==1

Posté par
nullptr19
re : encore du python 09-12-20 à 19:59

plutôt ça ?

def est_generateur(a,p):
    	b=a%p
        if b==0 : 
                return False
	for b in range(1,p-1):
		if b==1 :
			return False
		b=b*a%p
	return True

Posté par
nullptr19
re : encore du python 09-12-20 à 20:08

j'ai du mal par contre à comprendre ceci  , certainement que sans les parenthèses  ne m'aide pas

b=b*a%p

Posté par
verdurin
re : encore du python 09-12-20 à 20:13

Pour trouver un générateur la méthode la plus simple est de prendre la liste des candidats (tous les éléments sauf l'élément neutre ) puis de la parcourir pour voir si le candidat est générateur ou non.

Sinon as tu testé ta fonction et la mienne ?
Elles sont vraiment différentes.

Et si j'ose donner un conseil :
il est dangereux de modifier l'indice de la boucle dans la boucle.

Posté par
nullptr19
re : encore du python 09-12-20 à 20:16

J'ai pour cela un programme qui me renvoi sous forme de liste tout les candidats c'est à dire les \varphi (n) je peux l'utiliser ici pour ensuite parcourir la liste ?

Posté par
nullptr19
re : encore du python 09-12-20 à 20:27

verdurin très bien pour votre remarque c'est notée merci

Posté par
verdurin
re : encore du python 09-12-20 à 20:40

Pour répondre à ceci

Citation :
j'ai du mal par contre à comprendre ceci  , certainement que sans les parenthèses  ne m'aide pas : b=b*a%p

Au départ b est égal à a modulo p instruction b=a%p.
À chaque étape on multiplie b par a et on prend le reste modulo p.
Les valeurs de b parcourent donc la liste des puissances de a modulo p.

J'ai utilisé les priorités implicites de python et b=b*a%p peut se lire b=(b*a)%p

Posté par
nullptr19
re : encore du python 09-12-20 à 20:46

AAAAAHHHHH oui bien merci monsieur wou la j'ai pas vu ça sous cette angle merci

Posté par
verdurin
re : encore du python 09-12-20 à 21:09

Pour faire un peu de math :
on sait que le groupe \bigl( \Z/13\Z\setminus\{0\},\times\bigr)=\bigl( \Z/13\Z\bigr)^* est un groupe cyclique à 12 éléments.
Il est donc isomorphe à \bigl( \Z/12\Z, +\bigr).
On a donc un sous-groupe à deux éléments, un sous-groupe à trois éléments, un sous-groupe à quatre éléments et un sous-groupe à six éléments.
Les générateurs sont les éléments qui ne sont dans aucun de ces sous-groupes.
Sauf erreur de ma part il y en a trois.

Posté par
nullptr19
re : encore du python 09-12-20 à 21:23

oui je comprend , mais votre programme il me semble que je dois le compléter du coup ? il me sert juste à trouver les potentiels candidats c'est ca ?
,

Posté par
verdurin
re : encore du python 09-12-20 à 21:46

Oui.
Il faut l'adapter à votre problème.

PS :
en principe on se tutoie sur le forum, en gros on est égaux ici.

Posté par
nullptr19
re : encore du python 09-12-20 à 21:47

daccord cest noté merci à toi , je fini ensuite je te montre .

Posté par
nullptr19
re : encore du python 09-12-20 à 22:33

from TestPrimalite import primalite
from test import est_generateur
def Generateur (p):
    k=primalite(p)
    for a in range (1,p-1):
     if Estgenerateur(a,p) is True and k is True :
            return a
    


pff , voici ce que je propose mais c'est pas toujours claire au niveau du résultat

Posté par
nullptr19
re : encore du python 09-12-20 à 22:34

plutôt

rom TestPrimalite import primalite
from test import est_generateur
def Generateur (p):
    k=primalite(p)
    for a in range (1,p-1):
     if est_generateur(a,p) is True and k is True :
            return a
    

Posté par
verdurin
re : encore du python 09-12-20 à 22:36

Misère.

Posté par
nullptr19
re : encore du python 09-12-20 à 22:42

quand j'ai copier ça pas respecté les tabulation , de toute façons ça n'a pas l'air juste tout ça , je sais pas comment  ça m'embête autant ,

Posté par
verdurin
re : encore du python 10-12-20 à 00:05

En effet ce que tu as écrit n'est pas juste.
Mais on peut corriger des erreurs.
Le problème est que ce que tu as écrit n'a pas de sens. Et ça ne vient pas des indentations, ni même de langage.
Il faut avoir une idée précise de ce qu'on veut faire avant d'écrire du code.

Il est judicieux de tester les fonctions que l'on écrit.

Il est inutile de créer un module par fonction : from test import est_generateur me semble douteux.

Je crois que tu devrais faire un programme un peu plus abstrait, c'est à dire sans t'attacher aux spécificités du langage.

En particulier il est totalement inutile de tester la primalité de p à chaque itération.

Je ne saurais trop te recommander de penser avant d'écrire.
Et de tester les fonctions que tu écris.



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 1675 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 !