#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TD1 au Lycée Lakanal (sujet rédigé par Arnaud Basson).
- *Date :* jeudi 24 septembre 2015,
- *Auteur :* Lilian Besson, pour le cours d'informatique pour tous en prépa MP (http://perso.crans.org/besson/infoMP/),
- *Licence :* MIT Licence (http://lbesson.mit-license.org).
"""
from __future__ import print_function # Python 2 compatibility
## Exercice 1 : Nombres parfaits
[docs]def sommeDiviseurs(n):
""" Calcule la somme des diviseurs positifs de n."""
s = 0
for i in range(1, n+1):
if n % i == 0: # i | n
s = s + i # s += i
return s
# return sum(i for i in range(1, n+1) if n % i == 0)
[docs]def estParfait(n):
r""" Vérifie que :math:`2n = \sum_{d|n} d`."""
return 2*n == sommeDiviseurs(n)
[docs]def prochainParfait(n):
""" Calcul le prochain nombre parfait."""
i = n
while not estParfait(i):
i += 1
return i
## Exercice 2 : Nombre d'occurences du maximum
[docs]def nombreMaximum(t):
""" Calcule le nombre maximum d'occurences du maximum."""
nb = 0
maximumActuel = t[0]
for valeur in t:
if valeur == maximumActuel:
nb += 1
elif valeur > maximumActuel:
nb = 1
maximumActuel = valeur
return nb
## Exercice 3 : Permutation
[docs]def estPermutation(t):
""" Vérifie si t est une permutation."""
n = len(t)
aux = [-1] * n
for i in range(n):
aux[t[i]] = i
return all(x >= 0 for x in aux)
[docs]def reciproque(t):
""" Calcule la permutation réciproque."""
assert estPermutation(t)
aux = [-1] * len(t)
for i in range(len(t)):
aux[t[i]] = i
return aux
## Exercice 4 : Defi mathematique
s = lambda n: sum(int(c)**5 for c in str(n))
# Juste une borne, par dichotomie logarithmique "a la main"
nMax = 300000
# http://www.wolframalpha.com/input/?i=plot%28x+%2F+floor%28log%2810%2C+x%29%29+-+9**5%2C+x%3D295200%2C+x%3D295300%29
print("On cherche les nombres n = s(n) entre 0 et {}.".format(nMax))
nombre = 0
for i in range(nMax):
if i == s(i):
print("Le nombre {} est egal a la somme de ses chiffres eleves a la puissance 5".format(i))
nombre += 1
print("Inutile de chercher au dela de {nMax} puisque la fonction n > floor(log(n, 10)) * 9**5 >= s(n) pour n > {nMax}.".format(nMax=nMax))
print("Il y a {} nombres entiers a etre egaux a la somme de leurs chiffres eleves a la puissance 5.".format(nombre))
# nombre = sum(1 for i in range(nMax) if i == s(i))