Tìm kích thước của tập hợp con nhỏ nhất với GCD = 1


10

Đây là một vấn đề từ phiên thực hành của Cuộc thi lập trình trường đại học Ba Lan 2012 . Mặc dù tôi có thể tìm thấy giải pháp cho cuộc thi chính, tôi dường như không thể tìm thấy giải pháp cho vấn đề này ở bất cứ đâu.

Vấn đề là: Cho một tập hợp N số nguyên dương khác nhau không lớn hơn 109 , tìm kích thước m của tập hợp nhỏ nhất không có ước số chung nào ngoài 1. N nhiều nhất là 500 và có thể giả sử tồn tại một giải pháp.

m9S|S|=10S1<g1<g2<...<g10i j S g 2 g 3 . . . g 10 g 2 g 3 . . . g 103 × 5 × 7 × 11 × . . . × 29 = 3234846615 > 10 9gcd(gi,gj)=1ijSg2g3...g10g2g3...g103×5×7×11×...×29=3234846615>109 , một mâu thuẫn.

Tuy nhiên, ngay cả với điều này, một lực lượng vũ phu đơn giản vẫn còn quá chậm. Có ai có ý tưởng nào khác?


Khi nào g2=2 ?
vonbrand

g 1g2>g12 . không thể là 1, vì 9 tập con không thể có gcd là 1.g1
Wakaka

Câu trả lời:


1

Vấn đề này tương đương với những điều sau đây và nó không quan trọng để xây dựng giảm cả hai cách.

Đưa ra một danh sách các vectơ bit, tìm số lượng tối thiểu của chúng sao cho andtất cả chúng có kết quả là vectơ bit. ( )0()

Sau đó, chúng tôi hiển thị bộ bìa giảm xuống . Bằng cách đặt bìa, tôi có nghĩa là được cung cấp một danh sách các bộ , tìm số lượng tối thiểu của các bộ bao gồm liên minh của chúng.S 1 , Mạnh , S k()S1,,Sk

