Я уже делал это в Haskell, прежде чем вы изменили название на "Java". Так как это вики сообщества, в любом случае здесь.
primes n =
let sieve (p:xs) = p : sieve [x | x<-xs, x `mod` p /= 0] in
let primes = takeWhile (<n) $ sieve [2..] in
([0..n] \\ primes, primes)
*Main> primes 20
([0,1,4,6,8,9,10,12,14,15,16,18,20],[2,3,5,7,11,13,17,19])
(edit:) Сокращение имен и удаление пробелов составляет 79 символов:
p n=let s(p:xs)=p:s[x|x<-xs,x`mod`p/=0];r=takeWhile(<n)$s[2..]in(r,[0..n-1]\\r)
здесь также меняется порядок полученной пары, и используется n-1
согласно спецификации.
Использование неоптимального пробного деления снижает его до 50 символов :
p n=partition(\k->all((>0).rem k)[2..k-1])[2..n-1]