36 lines
1005 B
Prolog
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).
|