Ít phổ biến nhất không chia


11

Về cơ bản, vấn đề là: Đối với một tập S các số dương tính, hãy tìm một số lượng tối thiểu d đó không phải là một ước của bất kỳ yếu tố của S , tức là xS, dx .

Suy ravà . Xét hàm F (x) = số nguyên tố nhỏ nhất không chia x . Dễ dàng thấy rằng F (x) \ leq \ log x . Và đối với một tập S , chúng ta hãy F (S) = thủ nhất mà không chia bất kỳ yếu tố của S . Chúng tôi có một giới hạn trênn=|S|C=max(S)F(x)=xF(x)logxSF(S)=S

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

Do đó, thuật toán brute-force đơn giản, liệt kê tất cả các số từ 1 đến nlogC và kiểm tra xem nó có phân chia bất kỳ phần tử nào của S , là đa thức và có độ phức tạp thời gian O(n2logC) .

Một cách khác để giải quyết vấn đề là tính toán tất cả các yếu tố cho mọi phần tử của S và sử dụng chúng trong thuật toán brute-force để kiểm tra xem x có phải là câu trả lời trong thời gian O(1) . Thuật toán này có độ phức tạp thời gian O(nmin(C,nlogC)+nlogC) và sử dụng bộ nhớ O(nlogC) , vì chúng ta không cần phải tính toán và yếu tố cửa hàng lớn hơn nlogC . Đối với nC nhỏ , Cnó hoạt động tốt hơn.

Cụ thể, thuật toán bao gồm hai phần:

  1. Xây dựng một bộ S^ bao gồm tất cả các yếu tố của tất cả các yếu tố của S , tức là

    xS fnlogC, (fxfS^)
    Điều này có thể được thực hiện trong thời gian O(nmin(C,nlogC)) và bộ nhớ O(nlogC) . (Trong trường hợp thực hiện điều này xuất phát từ Đối với bất kỳ yếu tố? S , chúng ta có thể cân nhắc sử dụng một trong hai thừa số thử nghiệm với tất cả các số lên đến C hoặc tất cả các số nguyên tố lên đến nlogC , tùy theo cái nào nhỏ hơn, do đó mỗi phần tử của S có thể được tính vào thời gian O(min(C,nlogC)) .)
  2. Tìm số lượng tối thiểu . Bước này yêu cầu thời gian , nếu kiểm tra xem có thể được thực hiện trong thời gian .dS^O(|S^|)=O(nlogC)xS^O(1)

Tôi có hai câu hỏi mà tôi quan tâm:

  1. Có một thuật toán nhanh hơn để giải quyết vấn đề?
  2. Với và , làm thế nào chúng ta có thể xây dựng một tập hợp với phép chia không tối thiểu phổ biến tối đa?nCS

1. Bằng cách "tiền mã hóa" tôi có nghĩa là trước khi bắt đầu thuật toán brute-force. 2. Sự phức tạp của bao thanh toán thực sự subexponential, xem definiton của . C
SkyterX

@DW ở điểm 2, độ phức tạp của bao thanh toán là phụ thuộc vào độ dài của chuỗi bit đại diện cho số, nhưng SkyterX nói chính xác rằng đó là , nghĩa là tỷ lệ với căn bậc hai của kích thước con số. O(C)
Liêuwe Vinkhuijzen

@LieuweVinkhuijzen, điều đó không đúng với tôi. Độ phức tạp của bao thanh toán khi sử dụng GNFS sẽ giống như , ít hơn đáng kể . Xem en.wikipedia.org/wiki/ . O(exp{1.9(logC)1/3(loglogC)2/3})O(C)
DW

Tuyên bố rằng phương thức thứ hai thực hiện tốt hơn "cho nhỏ và " không hoàn toàn đúng. Nó chỉ hoạt động tốt hơn nếu . Do đó cần phải lớn để phương thức thứ hai thực hiện tốt hơn (không nhỏ). nCnC/log(C)n
DW

