26 votos

Producen el único número de dados dos enteros

Dados dos enteros, $a$ y $b$, necesito una operación para producir un tercer número $c$. Este número no tiene que ser un número entero. Las restricciones son las siguientes:

  1. $c$ debe ser único para las entradas (pero no tiene que ser reversible).
  2. $a$ y $b$ deben ser intercambiables ($a$ y $b$ a = $b$ y $una$)

Inicialmente, la primera cosa que pensé fue, simplemente, $a+b$, sin embargo, naturalmente, que no se ajusta a la restricción 1. Entonces me considera una función hash de algún tipo, pero que no se ajusta a 2.

Los pensamientos?

41voto

Peter Woolfitt Puntos 16561

Cómo acerca de tan sólo $2^a+2^b$? Esto representa el número binario con $1$s exactamente en el $a$-th y $b$-th posiciones si $a\ne b$, y una sola de $1$ en el $(a+1)$-ésima posición de la si $a=b$.

29voto

Thomas Puntos 196

Si nos restringimos $a,b$ a ser enteros no negativos, podemos tratar $f(a,b) = \dfrac{\max(a,b)(\max(a,b)+1)}{2}+\min(a,b)$.

Esto satisface $f(a,b) = f(b,a)$ y crece cuadráticamente con $\max(a,b)$. Para ayudarle a ver el patrón:

$f(0,0) = 0$,

$f(1,0) = 1$, $f(1,1) = 2$,

$f(2,0) = 3$, $f(2,1) = 4$, $f(2,2) = 5$,

$f(3,0) = 6$, $f(3,1) = 7$, $f(3,2) = 8$, $f(3,3) = 9$,

...

Si desea permitir que cualquier enteros $a,b$, a continuación, deje que $g$ ser su favorito bijection de $\mathbb{Z}$ $\mathbb{N}_0$, entonces que $f(a,b) = \dfrac{\max(g(a),g(b))(\max(g(a),g(b))+1)}{2}+\min(g(a),g(b))$.

Uno de esos bijection es de $g(n) = \begin{casos} -2n y n \le 0 \\ 2n-1 y n \ge 1\end{casos}$.

10voto

RodeoClown Puntos 3949

Creo que $a\circ b=(2^+1)(2^b+1)$ de obras, si lo he entendido correctamente. $a \circ b = b \circ$ y $a$ y $b$ se puede encontrar (hasta permutación) de $(2^+1)(2^b+1)$ (suponiendo que $a$ y $b$ son números enteros.)

7voto

Vincent Puntos 5027

Pedro Woolfitt la sugerencia de ($2^a + 2^b$) es el más simple hasta el momento, pero se vuelve muy grande para muy pequeños los valores de $a$ y $b$. Para una más manejable función, sugiero el intercalado de las representaciones binarias de $a$ y $b$. A continuación, el resultado será no mayor que $\max(a,b)^2$.

Para hacer conmutativa ($f(a,b)=f(b,a)$), primero tienes que cambiar de $a$ y $b$ si $a< b$. Entonces es algo como esto:

f := 1
while a != 0 or b != 0
    // Incorporate bottom bit of a
    f := 2 * f
    if a is odd then f := f + 1
    a := a/2 // Discard bottom bit of a

    // Incorporate bottom bit of b
    f := 2 * f
    if b is odd then f := f + 1
    b := b/2 // Discard bottom bit of b
wend

7voto

Nathan Puntos 171

Más programmerly de mathily, utilice una que no sea de dígito separador, como la conveniente del punto decimal. En este caso me concat una cadena, luego la echó a un flotador.

c = parseFloat(max(a,b) + '.' + min(a,b))

c será única y reversible para todas las combinaciones intercambiables de un y b.

así, por ejemplo,

myhash(124,24) = 124.24
myhash(24,124) = 124.24

myhash(11231,26611) = 26611.11231

Creo que a algunos el índice de de sistemas como el sistema Decimal de Dewey y algunos números de parte de los esquemas de uso de este tipo de reciclaje basado en la técnica.

Pero vaya, entonces no es un problema si el segundo número termina con ceros a la derecha, por lo que stringwise inversa para preservar ellos:

c = parseFloat(max(a,b) + '.' + reverse(min(a,b)))

entonces

myhash(123,456) = 123.654
myhash(12300,4560) = 12300.0654

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X