Chúng tôi sắp xếp các phần tử trong các bộ là . Đặt , trong đó nếu , 0 nếu không. Lưu ý chức năng này là một bijection để nó có một nghịch đảo. f ( S ) = ( 1 - χ một 1 ( S ) , ... , 1a1,,anχ x ( S ) = 1 x Sf(S)=(1χa1(S),,1χan(S))χx(S)=1xS

Bây giờ, nếu chúng ta giải quyết trên và các giải pháp là , thì là giải pháp để đặt bìa.f ( S 1 ) , Mạnh , f ( S k ) { f ( S()f(S1),,f(Sk){f - 1 (S b 1 ),Lỗi,f - 1 (S b m )}{f(Sb1),,f(Sbm)}{f1(Sb1),,f1(Sbm)}

Vì vậy, tôi nghĩ rằng vấn đề này đang kiểm tra khả năng của một người để cắt tỉa không gian tìm kiếm.


Làm thế nào để bạn tìm thấy bìa đỉnh tối thiểu?
Yuval Filmus

oh nvm giải pháp này, nó được thiết lập thay thế.
Chao Xu

1
Điều đó là đúng, nhưng tôi nghĩ có lẽ chúng ta có thể khai thác một số tính chất của trường hợp đặc biệt này. Chẳng hạn, trong trường hợp này, các bộ đều rất lớn, với kích thước không nhỏ hơn . Trong thực tế, nếu các số trong các tập hợp đều nhỏ, kích thước của chúng sẽ còn lớn hơn. Hơn nữa, chúng tôi chắc chắn có thể tìm thấy 9 bộ bao gồm tất cả mọi thứ. Dù sao, làm thế nào để bạn đề nghị tôi cắt tỉa không gian tìm kiếm? n9
Wakaka

Tôi không thấy vấn đề (*) tương đương với vấn đề được đưa ra trong câu hỏi. Đối với một điều, vấn đề được đưa ra trong câu hỏi hứa hẹn rằng tất cả các số nguyên sẽ là , tương ứng với sự đảm bảo về trọng số của các vectơ bit không xuất hiện trong bài toán (*). 109
DW

1

Có thể giải quyết vấn đề này tương đối hiệu quả bằng cách tính toán tất cả các gcd cặp, loại bỏ trùng lặp và sau đó đệ quy. Đó là hành động loại bỏ các bản sao trước khi bạn tái diễn làm cho nó hiệu quả.

Tôi sẽ giải thích thuật toán chi tiết hơn dưới đây, nhưng trước tiên, nó giúp xác định toán tử nhị phân . Nếu là tập hợp các số nguyên dương, hãy xác địnhS , TS,T

ST={gcd(s,t):sS,tT}.

Lưu ý rằngvà (trong vấn đề của bạn); thông thường, thậm chí sẽ nhỏ hơn một trong hai giới hạn đó, giúp thuật toán hoạt động hiệu quả. Cũng lưu ý rằng chúng ta có thể tính vớihoạt động gcd bằng cách liệt kê đơn giản.| S T | 10 9 S T S T | S | × | T ||ST||S|×|T||ST|109STST|S|×|T|

Với ký hiệu đó, đây là thuật toán. Đặt là tập hợp số đầu vào. Tính , sau đó , sau đó , v.v. Tìm nhỏ nhất sao cho nhưng . Sau đó, bạn biết rằng kích thước của tập hợp con nhỏ nhất là . Nếu bạn cũng muốn đưa ra một ví dụ cụ thể về một tập hợp con như vậy, bằng cách giữ các con trỏ ngược, bạn có thể dễ dàng xây dựng lại một tập hợp như vậy.S 2 = S 1S 1 S 3 = S 1S 2 S 4 = S 1S 3S1S2=S1S1S3=S1S2S4=S1S31 S k 1 S k - 1 kk1Sk1Sk1k

Điều này sẽ tương đối hiệu quả, vì không có bộ trung gian nào tăng kích thước trên (thực tế, kích thước của chúng có thể sẽ nhỏ hơn nhiều) và thời gian chạy cần khoảng hoạt động gcd. 500 × ( | S 1 | + | S 2 | + )109500×(|S1|+|S2|+)

Đây là một tối ưu hóa có thể cải thiện hiệu quả hơn nữa. Về cơ bản, bạn có thể sử dụng phép nhân đôi để tìm nhỏ nhất sao cho 1 S k . Cụ thể, với mỗi phần tử x S i , chúng tôi theo dõi tập hợp con nhỏ nhất của S 1 có gcd là và có kích thước là . (Khi bạn loại bỏ trùng lặp, bạn giải quyết các mối quan hệ có lợi cho tập hợp con nhỏ hơn.) Bây giờ, thay vì tính toán chuỗi chín bộ , chúng tôi thay vào đó sẽ tính toán chuỗi năm bộ , bằng máy tínhk1SkxSiS1i S 1 , S 2 , S 3 , S 4 , ... , S 9 S 1 , S 2 , S 4 , S 8 , S 9 S 2 = S 1S 1 S 4 = S 2S 2 S 8 = S 4S 4 S 9 = SxiS1,S2,S3,S4,,S9S1,S2,S4,S8,S9S2=S1S1 , sau đó , sau đó , sau đó . Khi bạn đi, tìm đầu tiên sao cho . Khi bạn đã tìm thấy sao cho , bạn có thể dừng ngay lập tức: bạn có thể tìm tập hợp con nhỏ nhất có gcd bằng bằng cách xem tập hợp con được liên kết với . Vì vậy, bạn có thể dừng ngay khi bạn đạt được một được đặt sao cho , cho phép bạn dừng sớm nếu bạn tìm thấy một tập hợp con nhỏ hơn.S4=S2S2S8=S4S4 k [ 1 , 2 , 4 , 8 , 9 ] 1 S k k 1 S k 1 1 S k 1 S kS9=S1×S8k[1,2,4,8,9]1Skk1Sk11Sk1Sk

Điều này nên được tiết kiệm thời gian và không gian hiệu quả. Để tiết kiệm dung lượng, đối với mỗi phần tử , bạn không cần lưu trữ toàn bộ tập hợp: đủ để lưu trữ hai điểm lùi (vì vậy hai phần tử của mà bạn đã lấy gcd của, để lấy ) và tùy chọn kích thước của tập hợp con tương ứng.S i , S j xxSkSi,Sjx

Về nguyên tắc, bạn có thể thay thế chuỗi bằng bất kỳ chuỗi bổ sung nào khác . Tôi không biết liệu một số chuỗi bổ sung khác sẽ tốt hơn không. Sự lựa chọn tối ưu có thể phụ thuộc vào việc phân phối các câu trả lời đúng và kích thước dự kiến ​​của các bộ , điều này không rõ ràng đối với tôi, nhưng có lẽ có thể được rút ra theo kinh nghiệm thông qua thử nghiệm.S k[1,2,4,8,9]Sk

Tín dụng: Tôi cảm ơn KWillets về ý tưởng lưu trữ một tập hợp con số cùng với mỗi phần tử của , cho phép dừng sớm.Si


Tôi tin rằng tìm kiếm nhị phân là không cần thiết; bạn có thể lưu trữ số phần tử với mỗi gcd và đặt nó thành tổng số cặp tối thiểu trong mỗi lần nhân đôi.
Máy xay sinh tố

Điểm tuyệt vời, @KWillets! Cảm ơn bạn vì ý tưởng tuyệt vời đó! Tôi đã kết hợp nó vào câu trả lời của tôi.
DW

0

Có lẽ nó nhanh hơn khi nhìn vào điều này theo một cách khác ... số nguyên tố lớn nhất ít hơn là 31607, với tổng số 3401 số nguyên tố từ 2 đến 31607, không phải là một con số rất lớn. Viết từng số mà bạn được cung cấp đầy đủ qua các số nguyên tố lên tới : Ở đây là 1 hoặc một số nguyên tố lớn. Sau đó, một tập hợp các tương đối nguyên tố nếu các vectơ tương ứng độc lập tuyến tính (và của chúng khác nhau hoặc cả 1) và bạn đang tìm thứ hạng của ma trận. mộti=p n i 1 1 p n i 2 2 ...PiPimộtinijP109

ai=p1ni1p2ni2Pi
PiainijP

Sự liên quan đến độc lập tuyến tính là gì? Các vectơ và độc lập tuyến tính, nhưng GCD là trong khi chúng ta muốn . ( 1 , 0 ) ( 1 , 0(1,1)(1,0)( 0 , 0 )(1,0)(0,0)
Yuval Filmus

1
Độc lập tuyến tính dường như không hoạt động, nhưng chúng ta có thể sử dụng phân rã chính này theo một cách khác. Đối với mỗi số nguyên tố (trong số và nhiều nhất là ), hãy xác định tập là tập hợp của tất cả các số (trong số các tập đã cho) không có3401 p i 500 P i A pp3401 pi500 PiAppBAp|ApB|1NP- Hoàn thành, nhưng có thể có một số triển khai đủ nhanh cho kích thước này.
Polkjh

Bạn có thể hướng tôi đến một số triển khai có thể làm việc? Cho đến nay, tôi chỉ có thể tìm thấy các thuật toán gần đúng. Cảm ơn!
Wakaka

Bài khảo sát này xem xét cả hai giải pháp gần đúng và chính xác. Và khi trả lời một bình luận, vui lòng thêm @ name-of-person vào bình luận. Nó sẽ gửi thông báo cho người đó. Nếu không, họ thậm chí có thể không bao giờ biết về bình luận của bạn.
Polkjh

-1

Nếu bạn có thể tìm một tập hợp con có gcd (S) = 1, thì tôi luôn có thể xóa các phần tử dư thừa khỏi tập hợp con cho đến khi chỉ còn 2 phần tử, có gcd (S) = 1. Do đó, tôi có thể khẳng định rằng phần tử nhỏ nhất tập hợp con sẽ chứa 2 phần tử hoặc nó sẽ không tồn tại.

Bây giờ, chúng tôi sử dụng đệ quy để giải quyết vấn đề này. Chúng ta hãy chia mảng số thành 2 phần, một phần tử n-1 và phần tử có 1 phần tử (phần tử cuối cùng). Cả 2 số sẽ nằm trong các phần tử n-1 đầu tiên hoặc một phần tử sẽ ở đó từ phần 1 được ghép với phần tử cuối cùng. Do đó, chúng tôi có thể giải quyết vấn đề này trong

T (n) = T (n-1) + O (n) thời gian. có nghĩa là T (n) = O (n ^ 2).


4
gcd(6,10,15)=1
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.