def valeurs(nombre_min, nombre_max, carre_parfait, non_simplifiable): iteration = 0 while True: # generation d'un nombre entre nombre_min et nombre_max nombre = random.randrange(nombre_min, nombre_max) # decomposition en facteur premier decomposition = Arithmetique.factor(nombre) compte = [(k, decomposition.count(k)) for k in set( decomposition)] # les facteurs qui apparaissent 2 fois forment le carré, les autres sont le coefficient (coefficient, carre) = (1, 1) for i in range(len(compte)): coefficient = coefficient * compte[i][0] ** (compte[i][1] % 2) carre = carre * compte[i][0] ** (compte[i][1] / 2) #Choix if carre_parfait == 1 and non_simplifiable == 0 and coefficient == 1: break if carre_parfait == 0 and non_simplifiable == 1 and carre == 1: break if carre_parfait == 0 and non_simplifiable == 0 and coefficient != 1 and carre != 1: break # Controle du bouclage si l'utilisateur fait un choix de valeur min et max absurde if iteration > 10000: (coefficient, carre) = (0, 0) break return coefficient, carre
def div(nombre_min, nombre_max): # on trouve a et b en valeur absolue a_absolu = 2 while Arithmetique.premier(a_absolu): a_absolu = abs(Arithmetique.valeur_alea(nombre_min, nombre_max)) decomposition_a_absolu = Arithmetique.factor(a_absolu) nbre_facteur_a_absolu = len(decomposition_a_absolu) decomposition_b_absolu = random.sample(decomposition_a_absolu,random.randrange(1,len(decomposition_a_absolu))) b_absolu = 1 for facteur in decomposition_b_absolu: b_absolu = b_absolu * facteur # on choisit le signe possible pour a et b a_possible = [-a_absolu , a_absolu] b_possible = [-b_absolu , b_absolu] if a_possible[1] < nombre_max: if nombre_min < a_possible[0]: a = a_possible[random.randrange(2)] else: a = a_possible[1] else: a = a_possible[0] if b_possible[1] < nombre_max: if nombre_min < b_possible[0]: b = b_possible[random.randrange(2)] else: b = b_possible[1] else: b = b_possible[0] return (a, b)
def div_dec(nombre_min, nombre_max): a = 2 while Arithmetique.premier(a): a = Arithmetique.valeur_alea(nombre_min*10, nombre_max*10) decomposition_a = Arithmetique.factor(a) nbre_facteur_a = len(decomposition_a) decomposition_b = random.sample(decomposition_a,random.randrange(1,len(decomposition_a))) b = 1 for facteur in decomposition_b: b = b * facteur return (a/10.0, b/10.0)
def valeurs_produit(nombre_min, nombre_max): iteration = 0 while True: # generation de 2 nombres entre nombre_min et nombre_max nombre1 = random.randrange(nombre_min, nombre_max) nombre2 = random.randrange(nombre_min, nombre_max) # decomposition en facteur premier du produit des 2 nombres decomposition = Arithmetique.factor(nombre1*nombre2) compte = [(k, decomposition.count(k)) for k in set( decomposition)] # les facteurs qui apparaissent 2 fois forment le carré, les autres sont le coefficient (coefficient, carre) = (1, 1) for i in range(len(compte)): coefficient = coefficient * compte[i][0] ** (compte[i][1] % 2) carre = carre * compte[i][0] ** (compte[i][1] / 2) #Choix if coefficient != 1 and carre != 1: break # Controle du bouclage si l'utilisateur fait un choix de valeur min et max absurde if iteration > 10000: (nombre1, nombre2, coefficient, carre, decomposition) = (0, 0, 0, 0, 0) break return nombre1, nombre2, coefficient, carre, decomposition