Proper divisors: Difference between revisions

→‎{{header|Prolog}}: Added Prolog solution
(Added an implementation in C#.)
(→‎{{header|Prolog}}: Added Prolog solution)
Line 1,029:
1441440 -> 287
0.530 seconds elapsed</pre>
 
=={{header|Prolog}}==
 
{{works with | SWI-Prolog 7}}
 
Taking a cue from [http://stackoverflow.com/a/171779 an SO answer]:
 
<lang prolog>divisor(N, Divisor) :-
UpperBound is round(sqrt(N)),
between(1, UpperBound, D),
0 is N mod D,
(
Divisor = D
;
LargerDivisor is N/D,
LargerDivisor =\= D,
Divisor = LargerDivisor
).
 
proper_divisor(N, D) :-
divisor(N, D),
D =\= N.
 
 
%% Task 1
%
 
proper_divisors(N, Ds) :-
setof(D, proper_divisor(N, D), Ds).
 
 
%% Task 2
%
 
show_proper_divisors_of_range(Low, High) :-
findall( N:Ds,
( between(Low, High, N),
proper_divisors(N, Ds) ),
Results ),
maplist(writeln, Results).
 
 
%% Task 3
%
 
proper_divisor_count(N, Count) :-
proper_divisors(N, Ds),
length(Ds, Count).
 
find_most_proper_divisors_in_range(Low, High, Result) :-
aggregate_all( max(Count, N),
( between(Low, High, N),
proper_divisor_count(N, Count) ),
max(MaxCount, Num) ),
Result = (num(Num)-divisor_count(MaxCount)).</lang>
 
Output:
 
<lang prolog>?- show_proper_divisors_of_range(1,10).
2:[1]
3:[1]
4:[1,2]
5:[1]
6:[1,2,3]
7:[1]
8:[1,2,4]
9:[1,3]
10:[1,2,5]
true.
 
?- find_most_proper_divisors_in_range(1,20000,Result).
Result = num(15120)-divisor_count(79).
</lang>
 
=={{header|Python}}==