최소 공약수


11

기본적으로, 문제는 다음 세트를 위해 S 양수로, 최소 개수 찾을 의 모든 요소의 제수없는 , 즉 .S x S , d xdSxS, dx

넣어야하는 n=|S|그리고 C=max(S) 입니다. 함수 F (x) = x를F(x)= 나누지 않는 가장 작은 소수를 고려하십시오 . F (x) \ leq \ log x를 쉽게 알 수 있습니다 . 그리고 설정에 대한 S ,하자 F (S)는 = 의 요소 분할하지 않는 가장 주요한 S를 . 우리는 상한이 있습니다xF(x)log엑스에스F(에스)=에스

F(S)F(lcm(S))F(Cn)nlogC.

따라서 1 에서 n \ log C 까지의 모든 숫자를 열거하고 S의nlogC 요소를 나누지 않는지 확인 하는 간단한 무차별 알고리즘 은 다항식이며 시간 복잡도 O (n ^ 2 \ log C)가 있습니다.SO(n2logC)

문제를 해결하는 다른 방법은 S의 모든 요소에 대한 모든 요소를 ​​계산하고 S무차별 알고리즘에서 xO(1) 시간 의 답 인지 확인하는 데 사용하는 것입니다 . 이 알고리즘은 시간 복잡도 O(nmin(C,nlogC)+nlogC) 가지며 계산할 필요가 없으므로 O(nlogC) 메모리를 사용합니다. n \ log C 보다 큰 요인을 저장합니다 nlogC. 작은 nC 경우 성능이 더 좋습니다.

세부적으로 알고리즘은 두 부분으로 구성됩니다.

  1. 세트 구축 S^ 의 모든 요소의 모든 요소들로 구성 S

    xS fnlogC, (fxfS^)
    이것은 O(nmin(C,nlogC)) 시간과 O(nlogC) 메모리에서 수행 할 수 있습니다. S의 요소에 S대해 최대 \ sqrt {C} 까지의 모든 숫자를 가진 평가 인수 분해 C또는 최대 n \ log C 까지의 모든 소수 nlogC중 작은 값을 사용하여이를 인수 분해 할 수 있습니다 . 따라서 S의 각 요소 S시간 O(min(C,nlogC)) 시간 으로 고려할 수 있습니다 .)
  2. 최소값 찾으십시오 . 가 시간 내에 수행 될 수 있는지 여부를 확인하는 경우이 단계에는 시간이 필요합니다 .dS^O(|S^|)=O(nlogC)xS^O(1)

관심있는 두 가지 질문이 있습니다.

  1. 문제를 해결하는 더 빠른 알고리즘이 있습니까?
  2. 주어진 과 에 대해, 우리 는 최대 최소 제수가 아닌 제수로 어떻게 세트 를 구성 할 수 있습니까?nCS

1. "사전 계산"이란 무차별 강제 알고리즘을 시작하기 전에 의미했습니다. 2. 인수 분해의 복잡성은 실제로는 지수에 비례합니다 ( 의 정의 참조) . C
SkyterX

점 2의 @DW에서 인수 분해의 복잡성은 숫자를 나타내는 비트 열의 길이에 비해 지수가 작지만 SkyterX는 즉, 크기의 제곱근에 비례 한다고 올바르게 말합니다. 수. O(C)
Lieuwe Vinkhuijzen

@LieuweVinkhuijzen, 그건 나에게 옳아 보이지 않습니다. 인수 분해하여 GNFS의 복잡성과 같을 것이다 훨씬 미만이며 입니다. en.wikipedia.org/wiki/…를 참조하십시오 . O(exp{1.9(logC)1/3(loglogC)2/3})O(C)
DW

두 번째 방법이 "작은 및 대해"더 잘 수행된다는 진술은 옳지 않습니다. 경우에만 성능이 향상됩니다 . 따라서 두 번째 방법이 더 작게 수행하려면 이 커야합니다. C n nnnC/log(C)
DW

