27 lines
687 B
Prolog
27 lines
687 B
Prolog
factors(N, FList):-
|
|
factors(N, 2, 0, FList).
|
|
|
|
factors(1, _, _Count, []).
|
|
factors(_, _, Count, []):- Count > 1. % break on 2 factors reached
|
|
factors(N, Start, Count, [Fac|FList]):-
|
|
N1 is floor(sqrt(N)),
|
|
between(Start, N1, Fac),
|
|
N mod Fac =:= 0,!,
|
|
N2 is N div Fac,
|
|
Count1 is Count + 1,
|
|
factors(N2, Fac, Count1, FList).
|
|
factors(N, _, _, [N]):- N >= 2.
|
|
|
|
semiPrimeList(Limit, List):-
|
|
findall(N, semiPrimes(2, Limit, N), List).
|
|
|
|
semiPrimes(Start, Limit, N):-
|
|
between(Start, Limit, N),
|
|
factors(N, [F1, F2]),
|
|
N =:= F1 * F2. % correct factors break
|
|
|
|
do:- semiPrimeList(100, SemiPrimes),
|
|
writeln(SemiPrimes),
|
|
findall(N, semiPrimes(1675, 1685, N), SemiPrimes2),
|
|
writeln(SemiPrimes2).
|