Algorithm 两个平方和:其中';这是我的错误吗?
我试图计算,把一个自然数写成两个平方和的方法。我在以下地点工作: 这是我的代码。在我测试它的地方,我发现我认为结果中有错误Algorithm 两个平方和:其中';这是我的错误吗?,algorithm,haskell,number-theory,Algorithm,Haskell,Number Theory,我试图计算,把一个自然数写成两个平方和的方法。我在以下地点工作: 这是我的代码。在我测试它的地方,我发现我认为结果中有错误 sumOfSquares :: Integer -> Int sumOfSquares k = 4 * (d1 - d3) where divs = divisors k d1 = congruents d1_test divs d3 = congruents d3_test divs d1_test n = (n - 1) `m
sumOfSquares :: Integer -> Int
sumOfSquares k = 4 * (d1 - d3)
where
divs = divisors k
d1 = congruents d1_test divs
d3 = congruents d3_test divs
d1_test n = (n - 1) `mod` 4 == 0
d3_test n = (n - 3) `mod` 4 == 0
congruents :: (Integer -> Bool) -> [Integer] -> Int
congruents f divs = length $ filter f divs
divisors :: Integer -> [Integer]
divisors k = divisors' 2 k
where
divisors' n k' | n*n > k' = [k']
| n*n == k' = [n, k']
| k' `mod` n == 0 = (n:(k' `div` n):result)
| otherwise = result
where result = divisors' (n+1) k'
当我运行它时,它会生成:
*Main Numbers.SumOfSquares> sumOfSquares 10
4
我计算过,只有一种方法可以将10表示为两个平方的和
1^2 + 3^2. 注意中间结果(d1-d3)
等于1
我遗漏了一些重要的东西,但不知道是什么。我想你误读了公式的语义。该公式表示以下等式: 这里有两条重要的评论:
- 域是Z,而不是N,因此(-1),(-3),0等也是正方形的有效元素;及
- 我们计算元组的数量,而不是集合的数量,因此顺序很重要(并且(1,2,2)不等于(1,2)):如果(1,3)是一个解,那么(3,1)也是一个解,我们将它们计为两个独立的解
d1=2
和d3=0
。因此有八(4×(2-0)=8)种可能性:
1
开始计数,而不是从2
开始计数:
divisors :: Integer -> [Integer]
divisors k = divisors' 1
where
divisors' i | i2 > k = []
| i2 == k = [i]
| k `mod` i == 0 = (i:(k `div` i):result)
| otherwise = result
where i2 = i*i
result = divisors' (i+1)
除数::整数->[整数]
除数k=除数的1
哪里
除数'i | i2>k=[]
|i2==k=[i]
|k`mod`i==0=(i:(k`div`i):结果)
|否则=结果
式中i2=i*i
结果=除数’(i+1)
我还简化了程序,解决了其他一些语义错误。现在,rk(n)至少是合理的。但是公式本身表明它只能生成四的倍数……你必须考虑:(a)我们计算元组,所以顺序很重要,(b)域是Z,所以负数也是有效的。请不要将公式或其他文本作为图像发布。除数10=[]。hmm@MichaelLitchard:固定的;交换了
k
和i
。