RosettaCodeData/Task/Prime-decomposition/Prolog/prime-decomposition-4.pro

36 lines
1005 B
Prolog

wheel2357(L) :-
W = [2, 4, 2, 4, 6, 2, 6, 4,
2, 4, 6, 6, 2, 6, 4, 2,
6, 4, 6, 8, 4, 2, 4, 2,
4, 8, 6, 4, 6, 2, 4, 6,
2, 6, 6, 4, 2, 4, 6, 2,
6, 4, 2, 4, 2, 10, 2, 10 | W],
L = [1, 2, 2, 4 | W].
factor(1, 1) :- !.
factor(N, Fac) :-
N > 1,
wheel2357(W),
factor(N, 2, W, 1, Fac0),
reverse_factors(Fac0, Fac).
factor(N, F, _, Fac1, Fac2) :- F*F > N, !, add_factor(N, Fac1, Fac2).
factor(N, F, W, Fac1, Fac) :-
divmod(N, F, Q, 0), !,
add_factor(F, Fac1, Fac2),
factor(Q, F, W, Fac2, Fac).
factor(N, F1, [A|As], Fac1, Fac) :-
F2 is F1 + A,
factor(N, F2, As, Fac1, Fac).
add_factor(F, 1, F) :- !.
add_factor(F, F, F**2) :- !.
add_factor(F, F**Ex1, F**Ex2) :- succ(Ex1, Ex2), !.
add_factor(F, F*A, F**2*A) :- !.
add_factor(F, F**Ex1*Rest, F**Ex2*Rest) :- succ(Ex1, Ex2), !.
add_factor(F, Fac, F*Fac).
reverse_factors(A*B, C*A) :- reverse_factors(B, C), !.
reverse_factors(A, A).