자연수 집합의 최대 쌍별 GCD를 효율적으로 찾기


9

다음 문제를 고려하십시오.

허락하다 S={s1,s2,...sn} 자연수의 유한 부분 집합이어야합니다.

허락하다 G={ gcd(si,sj) | si,sjS, sisj} 어디 gcd(x,y) 가장 큰 제수입니다 xy

최대 요소 찾기 G.

이 문제는 Euclid의 알고리즘을 사용하여 각 쌍의 최대 공약수를 취하고 가장 큰 알고리즘을 추적하여 해결할 수 있습니다.

이것을 해결하는 더 효율적인 방법이 있습니까?


3
네트워크 장치에서 P 및 Q 마이닝 : 광범위한 약한 키 감지의 3.3 섹션 (Heninger et al, Usenix Security 2012)을 살펴볼 수 있습니다. 그들은 쌍으로 gcd를 계산하는 알고리즘을 설명합니다.O(nlgn)gcd는 특정 환경에서 제품 트리와 나머지 트리를 사용합니다. 그래도 문제가 확장되는지 모르겠습니다.
DW

소인수 분해를 시도해 보셨습니까?
Ryan

1
모든 숫자가 상대적으로 소수이지만 고려하기 어렵다고 가정합니다 (예 : 각각 si 동일하다 piqi 큰 별개의 소수 pi,qi). 그런 다음 모든 쌍 GCD를 확인하지 않는 것이 어려워 보입니다. (모든 쌍을 확인한 후(sn1,sn) 모든 쌍별 GCD가 1. 당신은 어떻게 추측 할 수 있습니까gcd(sn1,sn)계산하지 않고?)
usul

@usul DW의 링크는 바로 그 문제입니다. 10 억 개에 달하는 엄청난 수의 암호화 키는 모두 두 개의 고유 한 소수의 제품이어야합니다. 그러나 일부 암호화 키에는 공통 요소가 있다고 생각합니다 (두 키의 gcd이므로 둘 다 쉽게 인수 할 수 있습니다). 이 알고리즘을 사용하면 n = 10 억의 n (n-1) / 2 gcd를 계산하지 않고도 공통 인자를 가진 키를 찾을 수 있습니다.
gnasher729

답변:


-2

다음은 효율적인 알고리즘입니다 ( Python ). 아래 설명을 찾으십시오.

def max_gcd_pair(S):
    # Assumption 1: S is the list of numbers
    # Assumption 2: There are no duplicates in S

    s = set(S)
    m = max(S)

    res = 0
    i = m

    while(i > 0):
        a = i
        cnt = 0
        while (a<=m): # a maxed at max of the list
            if a in s:   
               cnt += 1
            a += i

        if cnt >= 2:  # we have found the result
            res = i
            break

        i = i -1 

    return res

위의 코드 스 니펫에 대한 설명 :

이 문제에서 다음을 관찰합니다.

  1. 결과는 더 이상 될 수 없습니다 max(S)
  2. 결과는이 목록에 2 개 이상의 배수가있는 숫자입니다. S
  3. 실제로 결과는 max위에서 언급 한 속성을 가진 모든 숫자입니다.

이러한 관찰을 통해 프로그램은 다음을 수행합니다.

  1. set목록을 만드십시오 . 세트를 효율적으로 검색 할 수 있으므로O(log(n))
  2. 목록의 최대 값을 찾아 변수에 저장하십시오 m.
  3. m까지 시작 1하여 세트에 둘 이상의 배수가있는 첫 번째 숫자를 찾으십시오. 처음 발견 된 숫자는 결과입니다.

이것이 분명하기를 바랍니다. 더 자세한 설명이 필요하면 알려주십시오.


1
알고리즘을 단어로 설명 할 수 있습니까? 이것은 프로그래밍 사이트가 아닙니다.
Yuval Filmus

@ YuvalFilmus 설명을 추가했습니다. 도움이 되었기를 바랍니다.
Subhendu Ranjan Mishra

2
모든 요소가 고유하면 어떻게 되나요? 이것은 최대 GCD가 1이라는 것을 의미하지는 않습니다.{2,4}최대 GCD는 2입니다.
Yuval Filmus

@YuvalFilmus는 둘 이상의 배수 가 세트에 있는지 확인할 때까지 i시작 합니다. 이 예에서 2의 2의 배수는 세트 '2와 4'에 있습니다. 답은 2입니다. 내부 루프는 m`이 목록의 매스크가 될 때까지 모든 여러 항목을 확인 합니다. m1iwhileim' as
Subhendu Ranjan Mishra

1
글쎄, 이것은 끔찍한 알고리즘입니다. 두 숫자의 배열x,y 길이의 n비트 당 GCD 계산에는 다항식 시간이 걸리지 만 알고리즘은 최악의 경우 지수 시간이 걸립니다 (숫자가 비교적 소수 일 때).
Yuval Filmus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.