Números libres de cuadrados

Un número entero positivo es libre de cuadrados si no es divisible el cuadrado de ningún entero mayor que 1. Por ejemplo, 70 es libre de cuadrado porque sólo es divisible por 1, 2, 5, 7 y 70; en cambio, 40 no es libre de cuadrados porque es divisible por 2^2.

Definir la función

tal que (libreDeCuadrados x) se verifica si x es libre de cuadrados. Por ejemplo,

Otro ejemplo,

Soluciones

12 Comentarios

    1. Lo único que mejoraría de la definición sería que cuando el programa hace » x notElem xs «, si realmente x no es un elemento de xs, estás tardando un tiempo lineal, en función de (length xs), en comprobarlo. Esto puedes hacerlo mas eficientemente, en tiempo constante, comprobando simplemente si el primer elemento de xs es igual a x, aprovechando así el dato de que en la lista (primeFactors x) si existen dos elementos iguales entonces son consecutivos.

    1. La definición se puede mejorar:
      1. La lista (primeFactors x) es calculada dos veces.
      2. La función nub realiza un trabajo extra calculando la lista sin elementos repetidos de (primeFactors x), en esta función el tiempo es cuadrático en el numero de elementos de la lista (primeFactors x). Cuando, sabiendo que si hay elementos repetidos en (primeFactors x) son consecutivos, podemos simplemente comparar cada elemento con el siguiente, el tiempo es entonces lineal en el numero de elementos de (primeFactors x).

Escribe tu solución