确定n是否是具有整数边的三角形的斜边

时间:2015-10-04 15:44:31

标签: algorithm math

我的算法和可能的副本中找到的算法是O(n),而且要求的速度太慢。

1< = n< = 5 * 10 ^ 6

2 个答案:

答案 0 :(得分:4)

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的素因子,并检查至少有一个因子是形式为4 * p + 1的Pythagorean prime。它需要O(Sqrt(C))时间

答案 1 :(得分:2)

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

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

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

然而,因子分解将花费O(N sqrt N)时间。