1、确定给定的整数是否为质数。
质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
因数的定义:因数是指整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因数。
1 is_prime(2).
2 is_prime(3).
3 is_prime(P) :-
4 integer(P),
5 P > 3,
6 P mod 2 =\= 0,
7 \+ has_factor(P,3).
8
9 has_factor(N,L) :-
10 N mod L =:= 0.
11 has_factor(N,L) :-
12 L * L < N,
13 L2 is L + 2,
14 has_factor(N,L2).
注释行:
1 2是质数
2 3是质数
3 满足下列目标则成功
4 确保P为整数
5 从大于3开始
6 剔除偶数
7 从3开始,如果has_factor失败则成功
8 空行
9 满足下列目标则成功
10 成功则终止(终止条件)
11满足下列目标则成功
12能够被整除的数一定满足这个条件
13 忽略偶数
14 加2后继续递归验证
2、确定给定正整数的质数因子。
确定给定正整数的质数因子。
prime_factors(N, L) :- L是N的质数的列表。
1 prime_factors(N,L) :-
2 N > 0,
3 prime_factors(N,L,2).
4
注释行:
1 主谓词 prime_factors/2
2 确保N是大于0的
3 调用谓词prime_factors/3
4
5 prime_factors(N,L,K) :-
6 prime_factors(1,[],_) :-
7 !. %截断
8 prime_factors(N,[F|L],F) :-
9 R is N // F,
10 N =:= R * F,
11 !,
12 prime_factors(R,L,F).
13 prime_factors(N,L,F) :-
14 next_factor(N,F,NF),
15 prime_factors(N,L,NF).
注释行:
5 L是N的因子质数的列表。已知N的质数不小于K。
6 1 的质数因子的列表为空列表
7 截断
8 N是F的倍数
9 取后续要处理的数
10 确保上一步是整除
11 截断
12 递归继续处理后续的数
13 N不是F的倍数
14 取处理N不是F的倍数情况的其它数
15 继续递归调用去处理后续的数字
next_factor(N,F,NF) :-当计算N的素因数时,如果F不除以N,则NF是要成为N因子的下一个更大的候选者。
16 next_factor(_,2,3) :- !.
17 next_factor(N,F,NF) :-
18 F * F < N,
19 !,
20 NF is F + 2.
21 next_factor(N,_,N).
注释行:
16 如果是最小因子数就终止并且截断
17 找下一个因子数
18 最大因数的必要条件
19 截断
20 F增量2赋给NF后回给查询者
21 当F > sqrt(N)返回N本身
例如:
?- prime_factors(315,L).
L = [3, 3, 5, 7].
87 ?- prime_factors(1000,L).
L = [2, 2, 2, 5, 5, 5].
88 ?- prime_factors(1001,L).
L = [7, 11, 13].
3、确定给定正整数的质数因子。构造一组包含质数因子及其重数的列表的列表
Example:
?- prime_factors_mult(315, L).
L = [[3,2],[5,1],[7,1]]
?- L is 3**2*5**1*7**1.
1 :- ensure_loaded(p2_02).
2
3 prime_factors_mult(N,L) :-
4 N > 0,
5 prime_factors_mult(N,L,2).
6
注释行:
1. 确保加载了next_factor/3
2. 空行
3. L是N的素数的列表。它由项[F,M]组成,其中F是素数,M是多样性。
4. 确保N大于0
5. 调用prime_factors_mult/3
6. 空行
7 prime_factors_mult(1,[],_) :- !.
8 prime_factors_mult(N,[[F,M]|L],F) :-
9 divide(N,F,M,R),
10 !,
11 next_factor(R,F,NF),
12 prime_factors_mult(R,L,NF).
13 prime_factors_mult(N,L,F) :-
14 !,
15 next_factor(N,F,NF),
16 prime_factors_mult(N,L,NF).
17
注释行:
7. 1的质数因子列表是空列表
8. [[F,M]|L]是N的素数的列表。已知N的素数不小于K。
9. F除以N
10. 截断
11. 获得要取的下一个元素
12. 继续递归处理后续元素
13. F不除N
14. 截断
15. 获得要取的下一个元素
16. 继续递归处理后续元素
17. 空行
18 divide(N,F,M,R) :-
19 divi(N,F,M,R,0),
20 M > 0.
21
注释行:
18. N = R * F**M, M >= 1, F不是R的因数
19. 从0开始,到M完成
20. 确保M>0
21.
22 divi(N,F,M,R,K) :-
23 S is N // F,
24 N =:= S * F,
25 !,
26 K1 is K + 1,
27 divi(S,F,M,R,K1).
28 divi(N,_,M,N,M).
注释行:
22. F除以N
23. 确保是整除
24. 确保是被整除的
25. 截断
26. K增1后赋值给K1
27. 递归继续处理后续元素
28. 参数1,4相同并且参数3,5相同时终止