PracticalNumberの判定

30分プログラム、その751。Practical number - Wikipediaの判定をやってみました。
Practical Numberは定義がややこしいんですが、

  • NがPractical Numberとは:
  • N未満の数; 1,2,3,...,N-1が
  • Nの約数の和で表現することができる

ということらしいです。

詳しくは、Practical number - Wikipediaを見たほうがいいと思います><。

使い方

1> practical:practical(12).
true
2> practical:practical(11).
false

ソースコード

-module(practical).
-compile([export_all]).

divisor(N)->
    [ M || M <- lists:seq(1,N), N rem M =:= 0 ].

combination([]) -> [[]];
combination([H | Tl]) ->
    Xss = combination(Tl),
    Xss ++ lists:map(fun(Xs)-> [ H | Xs] end,Xss).

nodup(Xs) ->
    sets:to_list(sets:from_list(Xs)).

practical(N) ->
    lists:sort(nodup([ M || Xs <- combination(divisor(N)),
			    M  <- [ lists:sum(Xs) ],
			    M  < N ])) ==
	lists:seq(0,N-1).