我想生成无限质数,但在某些情况下,它会在没有完整无限列表的情况下停止
这是我的尝试:
Primeach :: [Int]
Primeach = [n | n <- [2..] , product [1..n-1] `rem` n == n-1]
答案 0 :(得分:4)
没有找到大于19个素数的问题
primeach :: [Int]
这是因为您必须为这些数字计算product [1..n-1]
。当n >= 22
是Int
时会溢出,因为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)
使用其他算法,或考虑使用现有的素数软件包。