Пошук розміру найменшого підмножини за допомогою GCD = 1


10

Це проблема, пов’язана з практичним заняттям конкурсу польського колегіального програмування 2012 року . Хоча я міг знайти рішення для основного конкурсу, я, здається, ніде не можу знайти рішення цієї проблеми.

Проблема полягає в тому, що: Враховуючи набір чітких додатних цілих чисел не більше , знайдіть розмір m найменшого підмножини, що не має спільного дільника, окрім 1. N - максимум 500, і рішення можна вважати, що існує .10 9N109мN

м9S|S|=10S1<г1<г2<...<г10i j S g 2 g 3 . . . г 10 г 2 г 3 . . . g 103 × 5 × 7 × 11 × . . . × 29 = 3234846615 > 10 9gcd(гi,гj)=1ijSг2г3...г10г2г3...г103×5×7×11×...×29=3234846615>109 , протиріччя.

Однак навіть при цьому пряма груба сила все ще занадто повільна. У когось є якісь інші ідеї?


Хто не може ? г2=2
фонбранд

g 1g2>g12 . не може бути 1, оскільки 9-підмножина не може мати gcd 1.г1
Wakaka

Відповіді:


1

Ця проблема еквівалентна наступній, і побудувати скорочення можна обома способами.

Давши список бітових векторів, знайдіть їх мінімальну кількість таким, щоб andусі вони привели до бітового вектора. ( )0()

Потім показуємо, що кришка набору зменшується до . Під кришкою набору я маю на увазі, задавши список множин S 1 , ... , S k , знайти мінімальну кількість наборів, що охоплює їх об'єднання.()S1,,Sk

Ми замовляємо елементи у величезних кількостях бути 1 , ... , н . Нехай f ( S ) = ( 1 - χ a 1 ( S ) , , 1 - χ a n ( S ) ) , де χ x ( S ) = 1, якщо x S , 0 в іншому випадку. Зауважте, що ця функція є біекцією, тому вона має обернену.a1,,aнf(S)=(1χa1(S),,1χan(S))χx(S)=1xS

Тепер, якщо ми розв’яжемо на f ( S 1 ) , , f ( S k ) , а розв’язки - { f ( S b 1 ) , , f ( S b m ) } , тоді { f - 1 ( S b 1 ) , , f - 1 ( S b m ) }()f(S1),,f(Sк){f(Sб1),,f(Sбм)}{f-1(Sб1),,f-1(Sбм)} - це рішення встановити кришку.

Тому я думаю, що ця проблема - це тестування здатності обрізати пошуковий простір.


Як ви знаходите мінімальну кришку вершини?
Yuval Filmus

о, nvm це рішення, замість нього встановлено кришку.
Чао Сю

1
Це правда, але я думаю, можливо, ми можемо використати певні властивості цього особливого випадку. Наприклад, у цьому випадку множини дуже величезні, розміри не менше . Насправді, якби всі набори були невеликими, їх розміри були б ще більшими. Крім того, ми можемо знайти 9 комплектів, які охоплюють все. У будь-якому випадку, як ви пропонуєте я обрізати простір пошуку? н-9
Вакака

Я не бачу, наскільки проблема (*) еквівалентна тій, що задана у питанні. З одного боку, проблема, задана у питанні, обіцяє, що всі цілі числа будуть , що відповідає гарантії щодо ваг бітових векторів, які не відображаються в задачі (*). 109
DW

1

Вирішити це можна досить ефективно, обчислюючи всі парні gcd, видаляючи дублікати, а потім повторюючи. Цей акт видалення дублікатів перед повторним повторенням робить його ефективним.

Я поясню алгоритм більш докладно нижче, але спочатку він допомагає визначити двійковий оператор . Якщо S , T - множини натуральних чисел, визначтеS,Т

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

Зауважте, що та | S T | 10 9 (у вашій проблемі); як правило, S T буде ще меншим, ніж будь-який із запропонованих меж, що допомагає зробити алгоритм ефективним. Також зазначимо, що ми можемо обчислити S T за допомогою | S | × | Т | операції gcd шляхом простого перерахування.|ST||S|×|T||SТ|109SТSТ|S|×|T|

З цим позначенням, ось алгоритм. Нехай - вхідний набір чисел. Обчисліть S 2 = S 1S 1 , потім S 3 = S 1S 2 , потім S 4 = S 1S 3 тощо. Знайдіть найменший k такий, що 1 S k, але 1 S k - 1 . Тоді ви знаєте, що розмір найменшого такого підмножини дорівнює kS1S2=S1S1S3=S1S2S4=S1S3к1Sк1Sк-1к. Якщо ви також хочете вивести конкретний приклад такого підмножини, зберігаючи вказівники, ви можете легко реконструювати такий набір.

Це буде відносно ефективно, оскільки жоден з проміжних наборів не збільшується в розмірі вище (насправді, їх розмір, ймовірно, буде набагато меншим за цей), а час роботи вимагає приблизно 500 × ( | S 1 | + | S 2 | + ) операції gcd.109500×(|S1|+|S2|+)

