Estoy luchando con este problema que encontré en un libro de programación competitivo, pero sin una solución, cómo hacerlo.
Para dos enteros dados A y B (pueden caber en el tipo de entero de 64 bits), donde A es impar, encuentre un par de números X e Y de manera que A = X * Y y B = X xo Y. Mi enfoque fue enumerar todos los divisores de a y tratan números de emparejamiento de bajo sqrt (a) con los números sobre sqrt (a) que se multiplican hasta a y ver si sus xor es igual a B . Pero no sé si eso es lo suficientemente eficiente. ¿Cuál sería una buena solución / algoritmo para este problema?
algorithm
bit-manipulation
Aster W.
fuente
fuente
X*Y
oX&Y
?Respuestas:
Aquí hay una recursión simple que observa las reglas que conocemos: (1) los bits menos significativos de X e Y se establecen ya que solo los multiplicandos impares producen un múltiplo impar; (2) si establecemos que X tenga el bit de ajuste más alto de B, Y no puede ser mayor que sqrt (A); y (3) establecer bits en X o Y de acuerdo con el bit actual en B.
El siguiente código de Python resultó en menos de 300 iteraciones para todos menos uno de los pares aleatorios que elegí del código de ejemplo de Matt Timmermans . Pero el primero tomó 231,199 iteraciones :)
Salida:
fuente
Usted sabe que al menos un factor es <= sqrt (A). Hagamos esa X.
La longitud de X en bits será aproximadamente la mitad de la longitud de A.
Los bits superiores de X, por lo tanto, los de mayor valor que sqrt (A), son todos 0, y los bits correspondientes en B deben tener el mismo valor que los bits correspondientes en Y.
Conocer los bits superiores de Y te da un rango bastante pequeño para el factor correspondiente X = A / Y. Calcule Xmin y Xmax correspondientes a los valores más grandes y más pequeños posibles para Y, respectivamente. Recuerde que Xmax también debe ser <= sqrt (A).
Luego prueba todas las X posibles entre Xmin y Xmax. No habrá demasiados, por lo que no llevará mucho tiempo.
fuente
La otra forma directa de resolver este problema se basa en el hecho de que los n bits más bajos de XY y X xor Y dependen solo de los n bits más bajos de X e Y. Por lo tanto, puede usar las posibles respuestas para los n bits más bajos para restringir las posibles respuestas para los n + 1 bits inferiores , hasta que haya terminado.
He deducido que, desafortunadamente, puede haber más de una posibilidad para una sola n . No sé con qué frecuencia habrá muchas posibilidades, pero probablemente no lo sea con demasiada frecuencia, por lo que esto puede estar bien en un contexto competitivo. Probablemente, solo habrá unas pocas posibilidades, ya que una solución para n bits proporcionará 0 o dos soluciones para n + 1 bits, con la misma probabilidad.
Parece funcionar bastante bien para la entrada aleatoria. Aquí está el código que usé para probarlo:
Puede ver los resultados aquí: https://ideone.com/cEuHkQ
Parece que generalmente solo toma un par de miles de cheques.
fuente