Salvare grandi numeri

baro2
ciao, ho la necessita di salvare dei numeri ottenuti utilizzando la libreria BigInt e quindi formati da un centinaio di cifre nella forma piu contratta possibile, intendo un sistema simile a quelli visti per riportare i grandi numeri primi (es: 2127^3125-216 il numero l'ho inventato), il sistema usato è indifferente, quello che importa a che i valori da salvare occupino una dimendione ristretta e definita

Risposte
hamming_burst
Ciao,
prova a dare un'occhiata a questo post. Mi pare nella seconda pagina si parla di memorizzazione di numeri.

baro2
grazie per la risposta, ho dato un'occhiata pero non parla di notazioni particolari, se non ho capito male si occupa di memorizzare i valori del triangolo, avevi in mente un modo per usarlo?
io devo memorizzare solo due numeri uno da circa 300bit e un altro da circa 230, la dimensione complessiva dopo il salvataggio deve restare possibilmente sotto i 500bit il problema è che gli stessi spazzi di memoria che uso per un numero devo poterli usare anche per un altro numero, faccio un esempio:
il mio valore massimo è 64!, tutti i numeri da 1 a 64! devono essere scritti in una forma contratta tipo x^y+q, il problema è che sia che il numero sia grande o che sia piccolo i parametri x,y,q devono occupare le stesse dimensioni in bit

hamming_burst
Sì quel post era solo un int che forse ti poteva dare qualche spunto, non ricordo che dicesse di particolare. Mi sembravano interessanti le dissertazioni di apatriarca&vict85 :)

Veniamo al tuo problema.
Non dici cosa devi farci con questi numeri. Devi fare operazioni ripetute (cioè li memorizzi e poi devi avere un accesso "efficiente" a tal numero), li memorizzi e poi non li usi più, li utilizzi una sola volta...
Questo comporta su come si memorizzano, ma implica l'algoritmo di accesso.

baro2
si i valori vengono memorizzati e poi non vengono piu toccati, quindi anche se l'algo ha un certo peso non è un problema,l'unica cosa a incidere è lo spazio

hamming_burst
ok.
Il problema ora è la "compressione" del numero.
Quello che importa a te è il numero di bit finali che rappresenta il numero iniziale oppure è il numero di byte totali di tutta la struttura che potrebbe essere utilizzata per rappresentare tale numero che importa.
Nel senso:
- si può utilizzare una qualche rappresentazione nel numero, es. con le classi di conguenza (vedendo se tale numero va sotto certe proprietà)
- si può utilizzare una struttura dati che rappresenta gruppi di numeri che nella struttura in sè, se letta restituisca il numero iniziale. Questo può comportare che tutta l'informazione sia maggiore del numero stesso per rappresentarla.

questi son solo discorsi che forse non hanno applicabilità, ma cerco di capire cosa devi fare e come poter risolvere.
Comunque cerca di dire a che scopo e da dove escono sti numeri, da un calcolo, da un algoritmo, ecc.. di potrebbe usare l'algoritmo iniziale per capire se già a partire da lì si possa trovare una rappresentazione migliore.

apatriarca
Se non ho sbagliato i calcoli, \(64! < 2^{296}\) per non mi sembra si tratti esattamente di compressione. Sono infatti sufficienti meno di 300 bit per rappresentare tutti i numeri che ti servono. Ma perché vuoi memorizzare questi numeri in quella forma? Esistono numerose scritture in quella formula per ogni numero..

baro2
vi ringrazio intanto per l'attenzione.
i due valori vengono calcolati da un programma che si torva su un integrato e quindi non ho la possibilita di agire sull'algoritmo che li genera,i valori poi devono essere salvati su una flash con capienza massima di 512 bit di cui uno è occupato per indicare lo stato del dispositivo(quindi ho a disposizione 511bit)
di due valori che poi saranno trattati da un secondo dispositivo(per una sola volta) hanno dimensioni massime di 296 e 227 bit (il loro valore minimo è 1) (qundi in totale occupano 523 bit)
a me non importa il tipo di forma utilizzata per salvare i dati,l'importante è che sia possibile salvare ogni valore risulti prodotto dal macchinario in 511 bit.

apatriarca
Qualsiasi sia la rappresentazione usata, avendo a disposizione \(511\) bit, puoi al massimo rappresentare \(2^{511}\) valori diversi e non si può fare nulla per alzare questo valore. In effetti, la rappresentazione scelta non è unica, esistono cioè parecchi modi diversi per ottenere uno stesso valore. Prendo per esempio il valore che avevi scelto a caso nel primo post: \[ 2127^{3125} - 216 = 43534889804779407^5 - 216, \]
oppure possiamo prendere in considerazione numeri molto più semplici:
\[100 = 2^1 + 98 = 2^2 + 96 = 2^3 + 92 = \cdots = 3^3 + 19 = \cdots \]
Il numero totale di simboli rappresentabili con il tuo metodo è quindi più basso dell'ideale di \(2^{511}\). Ma a cosa ti serve esattamente?

baro2
il dispositivo serve per fare delle spettro-analisi di superfici (per motivi di lavoro non posso spiegare nel dettaglio), il problema era piu che altro che utilizzare una memoria piu ampia ha un costo non indifferente (sono memorie con proprieta particolari e non facilmente reperibili), anche io ero giunto alla conclusione che 2^511 era il massimo valore rappresentabile,piu che altro speravo che con qualche "stratagemma" si potesse raggirare questo inconveniente

baro2
vi ringrazio per l'aiuto ma vista l'impossibilita della cosa mi è stato concesso l'utilizzo di una memoria piu ampia

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.