es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprueba si num es efectivamente anti-primo.

Estoy intentando escribir un predicado que compruebe si num es antiprimo.

Un número altamente compuesto (también conocido como ‘antiprimo’) es un número entero positivo con más divisores que cualquier otro número entero positivo más pequeño.

Se me ocurrió esto.

def count_divisors(num):
    divisor_count = 0
    for i in range(1, int(sqrt(num)) + 1):
        if num % i == 0:
            if num / i == i:
                divisor_count += 1
                continue
            divisor_count += 2
    return divisor_count

def is_highly_composite(x):
    original_divisors = count_divisors(x)
    for i in range(x-1, 0, -1):
        if count_divisors(i) >= original_divisors:
            return False
    return True

Lamentablemente, parece ser realmente ineficiente y lento. Especialmente para números grandes.

Estoy aprendiendo a programar, por lo que la eficiencia es un poco difícil de entender.

Gracias por cualquier ayuda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Python y matemáticas, aquí está mi solución para escribir un predicado para verificar si un número es antiprimo:

    import math
    
    def count_divisors(num):
        """
        Una función auxiliar para contar el número de divisores de un número dado
        """
        divisor_count = 0
        for i in range(1, int(math.sqrt(num)) + 1):
            if num % i == 0:
                if num / i == i:
                    divisor_count += 1
                    continue
                divisor_count += 2
        return divisor_count
    
    
    def is_anti_prime(num):
        """
        Una función para verificar si un número es antiprimo o altamente compuesto
        """
        max_divisors = -1
        for i in range(1, num+1):
            divisors = count_divisors(i)
            if divisors > max_divisors:
                max_divisors = divisors
                if max_divisors == count_divisors(num):
                    return True
        return False
    

    Así es como funciona:

    • Primero definimos una función auxiliar count_divisors() para contar el número de divisores de un número dado utilizando un bucle for y la función math.sqrt().
    • La función principal is_anti_prime() toma un número num y establece un valor inicial de -1 para el número máximo de divisores max_divisors.
    • Luego recorremos todos los números del 1 a num, y para cada número, contamos el número de divisores utilizando count_divisors(). Si el número de divisores es mayor que max_divisors, actualizamos max_divisors al nuevo valor máximo y verificamos si es igual al número de divisores de la entrada num. Si es así, devolvemos True, indicando que el número de entrada es antiprimo. Si hemos recorrido todos los números del 1 a num y no hemos encontrado un antiprimo, devolvemos False.
    • Esta función debería ser más eficiente que la implementación original ya que solo recorre num números, en lugar de num-1 números.

    ¡Espero que esto ayude!

Comments are closed.