不同素数的乘积作为完美平方的总和

时间:2016-12-20 11:34:27

标签: algorithm math primes

给定:k个不同的素数说a1,a2,.....,ak

目标:将给定素数的乘积写为完美正方形之和所需的最小正方形数。

示例:

k = 2, a1 = 3, a2 = 5 a1*a2 = 15 = 9 + 4 + 1 + 1即总和4个完美的正方形

k = 3, a1 = 2, a2 = 5, a3 = 11 a1*a2*a3 = 110 = 100 + 9 + 1即3个完美正方形

我的算法

p = a1*a2*...........*ak

counter = 0
while p != 0:
    find the largest perfect square <= p say z
    p = p-z
    counter = counter + 1
return counter

我已经测试过几个例子。对我而言似乎是正确的。但在少数例子的基础上进行概括是不正确的。如何证明这一点(如果算法正确)?

1 个答案:

答案 0 :(得分:7)

解决方案是对的吗?

实际上,在这些情况下你的解决方案是错误的:

  • str1.ClearFilter(); str1.DataSource = countyDataTable; str1.DataBind();
  • k = 1, a1 = 61 => Your result: 61 = 49 + 9 + 1 + 1 + 1 / Best Result: 61 = 36 + 25


使用勒让德的三平方定理

的解决方案

Legendre's Three-square Theorem是全部自然数n除了n是k = 2, a1 = 2, a2 = 37 => Your result: 74 = 64 + 9 + 1 / Best Result: 74 = 49 + 25的形式可以表示三个方格的总和。
还有Lagrange's Four-square Theorem,所有自然数都可以表示四个方格的总和。

所以算法是:

  1. 计算n是4^a (8b + 7)的形式。您可以使用素数分解。如果是这样,答案是4。
  2. 计算n是否是平方数。如果是这样,答案是1。
  3. 计算n是否可以表示两个方格。如果是这样,答案是2。
  4. 如果1-3全为假,答案是3。
  5. 您可以为4^a (8b + 7)执行操作1,为O(sqrt(n))执行操作2,为O(log(n))执行操作3,因此总时间复杂度为O(sqrt(n) * log(n))

    编辑: 由于n是一个明显的素数产品,因此没有出现平方数,因此没有出现案例2。 如果n mod 8 = 7,则出现情况1。