최소 공통 제수는 N log C만큼 클 수 있지만 N 수가 무작위로 분포 된 경우 최소 공통 제수는 아마도 N보다 훨씬 작거나, 아마도 N보다 훨씬 적을 것입니다. 소수는 어떤 수의 제수입니다.
각 소수 p에 대해 인덱스 있는데, 이는 해당 인덱스까지의 모든 숫자가 p로 나눌 수 있는지 검사되었으며, 그 수로 나눌 수있는 모든 숫자의 목록이 있음을 의미합니다.케이피
그런 다음 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/ lo g엔
추신. 난수에 대한 결과는 얼마나됩니까?
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 − ( 1 − 1 / d)엔1 − ( 1 − 1 / d)엔
d << N이면 입니다.1 − ( 1 − 1 / d)엔≈ 1 - E (X) P ( - N/ d)
d ≈ N / ln N이면 입니다.1 − e x p ( − N/ d)≈1−exp(−lnN)=1−1/N
우리는 이러한 확률을 약 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 천만 개의 부서로 사용되었습니다.