Haskell素数

时间:2018-09-06 04:10:19

标签: haskell primes

我想生成无限质数,但在某些情况下,它会在没有完整无限列表的情况下停止

这是我的尝试:

Primeach :: [Int]

Primeach = [n | n <- [2..] , product [1..n-1] `rem` n == n-1]

1 个答案:

答案 0 :(得分:4)

没有找到大于19个素数的问题

primeach :: [Int]

这是因为您必须为这些数字计算product [1..n-1]。当n >= 22Int时会溢出,因为Int在64位系统中(通常至少有30位)在幕后(通常)是一个64位数字,在32位系统中有32位位n >= 14,它将在n=23处溢出。
由于溢出,您不再需要正确的余数。
例如,对于64位带符号整数,我们有Prelude> product [1..22] 1124000727777607680000 :: Integer Prelude> product [1..22] :: Int -1250660718674968576 :: Int Prelude> product [1..22] `rem` 23 22 :: Integer Prelude> product [1..22] `rem` 23 :: Int -22 :: Int (它是质数):

n=29

如您所见,由于溢出,它不再起作用。 另一个示例是Prelude> product [1..28] 304888344611713860501504000000 :: Integer Prelude> product [1..28] :: Int -5968160532966932480 :: Int Prelude> product [1..28] `rem` 29 28 :: Integer Prelude> product [1..28] `rem` 29 :: Int -27 :: Int ,它也是素数:

Integer

因此,这表明这甚至不是简单的符号翻转。

您有2个选择:

  • 如果要使用此算法,请切换到product s(即使仅用于primeach :: [Int] primeach = [fromInteger n | n <- [2..] , product [1..n-1] `rem` n == n-1] 计算),也永远不会溢出:

    =LEFT(INDEX(2:2,MAX(IF($D2:$ZZ2<>"",COLUMN($D2:$ZZ2),""))),LEN(INDEX(2:2,MAX(IF($D2:$ZZ2<>"",COLUMN($D2:$ZZ2),""))))-4)
  • 使用其他算法,或考虑使用现有的素数软件包。