Salvare grandi numeri
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
Ciao,
prova a dare un'occhiata a questo post. Mi pare nella seconda pagina si parla di memorizzazione di numeri.
prova a dare un'occhiata a questo post. Mi pare nella seconda pagina si parla di memorizzazione di numeri.
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
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
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.

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.
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
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.
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.
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..
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.
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.
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?
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?
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
vi ringrazio per l'aiuto ma vista l'impossibilita della cosa mi è stato concesso l'utilizzo di una memoria piu ampia