¿Existe algún método para calcular la inversa de la función tot de Euler de manera eficiente?

Esto es en esencia un problema de coincidencia de patrones.

Permítanme volver a armarlo para ver si entendí correctamente los problemas básicos:

Variables

norte
K
norte
k

Serie

S1 = {0 * N + n, 1 * N + n, 2 * N + n, 3 * N + n, 4 * N + n,…, N²-N + n}

S2 = {1 * k, 2 * k, 3 * k, 4 * k,…} | x * k <= N²; k <= K

Ahora, el problema a resolver es que N en S1, todos S2 con k entre 1 y 2 * 10 ^ 9 contienen al menos un elemento de cada S1.

Una forma sería calcular realmente todas las series y luego ejecutar una referencia cruzada, pero eso sería crudo y tomaría más de 2 segundos en la mayoría de las máquinas e idiomas.

Por lo tanto, estamos buscando una solución formulada que prediga el resultado sin calcular todos los valores.

Para hacer esto, necesitamos conocer algunas de las reglas que sigue la serie y cómo se superpondrá su contenido:

permítanme imprimir una breve instantánea de la serie para facilitar la comprensión primero:

[n] S1 (N = 4) = {

1,5,9,13;
2,6,10,14;
3,7,11,15;
4,8,12,16

}

ahora para hacer algo evidente, hagámoslo con una N más grande

[n] S1 (N = 16) = {

1, 17,33,65,81,97,113,129,145,161,177,193,209,225,241;
2,18,34,66,82,98,114,130,146,162,178,194,210,226,242;
3,19,35,67,83,99,115,131,147,163,179,195,211,227,242;

16,32,64,80,96,112,128,144,160,176,192,208,224,240,256
}

Lo que ve es que si ingresó la serie en una matriz, no solo todas tienen el mismo número de columnas, no, cada columna cuenta para cada nueva fila y el último valor en cualquier columna +1 es el primer número en la siguiente fila para que todos los valores estén siempre cubiertos por la distribución y tampoco puedan existir duplicados .

Ahora veamos también la serie S2:

[k] S2 (N = 4) = {

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;
2,4,6,8,10,12,14,16;
3,6,9,12,15;
4,8,12,16;
5,10,15;
6,12;
7,14;
8;
9;
10;
12;
13;
14;
15;
dieciséis
}

Lo que esto nos da es un sistema de coordenadas N² N², no necesitamos mirar la totalidad de K por ahora, supongamos que elegimos K para ser 16 aquí.

¡Mira cómo las series en columnas y filas son exactamente iguales !

Esto ahora nos permitirá hacer coincidir los dos campos entre sí usando solo K y N en el proceso sin calcular ningún valor de ninguna de las series.

Repasemos nuestro Criterio:

todos los S2 deben contener al menos un valor de cada S1

¿Curiosamente, veamos en el ejemplo anterior si el estudiante que califica más alto tiene todos sus S2 a continuación también califica?

La respuesta es no. Mientras que el estudiante con la calificación más alta siempre sería k = N-1, ya que eso causa franjas diagonales a través del campo [n] S1, lo que no significa que todas las K <= k sean resultados válidos. Mire la serie k = 2 S2, solo contiene números de [2] S1 y [4] S1. Tal vez porque es 0.5 * N?

¡Miremos N = 6!

[k] S2 (N = 6) = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23…;
2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36;
3,6,9,12,15,18,21,24,27,30,33,36;
4,8,12,16,20,24,28,32,36;
5,10,15,20,25,30,35;
6,12,18,24,30,36;
7,14,21,28,35;
8,16,24,32;
9,18,27,36;
10,20,30;
12,24,36;
13,26;
14,28;
15,30;
16,32;
17; 34;
18; 36;
19;

[n] S1 (N = 6) = {

1,7,13,19,25,31;
2,8,14,20,26,32;
3,9,15,21,27,33;
4,10,16,22,28,34;
5,11,17,23,29,35;
6,12,18,24,30,36
}

Evidentemente, la serie [0.5N] S2 no califica, ¿veremos si este podría ser el umbral mágico?

¡Ay! No funciona, probablemente porque todos los k que pueden dividir N no funcionarán, ya que repetirán para recorrer la serie de la misma manera una y otra vez.

Ahora estamos en algo aquí! ¡Números primos! Si ningún número igual o inferior a K excepto 1 puede dividir N, deberíamos estar bien, ¿verdad?

Por lo tanto, cuando recibimos una K dada, ¡queremos tener una N que cumpla con nuevos criterios!

-N debe ser un número primo para que no se pueda dividir por K.
-N debe ser mayor que K para que k = K pueda alcanzar la última columna de S1

Entonces, podríamos comenzar en K + 1 y probar cada número mayor que eso y ver si es primo, el primero que encontramos es nuestro N.

[código]
public static boolean isPrime ( long n) {
if (n <= 3) { return n> 1; } else if (n% 2 == 0 || n% 3 == 0) { return false ; } else { for ( int i = 5; i <Math.sqrt (n) + 1; i + = 6) { if (n% i == 0 || n% (i + 2) == 0) { return falso }} return true ; }
}
[/código]

Este es un fragmento de código de ejemplo para verificar si un número es primo (Prueba de primalidad)

Esto solo necesita verificar a lo sumo 200 números (no estoy seguro acerca de la función de separación principal en el rango de 100,000+ pero está principalmente en el rango de 5-30 en los rangos de <10,000) y debe completarse dentro del límite de 2 segundos dado que ' No se está ejecutando en una calculadora del siglo 90.

Diviértete 😉

Espero que no uses esto en el examen de ingreso real; ¡no hagas trampa en los exámenes!

Miré algunas de las referencias enumeradas en el comentario anterior. La estrategia básica descrita en varios de ellos es la siguiente:

0. Factorizar la entrada en un producto de primos [matemática] N = p_ {1} ^ {k_1} p_ {2} ^ {k_2}… [/ matemática]

1. construya un montón de productos de los elementos [math] p_ {i} ^ {a} (p_ {i} -1) [/ math]. Elimine en el camino a aquellos que no son divisores de N.

2. Encuentre aquellos productos que sean exactamente iguales a N, o sean N / (p-1) para algún otro primo. Debido a que [math] \ phi (p ^ j) = p ^ {j-1} (p-1) [/ math] y [math] \ phi [/ math] es multiplicativo, podemos multiplicar las potencias primarias para obtener uno de los inversos [matemática] \ phi ^ {- 1} (N) [/ matemática].

Puede, si conoce los factores, y tener algunos primos.

En esencia, el total de Euler es débilmente multiplicativo, lo que significa que T (ab) = T (a) T (b), donde mcd (a, b) = 1.

Esto simplemente significa que solo tienes que dividir los factores de tu número en algún conjunto de p ^ n (p-1),

Supongamos que mira a 100800 (7.00.00 twellftywise). Esto da 2 ^ 6 3 ^ 2 5 ^ 2 7, por lo que las únicas potencias que pueden caer son 2, 3, 5, 7.

Entonces, divide este lote en clientes principales, etc.

7.00.00 (601) 1.48 (43) 4 (5) 1. Entonces, por ejemplo, 5 * 43 * 601 tiene esto como un paciente, y también 5 * 7 ^ 2 * 601, o reemplaza 5 con 5,8,10, o 12.