Maximo como un divisor

Máximo número de divisores de un número

Dada una matriz de enteros no nulos de longitud N. Escriba una función que devuelva el máximo elemento de la matriz que sea divisor de algún otro elemento de la misma matriz. Si este número no está presente, entonces devuelve 0. Sé cómo resolver en O(n^2). ¿Es posible hacerlo más rápido?
En primer lugar, tenga en cuenta que usted está asumiendo que la prueba de si el entero A divide el entero B se puede completar en O(1). Supongo que también estás asumiendo que no se permite ningún cálculo previo (por ejemplo, construir un gráfico de divisibilidad).
Un ejemplo para ese segundo punto: Imagina que estamos probando si divw = 10 es un divisor de w = 12, calculamos r = floor(12 / 10) = 1, y topw = floor(w / 2) = 6. Así, no necesitamos comprobar si los números del conjunto entre 7 y 9, ambos inclusive, son divisores de 12.
Después de ejecutarlo una docena de veces, parece comportarse mejor que el enfoque de fuerza bruta cuando N es alto y los números están dispersos (lo que significa que la probabilidad de que un número sea divisor de otro es baja). Por otro lado, la fuerza bruta parece ser más rápida cuando N es bajo o cuando los números están densamente distribuidos en un rango pequeño (lo que significa que la probabilidad de que un número sea divisor de otro es alta).

Leer más  Multiplicacion de numeros naturales

Solución hackerrank del árbol divisor máximo

Hay una “manera más fácil”, pero es teórica, no es realmente un algoritmo informático. Se plantean dos casos diferentes: uno si por “la mayoría de los factores” se entiende sólo eso, y el otro si los factores tienen que ser únicos.
En el primer caso, sólo hay que reconocer que, para maximizar el número de factores, cada factor debe ser lo más pequeño posible, es decir, 2. El número menor que 100 que tiene el mayor número de factores es, por tanto, la mayor potencia de 2 menor que 100, que resulta ser 64.
Si los factores deben ser únicos, entonces simplemente usamos 2, 3, 5, etc. (los números primos) hasta que el siguiente producto acumulado sea mayor que 100 – en este caso 2*3*5=30 es el número que tiene más factores únicos. Si añadimos un cuarto factor, llegaremos a 210, así que es lo máximo que podemos hacer.
encuentra el menor número con el mayor número de divisores que no exceda de N en tiempo O(N*log N), con un factor constante relativamente pequeño (que podría reducirse aún más tratando el 2 por separado y marcando sólo los múltiplos impares de los primos impares).
A partir de (1), podemos deducir que entre todos los números con la misma estructura de la factorización de primos (es decir, el mismo número r de factores primos distintos, y el mismo conjunto de exponentes, pero posiblemente en diferente orden), que tienen todos el mismo número de divisores, el más pequeño es aquel en el que

Solución hackerearth del árbol divisor máximo

Además, revisa el libro Computers and Intractability de Garey y Johnson para asegurarte de que esto no es NP-Completo (estoy seguro de que recuerdo algún problema en ese libro que se parece mucho a este). Yo lo haría antes de invertir demasiado esfuerzo en tratar de encontrar soluciones mejores.
Es obvio que podríamos obtener el máximo antes si empezamos con x=k y luego disminuimos x mientras tenga sentido (hasta que x=max+1). También este diagrama muestra que para x mayor que sqrt(n) no necesitamos disminuir x secuencialmente. En su lugar, podríamos saltar inmediatamente al máximo local precedente.
En el peor de los casos, la complejidad temporal podría estimarse como O(min(k, sqrt(n)). Pero para un k suficientemente grande esta estimación es probablemente demasiado pesimista: podríamos encontrar el máximo mucho antes, y si k es significativamente mayor que sqrt(n) sólo necesitamos 1 o 2 iteraciones para encontrarlo.
Para k < n, piensa en la gráfica de los residuos n % x. Tiene el mismo aspecto para todos los n: los residuos caen a cero en los armónicos de n: n/2, n/3, n/4, después de lo cual saltan hacia arriba, y luego disminuyen suavemente hacia el siguiente armónico.

Leer más  Ejemplos de prisma

Programa del árbol divisor máximo

Este artículo incluye una lista de referencias generales, pero permanece en gran medida sin verificar porque carece de suficientes citas en línea correspondientes. Por favor, ayude a mejorar este artículo introduciendo citas más precisas. (Enero de 2016) (Aprende cómo y cuándo eliminar este mensaje de la plantilla)
En matemáticas, y concretamente en teoría de números, una función divisora es una función aritmética relacionada con los divisores de un número entero. Cuando se denomina función divisora, cuenta el número de divisores de un entero (incluyendo el 1 y el propio número). Aparece en una serie de identidades notables, como las relaciones sobre la función zeta de Riemann y la serie de Eisenstein de las formas modulares. Las funciones divisoras fueron estudiadas por Ramanujan, que dio una serie de congruencias e identidades importantes; éstas se tratan por separado en el artículo La suma de Ramanujan.
La suma alícuota s(n) de n es la suma de los divisores propios (es decir, los divisores que excluyen a n mismo, OEIS: A001065), y es igual a σ1(n) – n; la secuencia alícuota de n se forma aplicando repetidamente la función de suma alícuota.

Acerca del autor

Rebeca Sánchez

Rebeca Sánchez

Ver todos los artículos