@DW 당신 말이 맞아요, GNFS의 복잡성을 알지 못했습니다.
Lieuwe Vinkhuijzen

답변:


6

정수 인수 분해를 위해 더 나은 알고리즘을 사용하여 두 번째 알고리즘을 개선 할 수 있습니다.

여기에 관련된 정수 인수 분해 알고리즘이 있습니다.

  • GNFS 는 실행 시간이 인 정수 를 인수 분해 할 수 있습니다 .O ( L C [ 0.33 , 1.92 ] )CO(LC[0.33,1.92])

  • ECM은 요인을 찾을 수 시간과 실행 (라도 존재하는 경우) ; 모든 요인을 찾는 데 시간이 걸립니다 (ECM 실행 시간에 비해 상대적으로 작음).O ( L n log C [ 0.5 , 1.41 ] ) O ( log C / log ( n log C ) )nlogCO(LnlogC[0.5,1.41])O(logC/log(nlogC))

여기서 입니다.Ln[α,c]=exp{c(logn)α(loglogn)1α}

그것은 실행 시간에 대해 꽤 끔찍한 표정이지만, 중요한 사실은 이것이 당신이 언급 한 방법보다 빠르다는 것입니다. 특히 는 보다 점진적으로 훨씬 작습니다 . 즉, GNFS는 가능한 모든 요인 시도하는 것보다 훨씬 빠릅니다 . 또한 은 보다 점진적으로 훨씬 작습니다 . 즉 ECM은 가능한 모든 요인 시도하는 것보다 훨씬 빠릅니다 .LC[0.33,1.92] L n log C [0.5,1.41]nlogCnlogC로그[0.5,1.41]로그로그

따라서이 방법의 총 실행 시간은 대략 이며 이는이 방법보다 첫 번째 방법이며 두 번째 방법보다 점진적으로 좋습니다. 더 잘 할 수 있는지 모르겠습니다.영형~(([0.33,1.92],로그[0.5,1.41]))


이 문제에 대한 빠른 알고리즘에는 입력 세트 의 일종의 인수 분해가 포함되어야한다고 생각합니다 . 이 인수 분해 알고리즘을 확인하지만 여전히 제대로 테스트하는 데 문제가 있으며, 최대 답변으로 세트 를 구성하는 것에 대해 언급 한 두 번째 문제가 발생 합니다. SS에스
SkyterX

ECM은 귀하가 제공 한 시간에 하나의 요소를 찾습니다 . 숫자의 모든 요소가 ≤ n log C 인 경우 최대 log C / log (n log C) 시간까지 알고리즘을 반복해야합니다.
gnasher729

3

최소 공통 제수는 N log C만큼 클 수 있지만 N 수가 무작위로 분포 된 경우 최소 공통 제수는 아마도 N보다 훨씬 작거나, 아마도 N보다 훨씬 적을 것입니다. 소수는 어떤 수의 제수입니다.

각 소수 p에 대해 인덱스 있는데, 이는 해당 인덱스까지의 모든 숫자가 p로 나눌 수 있는지 검사되었으며, 그 수로 나눌 수있는 모든 숫자의 목록이 있음을 의미합니다.kp

그런 다음 d = 2, 3, 4, ...의 경우 d로 나눌 수있는 숫자를 찾거나 없음을 나타냅니다. 우리는 d의 최대 소인수 p를 취합니다. 그런 다음 p로 나눌 수있는 모든 숫자도 d로 나눌 수 있는지 확인합니다. 아무것도 발견되지 않으면 p 로 나눌 수있는 인덱스> 추가 숫자를 확인 하고, 와 p로 나눌 수있는 숫자 목록을 업데이트 하고, 각 숫자가 d로 나눌 수 있는지 확인합니다.k p케이케이

