我的算法和可能的副本中找到的算法是O(n)
,而且要求的速度太慢。
1< = n< = 5 * 10 ^ 6
答案 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)时间。