우리는 양의 정수 집합을가집니다.집합 구성원의 GCD를 재귀 적으로 계산합니다.
이 세트의 모든 가능한 정수 쌍 중 최대 공약수를 계산하여 새 세트를 만듭니다.
집합에 구성원이 하나만 남을 때까지 위의 단계를 다시 실행합니다.
이 프로세스가 생성하는 새 집합 수와 마지막 집합의 구성원이 1인지 계산하는 O (n) 메서드가 있습니까?
내가 설명한 프로세스를 보여주는 일부 파이썬 코드.
from itertools import combinations
from fractions import gcd
import random
def gen_new_set(a):
count = 0
while len(a) != 0:
print str(count)+':\t'+str(len(a))+'\t'+str(a)
a = set(gcd(x[0], x[1]) for x in combinations(a,2))
count += 1
if __name__ == '__main__':
a = set(random.sample(range(1,40), 10))
gen_new_set(a)
나는 일정한 시간에 이것을 할 수있는 방법이있을 것이라고 생각하지 않는다. 첫 번째 집합의 내용을 반복하여 O (n)을 최소화 할 수 있도록 일반화해야 할 것입니다. – Joel
와일드 카드. 나는 O (n)를 의미했다. 나는 그것을 편집 할 것이다. – AmV
n 개의 숫자로 시작한 다음 가능한 쌍마다 GCD를 계산합니다. 이 후에는 n^2 값을 갖게됩니다 (중복이 많은 경우). 나는 c가 상수 인 n^2 값의 집합에서 최대 c 개의 값이있을 수 있다는 것을 수학적으로 증명할 방법이 없다. 이것이 입증되지 않는 한, 첫 번째 단계 (k는 아마도 소수)에서 k * n 개의 숫자를 가지며 최상의 O (nlogn) 솔루션을 제공 할 수 있습니다. 그래서 O (n) 해법은 불가능합니다. – Diptendu