Diviseurs et nombres premiers Programmation Python
Cette activité est la seconde d'une série qui a pour objectif de traiter les chapitres d'arithmétique sous l'angle de la programmation en Python. Il est recommandé d'avoir traité au préalable l'activité Lister les diviseurs d'un nombre.
Un nombre est considéré comme parfait lorsqu'il est égal à la somme de ses diviseurs stricts : par exemple, le nombre 6 est un nombre parfait car ses diviseurs stricts sont 1, 2 et 3.
On aimerait créer un programme qui détermine automatiquement si un nombre est parfait ou non. Mais pour commencer, nous allons réaliser une fonction somme_diviseurs(n)
qui réalise automatiquement la somme des diviseurs stricts d'un entier .
Le programme est très semblable à celui de l'activité précédente. En effet, on propose de passer en revue les entiers naturels et de calculer progressivement la somme des diviseurs du nombre en créant une variable somme
: chaque fois qu'un nombre est reconnu comme un diviseur, on ajoute sa valeur à cette variable.
Au début de la fonction, quelle est la valeur de la variable somme
?
A l'initialisation, somme=0
.
Quelle instruction va nous permettre de passer en revue les entiers naturels afin de les tester comme diviseurs de ? Quelle ligne de code doit-on utiliser ?
On utilise une boucle pour tester tous les entiers naturels de 1 à exclu car, attention, on cherche à lister les diviseurs stricts. On écrira donc for i in range(1,n):
.
Quel test allons-nous réaliser afin de vérifier si un nombre est diviseur de ? Quelle ligne de code doit-on utiliser ?
C'est un diviseur si le reste est nul lorsque l'on réalise la division euclidienne de par ce nombre. Pour cela, on utilisera le symbole % contenu dans le module math
et le test sera : if n%i==0:
A l'aide des questions précédentes (et si nécessaire, de l'activité précédente), écrire la fonction somme_diviseurs(n)
. On pourra utiliser la touche var pour retrouver les variables déjà définies dans le script et écrire plus rapidement le programme.
La fonction reprend le même modèle que celle abordée dans l'activité Lister les diviseurs d'un nombre.
from math import * def somme_diviseurs(n): somme=0 for i in range(1,n): if n%i==0: somme=somme+i return somme
On pourra aussi utiliser somme +=i
pour incrémenter la variable.
La fonction sum(liste)
permet de calculer automatiquement la somme de tous les éléments d'une liste.
En reprenant l'algorithme de la fonction diviseurs(n)
de l'activité précédente, c'est-à-dire en créant une liste vide dans laquelle on va progressivement stocker les diviseurs de , écrire une fonction sum_div(n)
qui utilise l'instruction sum
.
def sum_div(n): div=[] for i in range(1,n): if n%i==0: div.append(i) return sum(div)
Contrairement à l'activité précédente, on souhaite ici tous les diviseurs stricts, c'est pourquoi la boucle s'arrête en exclu.
On a vu qu'il était possible de générer automatiquement une liste en une seule ligne. Essayez de créer une fonction sum_div_short(n)
qui ne doit pas dépasser deux lignes !
def sum_div_short(n): return sum([i for i in range(1,n) if n%i==0])
Ecrire une fonction parfait(n)
qui renvoie True
si l'entier est parfait, False
sinon.
Pour cela, on pourra appeler l'une des fonctions que nous avons déjà définies dans le script pour calculer la somme des diviseurs stricts d'un nombre. On pourra utiliser la touche var pour retrouver les fonctions déjà définies dans le script.
def parfait(n): if somme_diviseurs(n)==n: return True else: return False
Deux nombres sont amicaux si chacun est égal à la somme des diviseurs stricts de l'autre.
Ecrire une fonction amicaux(a,b)
qui renvoie True
si c'est le cas, False
sinon.
On rappelle que l'instruction and
permet d'ajouter plusieurs conditions au même test.
def amicaux(a,b): if somme_diviseurs(a)==b and somme_diviseurs(b)==a: return True else: return False