Ось оптимізація, яка може ще більше підвищити ефективність. В основному, ви можете використовувати ітераційне подвоєння, щоб знайти найменший такий, що 1 S k . Зокрема, для кожного елемента x S i ми відслідковуємо найменший підмножину S 1 , gcd якого x та розмір якого i . (Видаляючи дублікати, ви вирішуєте зв'язки на користь меншої підмножини.) Тепер, а не обчислюйте послідовність дев'яти наборів S 1 , S 2 , S 3 , S 4 ,к1SкхSiS1хi , замість цього обчислюємо послідовність п’яти множин 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 = S 1 × S 8S1,S2,S3,S4,,S9S1,S2,S4,S8,S9S2=S1S1S4=S2S2S8=S4S4S9=S1×S8. Під час руху знайдіть перший таким, що 1 S k . Як тільки ви знайдете k таким, що 1 S k , ви можете негайно зупинитися: ви можете знайти найменший підмножина, gcd якого 1 , переглянувши підмножину, пов'язану з 1 . Отже, ви можете зупинитися, як тільки досягнете множини S k таким, що 1 S k , що дозволяє зупинитися рано, якщо ви знайдете менший підмножина.k[1,2,4,8,9]1Skk1Sk11Sk1Sk

Це має бути економічно ефективним та просторовим. Щоб заощадити простір, для кожного елемента вам не потрібно зберігати весь набір: достатньо для зберігання двох опорних покажчиків (щоб два елементи S i , S j, які ви взяли gcd, отримали x ) і необов'язково розмір відповідного підмножини.xSkSi,Sjx

В принципі, ви можете замінити послідовність будь-яким іншим ланцюгом додавання . Я не знаю, чи буде якийсь інший ланцюжок додавання кращим. Оптимальний вибір може залежати від розподілу правильних відповідей та очікуваних розмірів множин S k , що мені не зрозуміло, але, ймовірно, може бути отримане емпіричним шляхом шляхом експерименту.[1,2,4,8,9]Sk

Подяки: Дякую KWillets за ідею зберігати підмножину чисел разом з кожним елементом , що дозволяє зупинятись на ранніх термінах .Si


Я вважаю, що бінарний пошук не потрібен; ви можете зберігати кількість елементів при кожному gcd і встановлювати його на мінімальну суму пари під час кожного подвоєння.
KWillets

Чудова точка, @KWillets! Дякую за прекрасну ідею! Я включив це у свою відповідь.
DW

0

Можливо, швидше дивитись на це по-іншому ... найбільший розкіш менше, ніж - 31607, загальна кількість 3401 прайс між 2 і 31607, не дуже велика кількість. Запишіть кожне з чисел, які ви отримали повністю з урахуванням простих чисел до 31607: ai=p n i 1 1 p n i 2 2Pi ТутPiдорівнює 1 або великому простому. Тоді набірais є відносно простим, якщо відповіднівекториnijлінійно незалежні (а їхPs різні або обидва 1), і ви шукаєтерангматриці.109

ai=p1ni1p2ni2Pi
PiainijP

Який зв’язок з лінійною незалежністю? Вектори і ( 1 , 0 ) лінійно незалежні, але GCD дорівнює ( 1 , 0 ), поки ми хочемо ( 0 , 0 ) . (1,1)(1,0)(1,0)(0,0)
Yuval Filmus

1
Лінійна незалежність, здається, не працює, але ми можемо використати це основне розкладання по-іншому. Для кожного простого (серед 3401 p i 's та щонайменше 500 P i ' s) визначте множину A p як сукупність усіх чисел (серед даного набору), у яких p не є коефіцієнтом. Тепер проблема полягає в пошуку найменшого підмножини B чисел, таких, що для кожного A p , | А рВ | 1 . Це проблема встановлення натискань, еквівалентна проблемі кришки. Це N Pp3401 pi500 ПiАppБАp|АpБ|1NП-комплект, але можливо, що деякі реалізації досить швидко для цього розміру.
polkjh

Не могли б ви спрямувати мене на деякі реалізації, які могли б працювати? Поки що я можу знайти лише алгоритми наближення. Дякую!
Вакака

У цьому оглядовому документі розглядаються як приблизні, так і точні рішення. А коли ви відповідаєте на коментар, додайте до коментаря @ ім’я особи. Він надішле повідомлення цій особі. Інакше вони ніколи навіть не дізнаються про ваш коментар.
polkjh

-1

Якщо ви зможете знайти підмножину з gcd (S) = 1, я завжди можу видалити зайві елементи з підмножини, поки залишиться лише два елементи, у яких gcd (S) = 1. Тому я можу стверджувати, що або найменший підмножина буде містити 2 елементи або вона не буде існувати.

Тепер ми використовуємо рекурсію для вирішення цієї проблеми. Ділимо масив чисел на 2 частини, одну з n-1 елементами та одну з 1 елементом (останній елемент). Або два числа будуть в перших n-1 елементах, або один елемент буде з першої частини, сполученої з останнім елементом. Тому ми можемо вирішити цю проблему в Росії

T (n) = T (n-1) + O (n) час. що означає T (n) = O (n ^ 2).


4
gcd(6,10,15)=1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.