p로 나눌 수있는 숫자가 있는지 확인하기 위해 평균 p 숫자를 확인합니다. 나중에 2p로 나눌 수있는 숫자가 있는지 확인하면 하나의 숫자 (p로 나눌 수있는 숫자) 만 검사해야 할 확률은 50 %이며 평균 2p 더 많은 숫자를 확인할 가능성은 50 %입니다. 3p로 나눌 수있는 숫자를 찾는 것은 매우 빠르며, N 개만 있기 때문에 p로 나눌 수있는 N 개 이상의 숫자를 확인하지 않습니다.

나는 이것이 약 나누기 확인으로 해결 되기를 바랍니다 .2/영형

추신. 난수에 대한 결과는 얼마나됩니까?

N 개의 난수가 있다고 가정합니다. N 수 중 하나를 d로 나눌 가능성은 1-(1-1 / d) ^ N입니다. 나는 각 확률 1 ≤ d ≤ k가 난수 중 하나의 인수 일 확률을 이러한 확률을 곱하여 계산합니다 (Ok, 그 확률은 독립적이지 않기 때문에 약간 dodgy입니다).

N = 1000 인 가정을 가정하면 숫자 1..244 중 하나가 숫자를 나누지 않을 확률이 50 %이고, 507까지 모든 숫자가 숫자 중 하나를 나눌 확률이 10 억입니다. N = 10,000을 사용하면 숫자 1..1726 중 하나가 숫자를 나누지 않을 확률이 50 %이며, 2979까지 모든 숫자가 숫자 중 하나를 나눌 확률이 10 억입니다.

N 개의 랜덤 입력의 경우 결과의 크기가 N / ln N보다 약간 큽니다. 아마도 N / ln N * (ln ln N) ^ 2와 같은 것입니다. 이유는 다음과 같습니다.

N 개의 난수 중 적어도 하나가 난수 d로 나눌 수있는 확률은 1-1 입니다. d가 N 주위에 있으면, (1-1 은 약 1-exp (-1) ≈ 0.6321입니다. 그것은 단일 제수를위한 것입니다. 여러 숫자 d ≈ N이 각각 N 숫자 중 적어도 하나의 제수 일 가능성은 매우 적으므로 최대 d는 N보다 상당히 작습니다. 1 ( 1 1 / d ) N1(11/)1(11/)

d << N이면 입니다.1(11/)1이자형엑스(/)

d ≈ N / ln N이면 입니다.1exp(N/d)1exp(lnN)=11/

우리는 이러한 확률을 약 N / ln N 값 d에 추가 할 것이지만, 대부분의 d에 대해 결과는 상당히 커질 것이므로 가장 큰 d는 N / ln N보다 다소 크지 만 N보다 상당히 작습니다.

추신. d로 나눌 수있는 숫자 찾기 :

우리는 d의 가장 큰 소인수 p를 선택한 다음 먼저 p로 나눌 수있는 것으로 알려진 숫자를 조사합니다. d = kp라고 말합니다. 그런 다음 평균적으로 우리는이 특정 d를 확인하면서 p로 나눌 수있는 k 개의 숫자 만 확인하고 p로 나눌 수있는 모든 d에 대해 최대 p로 나눌 수있는 모든 N 값을 확인합니다. 실제로, 모든 N 값을 확인한 후 알고리즘이 종료 될 가능성이 높기 때문에 대부분의 프라임 p에 대해 N 값보다 작은 값을 확인합니다. 따라서 결과가 R이면 N보다 작은 값을 R보다 작은 각 소수로 나눈 것으로 기대합니다. R ≤ N이라고 가정하면 약 N ^ 2 / log N 검사입니다.

추신. 일부 테스트 실행

N = 1,000,000의 난수> 0으로이 알고리즘을 몇 차례 실행했습니다. 가장 일반적인 비제 수는 68,000에서 128,000 사이였으며 대부분의 실행은 100,000에서 120,000 사이였습니다. 나눗셈의 수는 5 억 5 천만에서 1 억 8 천만 사이였으며 이는 (N / ln N) ^ 2보다 훨씬 적다. 대부분의 경우는 1 억에서 1 억 5 천만 개의 부서로 사용되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.