@DW Bạn nói đúng, tôi không nhận thức được sự phức tạp của GNFS.
Liêuwe Vinkhuijzen

Câu trả lời:


6

Có thể cải thiện thuật toán thứ hai của bạn bằng cách sử dụng các thuật toán tốt hơn cho hệ số nguyên.

Có hai thuật toán cho hệ số nguyên có liên quan ở đây:

  • GNFS có thể tính một số nguyên với thời gian chạy .CO(LC[0.33,1.92])

  • ECM có thể tìm thấy một yếu tố (nếu có) với thời gian chạy ; việc tìm kiếm tất cả các yếu tố sẽ mất thời gian (tương đối nhỏ so với thời gian chạy của ECM).nlogCO(LnlogC[0.5,1.41])O(logC/log(nlogC))

Ở đây .Ln[α,c]=exp{c(logn)α(loglogn)1α}

Đó là một biểu hiện trông khá khủng khiếp trong thời gian hoạt động, nhưng thực tế quan trọng là nó nhanh hơn các phương pháp bạn đã đề cập. Cụ thể, nhỏ hơn nhiều so với , nghĩa là, GNFS nhanh hơn nhiều so với việc thử tất cả các yếu tố có thể . Cũng là tiệm nhỏ hơn nhiều so , tức là, ECM là nhanh hơn nhiều so với cố gắng tất cả các yếu tố có thể .LC[0.33,1.92]CCLnlogC[0.5,1.41]nlogCnlogC

Vì vậy, tổng thời gian chạy cho phương thức này là khoảng và điều này tốt hơn so với bạn phương pháp đầu tiên và tốt hơn so với phương pháp thứ hai của bạn. Tôi không biết nếu có thể làm tốt hơn nữa.O~(nmin(LC[0.33,1.92],LnlogC[0.5,1.41]))


Tôi đoán, rằng bất kỳ thuật toán nhanh chóng cho vấn đề này phải bao gồm một số loại nhân tử của bộ đầu vào . Tôi sẽ kiểm tra các thuật toán nhân tố hóa đó, nhưng vẫn còn một vấn đề về việc kiểm tra chúng đúng cách, điều này làm phát sinh vấn đề thứ hai mà tôi đã đề cập đến khi xây dựng tập với câu trả lời tối đa. SS
SkyterX

ECM tìm thấy một yếu tố trong thời gian bạn đưa ra. Nếu tất cả các yếu tố của một số là log n log C thì bạn cần lặp lại thuật toán, để đăng nhập C / log (n log C) lần.
gnasher729

3

Số không chia số ít phổ biến nhất có thể lớn bằng N log C, nhưng nếu số N được phân phối ngẫu nhiên thì số không chia số ít phổ biến nhất có thể nhỏ hơn rất nhiều, có thể ít hơn nhiều so với N. Tôi xây dựng các bảng trong đó Số nguyên tố là ước của số nào.

Đối với mỗi số nguyên tố p, chúng ta có một chỉ số , có nghĩa là tất cả các số cho chỉ số đó đã được kiểm tra tính chia hết cho p và chúng tôi có một danh sách tất cả các số đó chia hết cho.kp

Sau đó, với d = 2, 3, 4, ... chúng tôi cố gắng tìm một số chia hết cho d, hoặc hiển thị là không có. Ta lấy hệ số nguyên tố p lớn nhất của d. Sau đó, chúng tôi kiểm tra tất cả các số chia hết cho p xem chúng có chia hết cho d không. Nếu không tìm thấy, sau đó chúng tôi kiểm tra các số tiếp theo với các chỉ số> để phân chia theo p, cập nhật và danh sách các số chia hết cho p và kiểm tra xem mỗi số có chia hết cho d không.kpkp

Để kiểm tra xem có một số chia hết cho p hay không, chúng tôi kiểm tra các số p trung bình. Sau này nếu chúng ta kiểm tra xem có một số chia hết cho 2p hay không, có 50% cơ hội chúng ta chỉ cần kiểm tra một số (số đó chia hết cho p) và 50% cơ hội để kiểm tra trung bình thêm 2p số. Việc tìm một số chia hết cho 3p có khả năng rất nhanh và cứ thế, và chúng tôi không bao giờ kiểm tra nhiều hơn số N để chia hết cho p, vì chỉ có N số.

