【问题标题】:Determine whether n is the hypotenuse of a triangle having integral sides确定 n 是否是具有整数边的三角形的斜边
【发布时间】:2015-10-04 15:44:30
【问题描述】:

我的算法和在可能重复中找到的算法是O(n),对于要求来说太慢了。

1

【问题讨论】:

  • 嗯,尝试 i=1 to n-1 中的每个数字,检查 SQRT(n^2 - i^2) 是否为整数是一个 O(n) 算法,虽然远不是最快的。
  • 这里我需要一个比 O(n) 更快的解决方案..
  • n的下限和上限是多少?
  • 显而易见的算法是O(n^0.5)——搜索数字i直到(n/2)^0.5,看看n - i^2是不是正方形。
  • 只有 500 万个值。 O(1) 的解决方案是预先计算它们。

标签: algorithm math


【解决方案1】:

Euclid's formula 告诉我们每个毕达哥拉斯三元组 (a, b, c) 都是由整数 k, n,m 组成的,其中 m>n

a=k*(m^2-n^2)
b=2*k*m*n
c=k*(m^2+n^2)

如果 C 可以表示为整数 k 与两个不相等整数平方和的乘积,则 C 是某个具有整数边的直角三角形的斜边。我们可以找到 C 的质因数并检查至少一个因数是 4*p+1 形式的Pythagorean prime。它需要 O(Sqrt(C)) 时间

【讨论】:

  • 实际上,如文章中所述,该公式不会生成所有可能的毕达哥拉斯三元组。但是,如果您首先从 a, b, c 中删除任何公因数,这样它们就可以互质了。
  • @RBarryYoung 你是对的,我认为这个事实对于反向问题是无关紧要的,但我错了。已更正。
  • 为什么需要O(sqrt(C)) 时间?如果4*p+1 形式的一个素数大于sqrt(C) 怎么办?我知道我可以检查n/i 的形式是否为4*p+1,但是n=5 的情况呢?在这种情况下,我将不得不迭代到n,所以它看起来像O(n)
  • @Anukul Sangwan 您需要大约 Sqrt(C) 时间来使用最简单的试除法获得所有主要因素,并使用更复杂的分解方法获得更好的时间。请注意,如果存在大素数,它将在 Sqrt(C) 达到 111-> 除以 3 -> 得到 37 之前计算
【解决方案2】:

正如@MBo 已经建议的那样,我们只需要检查 n 是否具有 4k+1 形式的质因数。这可以通过计算 n 的素数分解在 O(sqrt(n)) 时间内完成。

但是,如果您需要对上述范围内的所有值执行此操作,则可以使用 sieve 计算所有 4k+1 形式的素数。然后将这些素数的所有倍数(在 [1..5*10**6] 范围内)标记为有效斜边。

该算法将在大约 O(N log N log log N)(筛子)+ 与第二部分的筛子大致相同的时间内为所有输入计算此布尔函数?形式分析将取决于 4k+1 形式的素数分布。我不确定这样的分析是如何完成的。

而因式分解需要 O(N sqrt N) 时间。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2022-11-10
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多