我正在尝试找到一种算法,对于给定数组A = [a1,a2,...,a_n]的整数,如果有两个索引i = = j,则返回true,这样gcd(ai,aj) )= 1(否则为假)。我正在尝试最小化此算法的复杂性。
当然,显而易见的解决方案是对每对使用Euclid算法(ai,aj),但其复杂性是欧几里德算法复杂度的n(n + 1)/ 2倍。
有没有办法在O(n)或O(n * log(n))中做到这一点?
答案 0 :(得分:1)
让hasCoprimePair(S)成为返回True的过程,如果有一对副本S,否则为False,并让它有两个参数变量hasCoprimePair(S,T),如果存在一对副本,则返回True, S中的整数和T中的一个,否则为False。
现在让p为素数。取一组S(整数)并将其分为两组,T和U,这样T包含可被p整除的S元素,U包含其他元素(不能被p整除的元素)。因为T中的每个元素都可以被p整除,所以必须遵循hasCoprimePair(T)= False。所以我们有
hasCoprimePair(S) = hasCoprimePair(T, U) or hasCoprimePair(U)
第一个子问题(hasCoprimePair(T,U))可以在| T | x | U |中求解。 GCD操作和第二个子问题是递归的;您可以再次使用不同的p值将其拆分。将S拆分为T和U集需要O(n)时间,因此与原始算法相比,您可以保存一些GCD操作,但渐近复杂度仍然是二次的。