Secuencia alícuota X30687


Statement
 

pdf   zip

La sucesión alícuota de un número entero nn comienza con el propio número nn 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 n=6n=6. 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 nn y @maxim@ mayores que cero, devuelva una lista con la secuencia alícuota de nn 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)@.

Ejemplo de sessión

Sample session
>>> 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]
Information
Author
InfBesos
Language
Spanish
Official solutions
Python
User solutions
Python