Tôi hy vọng việc này sẽ diễn ra với khoảng kiểm tra tính phân chia.N2/logN

Tái bút Kết quả sẽ lớn đến mức nào đối với các số ngẫu nhiên?

Giả sử tôi có N số ngẫu nhiên. Xác suất để một trong số N chia hết cho d là 1 - (1 - 1 / d) ^ N. Tôi giả sử xác suất rằng mỗi số 1 ≤ d ≤ k là một yếu tố của một trong các số ngẫu nhiên được tính bằng cách nhân các xác suất này (Ok, đó là một chút tinh ranh, bởi vì các xác suất này có thể không hoàn toàn độc lập).

Với giả định đó, với N = 1000, có 50% khả năng một trong các số 1..244 không chia bất kỳ số nào và một trong một tỷ mà mỗi số có tới 507 chia cho một trong các số. Với N = 10.000, có 50% khả năng một trong các số 1..1726 không chia bất kỳ số nào và một trong một tỷ mà mỗi số có tới 2979 chia cho một trong các số.

Tôi sẽ đề xuất rằng đối với N đầu vào ngẫu nhiên, kích thước của kết quả lớn hơn một chút so với N / ln N; có thể một cái gì đó như N / ln N * (ln ln N) ^ 2. Đây là lý do tại sao:

Xác suất mà ít nhất một trong số ngẫu nhiên N là chia hết cho một d ngẫu nhiên là . Nếu d ở khoảng N, thì khoảng 1 - exp (-1) 0,6321. Đó là cho một ước số duy nhất; có khả năng mỗi một số số d ≈ N là một ước của ít nhất một trong số N số khá mỏng, do đó, d tối đa sẽ nhỏ hơn đáng kể so với N.1(11/d)N1(11/d)N

Nếu d << N, thì .1(11/d)N1exp(N/d)

Nếu d ≈ N / ln N rồi .1exp(N/d)1exp(lnN)=11/N

Chúng tôi sẽ thêm các xác suất này cho khoảng N / ln N giá trị d, nhưng đối với hầu hết d, kết quả sẽ lớn hơn đáng kể, do đó, d lớn nhất sẽ lớn hơn N / ln N nhưng nhỏ hơn đáng kể so với N.

Tái bút Tìm một số chia hết cho d:

Chúng tôi chọn hệ số nguyên tố p lớn nhất của d, và sau đó trước tiên chúng tôi kiểm tra các số đã được chia hết cho p. Nói d = kp. Sau đó, trung bình chúng tôi chỉ kiểm tra k số chia hết cho p trong khi kiểm tra d cụ thể này và chúng tôi kiểm tra tối đa tất cả các giá trị N để chia hết cho p, cho tất cả d chia hết cho p. Trên thực tế, chúng tôi rất có thể kiểm tra ít hơn N giá trị cho hầu hết các số nguyên tố p, bởi vì sau khi kiểm tra tất cả các giá trị N, thuật toán rất có thể kết thúc. Vì vậy, nếu kết quả là R, thì tôi mong đợi ít hơn N giá trị được chia cho mỗi số nguyên tố nhỏ hơn R. Giả sử R ≤ N, đó là về N ^ 2 / log N kiểm tra.

Tái bút Chạy một số bài kiểm tra

Tôi đã chạy thuật toán này một vài lần với N = 1.000.000 số ngẫu nhiên> 0. Số không chia ít phổ biến nhất là từ 68.000 đến 128.000 với phần lớn các lần chạy trong khoảng từ 100.000 đến 120.000. Số lượng các bộ phận là từ 520 triệu đến 1800 triệu, ít hơn rất nhiều so với (N / ln N) ^ 2; phần lớn các trường hợp được sử dụng từ 1000 đến 1500 triệu đơn vị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.