/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.collection.euler; import io.vavr.Tuple; import io.vavr.collection.HashMap; import io.vavr.collection.Set; import io.vavr.collection.Stream; import io.vavr.collection.TreeSet; final class PrimeNumbers { private static final Set<Integer> PRIMES_2_000_000 = Sieve.fillSieve(2_000_000, TreeSet.empty()); private PrimeNumbers() { } static Stream<Integer> primes() { return Stream.ofAll(PRIMES_2_000_000); } static HashMap<Long, Long> factorization(long num) { if (num == 1) { return HashMap.empty(); } else { return primeFactors(num) .map(p -> HashMap.of(Tuple.of(p, 1L)) .merge(factorization(num / p), (a, b) -> a + b)) .getOrElse(HashMap::empty); } } static Stream<Long> primeFactors(long num) { return Stream.rangeClosed(2L, (int) Math.sqrt(num)) .find(d -> num % d == 0) .map(d -> Stream.cons(d, () -> primeFactors(num / d))) .getOrElse(() -> Stream.of(num)); } }