2011-12-17 7 views
6

Ho una stringa a 128 bit e il mio supervisore mi ha chiesto di rappresentare quei 128 bit come un polinomio. Si tratta di una scansione del documento che stava scrivendo su:Come utilizzare i polinomi al posto dei bit per migliorare le prestazioni?

Converting bits to a polynomial

La sua idea è, dal momento che stiamo eliminando gli 0 di questi bit, saremo in grado di eseguire le successive operazioni (la maggior parte dei quali sono XOR tra i bit/polinomi) molto più veloce rispetto a quando lavoravamo su tutti i bit.

Capisco qual è il requisito, e posso farlo su carta, e anche nell'applicazione. Ma la mia strada non raggiungerà il suo obiettivo, che sta migliorando le prestazioni. In realtà ha detto che ci sono già delle biblioteche che lo fanno, ma sfortunatamente non sono riuscito a trovarne. L'unica cosa che ho trovato è stata una classe polinomiale che valuta i polinomi, che non è quello che voglio.

Quindi ragazzi sapete come posso implementarlo per migliorare le prestazioni? Qualsiasi codice/snippet/articoli è molto apprezzato.

L'applicazione è scritta in Java, se questo fa alcuna differenza.

Grazie,

Mota

Aggiornamento:

Il mio supervisore dice che questo C library farà il compito. Non potevo però capire come funziona e come lo farà.

+0

Ho visto questo fatto nelle librerie di crittografia, in particolare i campi di galois. Non posso essere più specifico di questo, è da un po 'che non l'ho visto. –

+0

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

+2

Il problema è che la maggior parte dei bit di processo della macchina è molto veloce e se si tenta di fare qualcos'altro (.e.g *, +, /) deve ancora usare bit. Se l'uso dei polinomi fosse più rapido in ogni causa, si potrebbe prendere la soluzione, spezzarla in bit e poi polinomi e renderla sempre più veloce ad ogni iterazione (invece sospetto che ogni volta sarà più lento) Potrebbero esserci situazioni in cui ciò che suggerisce è più veloce, ma non riesco a pensare a nessuno. –

risposta

7

Il vostro supervisore ha familiarità con uno BitSet? 128 bit sono 16 byte, che possono essere memorizzati come 2 longs. Tuttavia, utilizzando un BitSet, non dovrai preoccuparti di gestire la combinazione di 2 longs. BitSet fornisce anche metodi per tutte le operazioni di bit comuni. Penso che saresti abbastanza difficile trovare una soluzione migliore di questa.

L'approccio polinomiale è un'idea interessante, ma penso che sia più teorico che pratico.

6

Quello che sta proponendo è un Monomial che è possibile comporre in Polynomial - pensa modello Composite. Definisci tutte le normali operazioni matematiche per entrambi (addizione, sottrazione, moltiplicazione, divisione) e tutte le altre che ritieni possano essere necessarie (ad esempio differenziazione e integrazione).

Il polinomio splenderà davvero per i casi come x^1000 + 1, perché è possibile catturarlo con due soli termini.

La vera domanda è: cosa immagina il tuo capo che stai risparmiando? Alcuni bit? Velocità? Tempo di sviluppo? Sono d'accordo con Ziesemer: ti verrà difficile fare molto meglio di uno BitSet. I risparmi che sta pensando mi sembrano una micro-ottimizzazione, il tipo di cosa che non si presenterebbe se profilassi la tua applicazione.

Ma lui/lei è il capo ... vale la pena?

Forse puoi astrarre questo dettaglio e profilare i due.

1

Se si dispone di più stringhe che richiedono XOR, ciò causerà effettivamente un sovraccarico delle prestazioni. Questo perché devi abbinare i pesi.

Tutto dipende da cosa si sta XOR con e quante volte si deve fare questo per calcolare il vantaggio di adottare questo approccio.

Vorrei andare con la soluzione di Ziesemer.

1

Dubito che otterrai vantaggi sulle stringhe a 128 bit. 128 bit sono 16 byte; qualsiasi oggetto ne richiederà almeno 40, quindi (quasi) qualsiasi struttura di supporto sarà più costosa dei dati memorizzati.

Ancora, ecco lo a good survey dei metodi esistenti e uno nuovo, che può (o non può) essere utile per voi. Non come se fosse una risposta alla tua domanda, e d'accordo sul fatto che la soluzione di ziesemer è la migliore per numeri così grandi, ma se vuoi allargare i tuoi orizzonti, dai un'occhiata.

Problemi correlati