Par quel chiffre doit-on remplacer les zéros de pour qu'il soit divisible par ?
Réponse :
Pour le chiffre , . On teste les 10 chiffres...
for c in range(10): n = 120450 + c*1000 + c if n % 99 == 0: print("Le chiffre", c, "convient.")
Le chiffre 3 convient.
On apprendra bientôt comment répondre à cette question sans faire de boucle.
Les nombres de la forme où , sont-ils tous premiers ?
Réponse :
Premiers exemples :
Pour vérifier que est premier, avec notre méthode, on utilise divisions. Une amélioration serait juste de vérifier que n'est divisible par aucun nombre premier inférieur ou égal à , à savoir : ; ainsi en divisions on peut prouver que est premier.
Pour vérifier que est premier, avec notre méthode, on utilise divisions. Une amélioration serait juste de vérifier que n'est divisible par aucun nombre premier inférieur ou égal à , à savoir une liste de nombres . Ce qui peut se faire sans calculatrice, et a été prouvé par Pierre de Fermat.
: Les nombres de Fermat
Ces nombres doivent leur nom à Pierre de Fermat, qui émit la conjecture en 1640 que tous ces nombres étaient premiers.
Aujourd'hui l'outil informatique permet une réponse rapide :
def is_prime(n): """Test de primalité Version améliorée ; O(√(n)) """ if n < 2: return False for d in range(2, n): if n % d == 0: return False if d * d > n: return True return True def F(n): """Renvoie le nombre de Fermat F_n""" return 2**(2**n) + 1 def vérifie_conjecture(): """Vérifie la primalité des nombres de Fermat. S'arrête au premier nombre composé.""" n = 0 while True: Fn = F(n) # le nième nombre de Fermat if is_prime(Fn): print("F"+str(n)+" =", Fn, ", est premier.") else: print("F"+str(n)+" =", Fn, ", est composé.") print("Conjecture fausse.") return n = n + 1 >>> vérifie_conjecture()
F0 = 3 , est premier. F1 = 5 , est premier. F2 = 17 , est premier. F3 = 257 , est premier. F4 = 65537 , est premier. F5 = 4294967297 , est composé. Conjecture fausse.
def plus_petit_diviseur_premier(n): """Renvoie le plus petit diviseur premier de n > 1""" assert n > 1 for d in range(2, n+1): if n % d == 0: return d >>> plus_petit_diviseur_premier(F(5))
641
Vérifier que pour tout , et avec premier, on a : est divisible par .
Réponse :
On va faire une double boucle qui fait le test demandé pour chaque cas :
nb_échec = 0 for p in range(51): if is_prime(p): for n in range(101): if (n**p - n)%p != 0: nb_échec = nb_échec + 1 print(nb_échec, "échecs")
0 échecs
Nous prouverons bientôt que cela est vrai pour tout , et tout .
Quel est le plus petit entier divisible par tous les entiers de à ? Sans script.
Réponse :
Donnons la décomposition en facteurs premiers de chaque entier entre et .
Le plus petit commun multiple s'obtient en trouvant le maximum des exposants associés à chaque nombre premier. On obtient :
, , sont des nombres premiers distincts.
Réponse :
, est décomposé en facteurs premiers.
Les diviseurs de sont , ils sont agencés en une structure unidimensionnelle dont la somme est :
Remarque : est un exposant moyen, plus petit la formule de gauche est très rapide, plus grand la formule de droite devient intéressante.
Les diviseurs de ont une structure bidimensionelle :
dont la somme est
.
On donnera une formule générale pour la somme.
Les diviseurs de se placent au sommet d'un cube :
, dont la somme est
Le de et est .
La question (NSI+MATEX) est de faire un premier script qui donne une décomposition en facteurs premiers.
def factor(n): """Renvoie une liste, la décomposition en facteurs premiers de n. >>> factor(6) [2, 3] >>> factor(8) [2, 2, 2] """ assert n > 0 Factor = [] p = 2 while n > 1: if n % p == 0: n //= p Factor.append(p) while n % p == 0: n //= p Factor.append(p) p += 1 return Factor for n in range(7, 13): print(n, "donne", factor(n)) for n in [4953851, 600851475143, 14837457737]: print(n, "donne", factor(n))
7 donne [7] 8 donne [2, 2, 2] 9 donne [3, 3] 10 donne [2, 5] 11 donne [11] 12 donne [2, 2, 3] 4953851 donne [7, 7, 17, 19, 313] 600851475143 donne [71, 839, 1471, 6857] 14837457737 donne [1471, 1471, 6857]
def factor(n): # variante qui renvoie une liste de couples (p, e) assert n > 0 Factor = [] p = 2 while n > 1: if n % p == 0: n //= p e = 1 while n % p == 0: n //= p e += 1 Factor.append((p, e)) p += 1 return Factor for n in range(7, 13): print(n, "donne", factor(n)) for n in [4953851, 600851475143, 14837457737]: print(n, "donne", factor(n))
7 donne [(7, 1)] 8 donne [(2, 3)] 9 donne [(3, 2)] 10 donne [(2, 1), (5, 1)] 11 donne [(11, 1)] 12 donne [(2, 2), (3, 1)] 4953851 donne [(7, 2), (17, 1), (19, 1), (313, 1)] 600851475143 donne [(71, 1), (839, 1), (1471, 1), (6857, 1)] 14837457737 donne [(1471, 2), (6857, 1)]
Critique du script : dans le pire des cas (quand est un nombre premier), la boucle while fait presque tours ; on dit alors que l'algorithme est en .
Devoirs pour la semaine suivante, pour les élèves NSI+MATEX :
Modifier ce script pour le rendre en .
Il doit être rapide pour un nombre comme .
Pour cela, s'inspirer du cours, et des deux versions incluses deis_prime
. Ici, une légère modification suffit !