La sucesión alícuota de un número entero comienza con el propio número seguido de términos que son la suma de los divisores propios del término anterior.
Por ejemplo, la secuencia alícuota de 10 es la secuencia: 10, 8, 7, 1 dado que:
n = 10, primer valor
[10]
divisores propios de 10: 5 + 2 + 1 = 8, segundo valor
[10, 8]
divisores propios de 8: 4 + 2 + 1 = 7, tercer valor
[10, 8, 7]
divisores propios de 7: 1, cuarto valor
[10, 8, 7, 1]
divisores propios de 1: no tiene, testigo de fin.
[10, 8, 7, 1]
Hay valores para los cuáles la secuencia alícuota es infinita, por
ejemplo, para
.
De hecho, siempre que un término ya forme parte de la secuencia, ésta
será infinita. Por ejemplo: 95, 25, 6, 6, 6 … que daría como resultado
la lista [95, 25, 6, 6] ya que al repetirse el
6 ya no hace falta seguir calculando más números.
La función @divisores_propios(n)@ ofrecida a continuación retorna la lista de divisores propios de un entero, cópiala y utilízala en la solución del problema:
def divisores_propios(n):
'''
n >= 1
Devuelve la lista con los divisores propios de n
Si n no tiene ningun divisor propio, devuelve la lista vacia
>>> divisores_propios(10)
[1, 2, 5]
>>> divisores_propios(6)
[1, 2, 3]
>>> divisores_propios(1)
[]
'''
if n == 1:
return []
result = [1]
d = 2
while d*d <= n:
if n%d == 0:
result.append(d)
if n//d != d:
result.append(n//d)
d += 1
return result
Diseñad una función @secuencia_alicuota(n, maxim)@, que dados dos enteros y @maxim@ mayores que cero, devuelva una lista con la secuencia alícuota de hasta encontrar un testigo. El testigo puede ser o bien uno, o bien el primer término que supera a @maxim@, o bien el primer término que se repite. Este testigo se incluirá en la lista resultado como último elemento. La función @secuencia_alicuota(n, maxim)@ tiene que utilizar la función @divisores_propios(n)@.
>>> secuencia_alicuota(12, 25) [12, 16, 15, 9, 4, 3, 1] >>> secuencia_alicuota(6, 10) [6, 6] >>> secuencia_alicuota(95, 100) [95, 25, 6, 6] >>> secuencia_alicuota(102,300) [102, 114, 126, 186, 198, 270, 450] >>> secuencia_alicuota(102, 800) [102, 114, 126, 186, 198, 270, 450, 759, 393, 135, 105, 87, 33, 15, 9, 4, 3, 1]