Cómo encontrar el enésimo número de Ulam rápidamente

Respuesta corta: ¡ usa una computadora! ¡Son bastante malditos rápido!

Respuesta larga: he escrito un pequeño código C ++ que te ayudará a encontrar el enésimo número Ulam. Antes de llegar al código, esto es lo que realmente es un Número Ulam …

Un número de Ulam es básicamente cualquier término que aparece en la secuencia de Ulam. Así es como se define esta secuencia …

La secuencia estándar de Ulam (la secuencia (1,2) -Ulam) comienza con [matemáticas] U_1 = 1 [/ matemáticas] y [matemáticas] U_2 = 2 [/ matemáticas]. Entonces, para [matemática] n> 2 [/ matemática], [matemática] U_n [/ matemática] se define como el entero más pequeño que es la suma de dos términos anteriores distintos exactamente de una manera y más grande que todos los términos anteriores.

Según esta definición formal, la secuencia estándar se vería así …

[matemáticas] 1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36 … [/ matemáticas] (y así sucesivamente)

Déjame explicarte el patrón …

  • 3 es un número de Ulam (1 + 2)
  • 4 es un número de Ulam (1 + 3). Aquí 2 + 2 no es una segunda representación de 4, porque los términos anteriores deben ser DISTINCT.
  • El número 5 NO es un número de Ulam, porque 5 = 1 + 4 y también 5 = 2 + 3. Lo que significa que hay más de una forma de representar 5 usando los términos anteriores. Entonces, 5 no aparece en nuestra secuencia.
  • 6 es un número de Ulam (2 + 4)
  • 7 NO es un número de Ulam, porque 7 = 1 + 6 y también 7 = 3 + 4. Lo que significa que hay más de una forma de representar 7 usando los términos anteriores. Entonces, 7 no aparece en nuestra secuencia.
  • Usando la misma lógica, puede extender esta secuencia.

Nota importante: La secuencia estándar de Ulam comienza con 1 y 2. Pero tenga en cuenta que he escrito un código más generalizado. Lo que quiero decir es que puede ingresar cualquier valor que desee para el primer y segundo término en lugar de 1 y 2.


Ahora llegando al código C ++ :

#include
usando el espacio de nombres estándar;
int main ()
{
int n;
cout << "Ingrese el valor de N:";
cin >> n;
int a [n];
cout << "Ingrese el primer término:";
cin >> a [0];
cout << "Ingrese el segundo término:";
cin >> a [1];
int s = a [0] + a [1];
if (a [0]! = a [1])
{
para (int i = 2; i <n; i ++)
{
int b [i], bandera = 0;
para (int j = 0; j <i; j ++)
{
b [j] = a [j];
}
para (int k = 0; k <i-1; k ++)
{
para (int j = k + 1; j <i; j ++)
{
if (b [k] + b [j] == s && b [k]! = b [j])
{
bandera ++;
}
}
}
si (bandera == 1)
{
a [i] = s;
s ++;
}
más
{
yo-;
s ++;
}
}
cout << "\ nAquí está el número de Ulam que deseas:" << a [n-1] << "\ n \ n";
cout << "La secuencia es así …" << "\ n \ n";
para (int i = 0; i <n; i ++)
{
cout << a [i] << "";
}
cout << endl;
}
más
{
cout << "¡El primer y segundo términos ingresados ​​tienen que ser distintos! \ n ¡Abortados!" << endl;
}
devuelve 0;
}


Aquí hay algunas fotos que tomé de la secuencia estándar de Ulam (1,2)


Dejemos atrás la secuencia “Estándar” (1,2) y veamos las secuencias generalizadas más divertidas (x, y) …


Ahora, si desea llevar este código al límite y probar algunos casos de prueba grandes, le recomendaría que modifique el código que escribí anteriormente simplemente eliminando las líneas 45, 46, 47, 48 y 49 .

Hacerlo ya no mostrará la secuencia completa de Ulam. El programa ahora simplemente se detendrá una vez que encuentre el enésimo número Ulam.

Los números de Ulam tienen una propiedad extraña cuando los interpretas como una señal. Puede explotar este hecho para calcularlos muy rápidamente. No puedo explicarlo bien, así que lo enlazaré a un artículo.

http://vixra.org/pdf/1508.0085v2

More Interesting

¿Cuál es la diferencia entre los métodos de búsqueda y los algoritmos utilizados por los motores de búsqueda de Google, Yahoo y Bing? ¿Cómo lo explicarías de una manera simple?

¿Cuál es la diferencia entre [matemáticas] 2 ^ {n ^ {o (1)}} [/ matemáticas] y [matemáticas] 2 ^ {O (n ^ e)} [/ matemáticas] (para algunos e <1)?

¿Es posible tener análisis predictivos utilizando motores de recomendación? En caso afirmativo, ¿cuáles son algunos de los algoritmos de análisis predictivo utilizados por los motores de recomendación?

¿Cuáles son algunos ejemplos de uso no trivial de la búsqueda binaria?

Quiero comparar una consulta con varios documentos y asignarles una clasificación. ¿Qué algoritmo necesito usar?

¿Dónde se puede encontrar una foto y detalles biográficos de Burton Howard Bloom, inventor del filtro Bloom?

Cómo eliminar caracteres duplicados en la cadena char * p = 'chaabbcc'

¿Hay algoritmos con complejidad [math] \ mathcal {O} [/ math] [math] (\ sqrt {\ log (n)}) [/ math]?

¿Cuál es el enfoque para resolver Gráficos Chef y Bipartitos?

¿Debería un principiante construir cosas y contribuir a proyectos de código abierto antes de aprender algoritmos?

¿Cuál es la conclusión del algoritmo de Dijkstra?

Cómo saber si / cuándo puede aplicar la manipulación de bits para resolver un problema

¿Cuál es el mejor curso de análisis de datos y algoritmos presentado con el lenguaje Python?

¿Cuáles son algunos algoritmos conocidos para encontrar una coincidencia perfecta en un gráfico bipartito?

¿Cuáles son los 10 algoritmos y estructuras de datos imprescindibles para un concurso de programación?