Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 两个平方和:其中';这是我的错误吗?_Algorithm_Haskell_Number Theory - Fatal编程技术网

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)也是一个解,我们将它们计为两个独立的解
现在10有以下除数:1、2、5、10(您的程序忘记了1和10)。两个与1模4:1和5全等。此外,没有与3模4全等的因子。因此
d1=2
d3=0
。因此有八(4×(2-0)=8)种可能性:

  • (1,3):12+32=10
  • (3,1):32+12=10
  • (1,-3):12+(-3)2=10
  • (3,-1):32+(-1)2=10
  • (-1,3):(-1)2+32=10
  • (-3,1):(-3)2+12=10
  • (-1,-3):(-1)2+(-3)2=10
  • (-3,-1):(-3)2+(-1)2=10
  • 现在我们只需要用你的程序来解决这个问题。您只需从
    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