使用erlang求N以内的质数
今天闲来无事,看着技术群里有人在讨论面试考n以内质数,便想着用erlang写一个较为高效的做法(其实erlang再怎么高效做这种计算还是低效)。
1、素数及相关
素数,又称质数,在一个大于1的自然数中,除了1和此整数自身之外,不能被其他自然数整除的数。
比1大但不是素数的数称为合数。
1和0既不是素数,也不是合数。
算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的。
2、erlang具体实现方法
-module(get_prime).
-compile(export_all).
test_cost_time(N) ->
% N为传入具体的数量,这里使用erlang自带的timer:tc测试所消耗时间
timer:tc(?MODULE,get_prime,[N]).
get_prime(N) ->
length(get_prime(2, N, [])).
%使用erlang的尾递归编程,提高效率
get_prime(Seq, Seq, List) ->
List;
get_prime(Seq, N, List) ->
Rec = for_prime(Seq),
if
Rec =:= null ->
get_prime(Seq + 1, N, List);
true ->
get_prime(Seq + 1, N, [Rec | List])
end.
%判断某一个具体的数是否为质数
for_prime(Seq) ->
SqrtValue = trunc(math:sqrt(Seq)),
for_prime(Seq, lists:seq(2, SqrtValue), 1).
for_prime(_Seq, [], 0) ->
null;
for_prime(Seq, [], _) ->
Seq;
for_prime(_Seq, _, 0) ->
null;
for_prime(Seq, [Num | List], _) ->
for_prime(Seq, List, Seq rem Num).
3、效果
前一个为消耗的微秒数,后一个为N以内总共有多少个质数.
在erlang中,随着数字的扩大,其消耗的时间也是急剧增加的,暴露了erlang计算能力较差的缺点。