ho scritto il seguente codice per ottenere tutti i numeri primi da 2..ncalcolo numeri primi (corsi d'acqua e lambda)
private static LongStream getPrimesStream(long number) {
return LongStream.range(2, number + 1)
.filter(PrimeStreamTest::isPrime);
}
private static boolean isPrime(final long number) {
return number == 2 || (number % 2 != 0 && LongStream
.range(2, (long) Math.ceil(Math.sqrt(number + 1)))
.filter(n -> n % 2 != 0)
.noneMatch(divisor -> number % divisor == 0)
);
}
ho ottimizzato che controllando nella gamma di 2..sqrt (n) e filtrando i numeri pari, ma ora voglio ottimizzarlo ulteriormente memorizzando tutti i numeri primi precedentemente trovati (non mi interessa la memoria), in modo da poter filtrare i numeri divisibili da quei numeri primi, e non solo quelli divisibili da 2. So che ci sono soluzioni migliori, ma è solo un esercizio su lambda e torrenti.
credo che la migliore ottimizzazione è quello di (a) passaggio da noneMatch() per AnyMatch() e nega il risultato (b) L'operazione di filtro che hai è davvero molto limitata a verificare se il numero nell'intervallo tra 2..sqrt (input) è divisibile per 2 e non controlla altri numeri primi come 3,5 .... Invece di tutti questi passaggi, lo stream torna non appena il numero è divisibile per il 2,3,4,5, .... – Baski
@Baski: perché pensi che passare da 'noneMatch()' a 'anyMatch()' e negare il risultato ottimizzi qualcosa? – Holger
Se si desidera ottimizzare la velocità al costo della memoria, implementare il setaccio di Eratostene usando un 'BitSet'. Ma, dato che questo è un esercizio in streaming, puoi usare 'getPrimesStream' in' isPrime' per ottenere i fattori primi da testare: 'return number == 2 || getPrimesStream ((long) ceil (sqrt (numero))). noneMatch (divisore -> numero% divisore == 0); ' – Misha