【问题标题】:Find amount of pairs of (x,y) where x^k + y^k = n查找 (x,y) 对的数量,其中 x^k + y^k = n
【发布时间】:2017-04-07 10:23:53
【问题描述】:

最近我看到了数论问题,其中我需要找到数对 (x,y) 的数量,以给出 x^k + y^k = n 的解,其中给出了 k 和 n。我提出的唯一解决方案是暴力破解所有可能的 x,y 对并检查它们是否等于 n。但我需要为大 n 和 k 做这件事,1

【问题讨论】:

  • 许多可能的优化,但第一个:没有必要强行pairs。对于每个候选 x,找到 n - x^k 并确定它是否是 k 次方。 (当然,您需要特例 k=1k=2 也有数论技巧。)
  • xy 应该积极吗?
  • @DmitryBychenko 是的,x 和 y 是自然数

标签: algorithm math number-theory


【解决方案1】:

一种可能的方法是使用a hash table

首先,计算结果小于 n 的所有值 xk。将每个这样的值添加到哈希表中,映射 xk -> x(而不是相反,稍后会清楚为什么)。

然后,从哈希集中遍历键 xk,并检查补码 i.e. n - xk 是否也是哈希集中的一个键。

如果 n - xk 也是一个键,那么哈希表会将它映射到值 y 中,这样 n - xk = y k,我们确定了一个有效的 (x, y) 对。

否则,如果 n - xk 不是哈希表的键,则 x 为一个元素时无解。


对上述基本理念进行了改进。例如,如果找到了一个好对 (x, y),那么这意味着 (y, x) 也是一个好对。使用它,无法测试大于 n/2 的 x 值,因为这会导致已经枚举的对。


编辑

正如 Dmitry Bychenko 在 cmets 部分中指出的那样,在某些情况下这种方法会占用大量内存,因此不太可行。

这个问题在 k = 2 时最为明显,因为随着 k 的增加,xk

对于k = 2,可以不使用哈希表来解决这个问题,而是直接检查n - x2 是否是一个完美的正方形。要检查一个数字是否是完全平方,可以应用 sqrt 函数并检查结果是否为整数值。


另一种方法,任何 k 的空间复杂度为 O(1),是使用二进制搜索来检查 n - xk 是否是整数的 k 次方。这在 O(n1/k * log(n))

类中具有时间复杂度

【讨论】:

  • 如果 n <= 10^18k == 2 那么我们必须计算多达 十亿 个项目...
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2021-12-24
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多