LUCAS WILLEMS
Un étudiant passionné par les maths et la programmation
Un étudiant passionné par les maths et la programmation
Voici un résumé de l'énoncé du problème 23 "Non-abundant sums" du Project Euler (traduction complète en français ici) :
Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
Reformulons le problème : il nous faut trouver la somme de tous les entiers positifs \(n\) qui ne peuvent pas être écrits comme la somme de 2 nombres abondants. Grâce à l'énoncé, nous savons que \(n < 28124\). Pour résoudre ce problème, la manière la plus simple de procéder est la suivante :
Notez que pour obtenir la somme des nombres ne pouvant pas être écrits comme la somme de 2 nombres abondants, nous n'avons, en réalité, pas besoin de connaître ces nombres, il nous suffit juste de faire la différence entre la somme de tous les nombres entiers inférieurs à 28124 et la somme de tous les nombres inférieurs à 28124 pouvant être écrits comme la somme de 2 nombres abondants.
Voici le programme Python que nous pouvons utiliser pour résoudre ce problème :
def divisors(nb, extremum = False):
divisors = []
inf = 1 if extremum else 2
for i in range(inf, int(nb**0.5)+1):
q, r = divmod(nb, i)
if r == 0:
if q >= i:
divisors.append(i)
if q > i:
divisors.append(nb//i)
return divisors
def is_abundant(n):
return sum(divisors(n))+1 > n
#Génération d'une liste contenant tous les nombres abondants
#inférieurs à 28124
abundants = [i for i in range(2, 28124) if is_abundant(i)]
sommes = {}
#Génération de toutes les sommes possibles de 2 nombres abondants
for i in range(len(abundants)):
for j in range(i, len(abundants)):
somme = abundants[i] + abundants[j]
if somme > 28123:
break
sommes[somme] = 1
#Différence entre la somme de tous les nombres et la somme
#de toutes les sommes de 2 nombres abondants
resultat = (28123*28124)//2 - sum(sommes.keys())
print(resultat)Vous remarquerez que les sommes sont écrites dans un dictionnaire, ce qui permet de créer un index égal à la somme et donc de ne pas avoir besoin de supprimer les sommes en double à la fin, avant de passer à la somme de toutes les sommes. Notez aussi que les fonctions \(\text{is_abundant}\) et \(\text{divisors}\) sont explicitées dans cet article.
La réponse à ce problème est 4179871.
Voici les recherches relatives à cette page :
Qu'en pensez-vous ? Donnez moi votre avis (positif ou négatif) pour que je puisse l'améliorer.
Les commentaires ne sont plus disponibles.