list - 生成所有可能互素数的排序列表

标签 list sorting haskell primes infinite

我需要生成所有互素数的无限排序列表。 每对中的第一个元素必须小于第二个。 排序必须按升序进行——按对元素的总和;如果两个总和相等,则由该对的第一个元素。

因此,结果列表必须是

[(2,3),(2,5),(3,4),(3,5),(2,7),(4,5),(3,7),(2,9),(3,8),(4,7)...`

这是我的解决方案。

coprimes :: [(Int, Int)]
coprimes = sortBy (\t1 t2 -> if uncurry (+) t1 <= uncurry (+) t2 then LT else GT) $ helper [2..]
    where helper xs = [(x,y) | x <- xs, y <- xs, x < y, gcd x y == 1]

问题是我不能拿n 第一对。我意识到无法对无限列表进行排序。

但是我怎样才能以惰性方式生成相同的序列呢?

最佳答案

虽然可能不是最佳方式,但如果您首先生成所有可能的对然后过滤它们,它应该会起作用。

因此使用您的标准:

pairs :: [(Integer,Integer)]
pairs = [ (i,l-i) | l <- [1..], i <- [1..l-1] ]

coprimes :: [(Integer,Integer)]
coprimes = [ (i,j) | (i,j) <- pairs, 1 < i, i < j,gcd i j == 1]

产生

λ> take 10 coprimes
[(2,3),(2,5),(3,4),(3,5),(2,7),(4,5),(3,7),(2,9),(3,8),(4,7)]

现在你当然可以放一些东西了1 < ii < j想到pairs定义甚至加入他们,但我认为这里发生的事情更明显

关于list - 生成所有可能互素数的排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33710914/

相关文章:

python - 删除Python列表中的相邻重复项

javascript - 用点、字母、数字对对象数组进行排序。我能够按数字排序,但混合值很难。不确定是否可以做对

haskell - 我如何告诉 Cabal 使用哪个依赖项?

Haskell 矩阵相等失败

python - 将字符串列表从文件转换为整数列表

java - 列出并查找全部

python-为排序的numpy矩阵中第1列的每个值选择第2列的前k个元素

python - 仅当第一列中的值相同时才根据第二列对 numpy 数组进行排序

arrays - 数组的模式匹配

list - gnu Prolog powerset 修改