一个可能的蛮力实施将是
head [n|n <- [1..], all ((==0).(n `mod`)) [1..20]]
但在这种情况下,它会花费太长时间。该all
函数测试谓词是否适用于列表的所有元素。lambda 是 的缩写(\d -> mod n d == 0)
。
那么如何加快计算速度呢?让我们将除数分解为素数,并搜索每个素数的最高幂:
2 = 2
3 = 3
4 = 2^2
5 = 5
6 = 2 * 3
7 = 7
8 = 2^3
9 = 3^2
10 = 2 * 5
11 = 11
12 = 2^2*3
13 = 13
14 = 2 *7
15 = 3 * 5
16 = 2^4
17 = 17
18 = 2 * 3^2
19 = 19
20 = 2^2 * 5
--------------------------------
max= 2^4*3^2*5*7*11*13*17*19
使用这个数字,我们有:
all ((==0).(2^4*3^2*5*7*11*13*17*19 `mod`)) [1..20]
--True
嘿,它可以被 1 到 20 的所有数字整除。这并不奇怪。例如,它可以被 15 整除,因为它“包含”因子 3 和 5,并且它可以被 16 整除,因为它“包含”因子 2^4。但它是可能的最小数字吗?想一想...