Per una libreria, ho bisogno di memorizzare i primi numeri primi fino a un limite L. Questa raccolta deve avere un tempo di ricerca O (1) (per verificare se un numero è primo o no) e deve essere facile, dato un numero, per trovare il prossimo numero primo (supponendo che sia più piccolo di L).Memorizzazione efficiente di numeri primi
Dato che L è fisso, un setaccio Eratostene per generare l'elenco va bene. In questo momento, utilizzo un array booleano compresso per memorizzare l'elenco, che contiene solo voci per numeri dispari compresi tra 3 e L (inclusi). Questo richiede (L-2)/2 bit di memoria. Mi piacerebbe essere in grado di aumentare staticamente L senza usare più memoria.
Esiste una struttura dati che utilizza meno memoria con proprietà simili? O almeno con il tempo di ricerca costante? (Numeri dispari possono poi essere enumerati finché non avremo un numero primo)
(la lingua che ho scritto questo è Factor ma la questione sarebbe lo stesso in qualsiasi lingua che si è incorporato o matrici di bit compressi facilmente programmabili)
Cos'è una tipica "L"? È questo per un dispositivo embedded in cui la memoria è stretta? Potrebbe influenzare le raccomandazioni. Dato che ci sono 50.847.534 numeri primi sotto un miliardo, si potrebbe spendere più tempo a impacchettare/decomprimere un array diretto di interi a 4 byte. –
L è di oggi 5.000.000. –
E non vorrei avere più bisogno dei ~ 320kB di memoria che ho oggi. –