【问题标题】:Checking If a Number is Special Prime检查一个数字是否是特殊素数
【发布时间】:2019-10-10 21:13:13
【问题描述】:

我正在尝试创建一个在 Haskell 中打印特殊素数的程序 isSpecialPrime :: Integer -> Bool 。如果一个数字是一个特殊的素数,该函数应该返回。特殊素数是可以写成两个相邻素数和 1 之和的素数。特殊素数的示例是 19 = 7 + 11 + 1。

我已经成功地检查了一个数字是否是素数:

isPrime ::  Integer -> Bool

isPrime 1 = False
isPrime 2 = True
isPrime n 
 | (length [x | x <- [2 .. n-1],  n  `mod` x == 0]) > 0 = False
 | otherwise = True 

调整代码以仅返回特殊素数

的任何想法

输出 put 应该是这样的

> isSpecialPrime 19
True

【问题讨论】:

  • 你可以做一个简单的线性搜索:从一个素数列表开始,然后检查每个相邻对的总和,直到它等于你的输入减一,或者超过输入。

标签: haskell primes


【解决方案1】:

如果你使用辅助功能,你可以这样做:

isPrime ::  Integer -> Bool
isPrime 1 = False
isPrime 2 = True
isPrime n 
 | (length [x | x <- [2 .. n-1],  n  `mod` x == 0]) > 0 = False
 | otherwise = True 

isSpecialPrime :: Integer -> Bool
isSpecialPrime 1 = False
isSpecialPrime x =  
 let firstNeighboring = findNeighbore x in
 isSpecialPrime' x firstNeighboring

isSpecialPrime' :: Integer -> Integer -> Bool
isSpecialPrime' _ 0 = False 
isSpecialPrime' p x =  
 let firstNeighboring = findNeighbore x in
 let secondNeighboring = findNeighbore firstNeighboring in
 if (1 + firstNeighboring + secondNeighboring) == p
 then True
 else isSpecialPrime' p firstNeighboring

findNeighbore 0 = 0
findNeighbore x = if isPrime (x-1) then x-1 else findNeighbore (x-1)

primes :: [Integer]
primes = sieve (2 : [3, 5..])
  where
    sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]

举个例子:

filter isSpecialPrime $ take 40 primes
=> [13,19,31,37,43,53,61,79,101,113,139,163,173]

一点优化:

isSpecialPrime' :: Integer -> Integer -> Bool
isSpecialPrime' _ 1 = False 
isSpecialPrime' p x =
 let firstNeighboring = findNeighbore x in
 let secondNeighboring = findNeighbore firstNeighboring in
 let sumNeigh = secondNeighboring + firstNeighboring in
 if (p `div` 3) > sumNeigh
  then False else 
  if (1 + sumNeigh) == p
  then True
  else isSpecialPrime' p firstNeighboring

示例:

filter isSpecialPrime $ take 100 primes
=> [13,19,31,37,43,53,61,79,101,113,139,163,173,199,211,223,241,269,277,331,353,373,397,457,463,509,521,541]

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2016-08-21
    • 2021-07-10
    • 2022-08-11
    相关资源
    最近更新 更多