2011-12-17 5 views
6

Tengo una cadena de 128 bits, y mi supervisor me ha pedido que represente esos 128 bits como un polinomio. Ésta es una exploración del papel que estaba escribiendo en:¿Cómo usar polinomios en lugar de bits para mejorar el rendimiento?

Converting bits to a polynomial

Su idea es, ya que estamos eliminando los 0s de estos bits, vamos a ser capaces de realizar las siguientes operaciones (la mayoría de los cuales son XOR entre los bits/polinomios) mucho más rápido que si trabajáramos en todos los bits.

Entiendo cuál es el requisito, y puedo hacerlo en papel, y también en la aplicación. Pero mi camino no logrará su objetivo, que es mejorar el rendimiento. De hecho, dijo que ya hay bibliotecas que hacen esto, pero lamentablemente no pude encontrar ninguna. Lo único que encontré fue una clase polinómica que evalúa polinomios, que no es lo que quiero.

¿Ustedes saben cómo puedo implementar esto para mejorar el rendimiento? Cualquier código/fragmento/artículo es muy apreciado.

La aplicación está escrita en Java, si eso hace alguna diferencia.

Gracias,

Mota

Actualización:

Mi supervisor dice que este C library va a hacer la tarea. No podría imaginar cómo funciona y cómo lo hará.

+0

He visto esto hecho en las bibliotecas de cifrado, particularmente en los campos de galois. No puedo ser más específico que esto, ha pasado un tiempo desde que lo vi. –

+0

http://en.wikipedia.org/wiki/Finite_field_arithmetic –

+2

El problema es que la mayoría de los procesos de máquina se cortan muy rápido y si intenta hacer cualquier otra cosa (.e.g *, +, /) todavía tiene que usar bits. Si usar polinomios fuera más rápido en cada causa, podría tomar la solución, dividirla en bits y luego en polinomios y hacerla cada vez más rápida con cada iteración (en cambio, sospecho que será cada vez más lenta). Puede haber situaciones en las que lo que sugiere es más rápido, pero no puedo pensar en ninguno. –

Respuesta

7

¿Su supervisor está familiarizado con un BitSet? 128 bits es 16 bytes, que podrían almacenarse como 2 longs. Sin embargo, al usar un BitSet, no tendrá que preocuparse por manejar la combinación de 2 longs. BitSet también proporciona métodos para todas las operaciones de bits comunes. Creo que sería muy difícil encontrar una solución mejor que esta.

El enfoque polinómico es una idea genial, pero creo que es más teórico que práctico.

6

Lo que está proponiendo es un Monomial que puede componer en Polynomial - piense el patrón compuesto. Defina todas las operaciones matemáticas habituales para ambos (suma, resta, multiplicación, división) y cualquier otra que crea que pueda necesitar (por ejemplo, diferenciación e integración).

El polinomio realmente brillará en casos como x^1000 + 1, ya que puede capturarlo con solo dos términos.

La verdadera pregunta es: ¿Qué piensa tu jefe que estás ahorrando? Unos bits? ¿Velocidad? ¿Tiempo de desarrollo? Estoy de acuerdo con ziesemer: será difícil hacer mucho mejor que BitSet. Los ahorros en los que está pensando me parecen una microoptimización, el tipo de cosas que no aparecerían si perfilara su aplicación.

Pero s/he es el jefe ... ¿vale la pena la discusión?

Quizás pueda abstraer este detalle y perfilar los dos.

1

Si tiene varias cadenas que necesitan XOR ing, en realidad causará una sobrecarga de rendimiento. Esto se debe a que necesita hacer coincidir los pesos.

Todo depende de con qué lo esté XORingando y cuántas veces tiene que hacer esto para calcular la ventaja de adoptar este enfoque.

Me gustaría ir con la solución ziesemer.

1

Dudo mucho que vaya a obtener algún beneficio en cadenas de 128 bits. 128 bits son 16 bytes; cualquier objeto tomará al menos 40, por lo que (casi) cualquier estructura de soporte será más costosa que los datos que almacena.

Aún así, aquí está a good survey de los métodos existentes, y uno nuevo, que puede (o no) ser beneficioso para usted. No como si fuera una respuesta a su pregunta, y está de acuerdo, pero la solución de ziesemer es la mejor para un número tan grande, pero si desea ampliar sus horizontes, eche un vistazo.

Cuestiones relacionadas