RosettaCodeData/Task/Perfect-numbers/Prolog/perfect-numbers-2.pro

27 lines
535 B
Prolog
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
perfect(N) :-
factor_2s(N, Chk, Exp),
Chk =:= (1 << (Exp+1)) - 1,
prime(Chk).
2013-04-10 23:57:08 -07:00
2019-09-12 10:33:56 -07:00
factor_2s(N, S, D) :- factor_2s(N, 0, S, D).
2013-04-10 23:57:08 -07:00
2019-09-12 10:33:56 -07:00
factor_2s(D, S, D, S) :- getbit(D, 0) =:= 1, !.
factor_2s(N, E, D, S) :-
E2 is E + 1, N2 is N >> 1, factor_2s(N2, E2, D, S).
2013-04-10 23:57:08 -07:00
2019-09-12 10:33:56 -07:00
% check if a number is prime
2013-04-10 23:57:08 -07:00
%
2019-09-12 10:33:56 -07:00
wheel235(L) :-
W = [4, 2, 4, 2, 4, 6, 2, 6 | W],
L = [1, 2, 2 | W].
prime(N) :-
2020-02-17 23:21:07 -08:00
N >= 2,
2019-09-12 10:33:56 -07:00
wheel235(W),
prime(N, 2, W).
prime(N, D, _) :- D*D > N, !.
2020-02-17 23:21:07 -08:00
prime(N, D, [A|As]) :-
N mod D =\= 0,
D2 is D + A, prime(N, D2, As).