Я думаю, що статті у Вікіпедії
, та vs. досить хороші. Все ж ось що я б сказав: частина I , частина IIPNPPNP
[Я використаю зауваження всередині дужок, щоб обговорити деякі технічні деталі, які ви можете пропустити, якщо хочете.]
Частина I
Проблеми рішення
Існують різні види обчислювальних задач. Однак у вступі до курсу теорії складності обчислювальної техніки легше зосередитись на проблемі рішення , тобто на проблемах, де відповідь - ТАК чи НІ. Існують й інші види обчислювальних задач, але більшість часу питання щодо них можна звести до подібних питань щодо вирішення проблем. Причому проблеми з рішенням дуже прості. Тому у вступі до курсу теорії складності обчислювальної техніки ми зосереджуємо свою увагу на вивченні проблем прийняття рішень.
Ми можемо визначити проблему рішення з підмножиною входів, які мають відповідь ТАК. Це спрощує позначення і дозволяє нам записувати
замість і
замість .x∈QQ(x)=YESx∉QQ(x)=NO
Інша перспектива полягає в тому, що ми говоримо про запити щодо членства в наборі. Ось приклад:
Проблема рішення:
Введення: Натуральне число ,
Запитання: Чи парне число?x
x
Проблема членства:
Введення: Натуральне число ,
Запитання: Чи у ?x
xEven={0,2,4,6,⋯}
Відповідь YES на вході ми називаємо прийнятною, а відповідь "НІ" на вході - як відхилення введення.
Ми розглянемо алгоритми вирішення проблем та обговоримо, наскільки ефективні ці алгоритми у використанні обчислюваних ресурсів . Я буду покладатися на вашу інтуїцію від програмування на такій мові, як C, замість формального визначення того, що ми розуміємо під алгоритмом та обчислювальними ресурсами.
[Зауваження: 1. Якщо б ми хотіли зробити все формально і точно, нам потрібно було б зафіксувати модель обчислення, як стандартна модель машини Тьюрінга, щоб точно визначити, що ми розуміємо під алгоритмом та його використанням обчислювальних ресурсів. 2. Якщо ми хочемо поговорити про обчислення об'єктів, з якими модель не може безпосередньо обробитись, нам потрібно буде кодувати їх як об'єкти, з якими може обробляти модель машини, наприклад, якщо ми використовуємо машини Тьюрінга, нам потрібно кодувати об'єкти, такі як натуральні числа та графіки як двійкові рядки.]
P = Проблеми з ефективними алгоритмамипошукурішень
Припустимо, що ефективні алгоритми означають алгоритми, які використовують щонайбільше поліномічну кількість обчислювальних ресурсів. Основний ресурс, який нас хвилює, - це найгірший час роботи алгоритмів щодо розміру вхідного сигналу, тобто кількість основних кроків, які алгоритм приймає на введення розміру n . Розмір вводу x дорівнює n якщо для зберігання x потрібні n -бітів пам'яті комп'ютера , і в цьому випадку ми пишемо | х | = n . Таким чином, під ефективними алгоритмами ми маємо на увазі алгоритми, які мають поліном найгіршого часу роботи .x|x|=n
Припущення , що алгоритми полиномиального часу захоплення інтуїтивного поняття ефективних алгоритмів відомо як теза Кобого . Я не буду обговорювати на даний момент, чи P є правильною моделлю для ефективного вирішення проблем та чи P робить чи не фіксує те, що можна ефективно обчислити на практиці та пов'язані з цим проблеми. Наразі є вагомі причини зробити це припущення, тому для нашої мети ми припускаємо, що це так. Якщо ви не приймаєте тезу Кобхема, це не робить те, що я пишу нижче, неправильним, єдине, що ми втратимо, - це інтуїція щодо ефективного обчислення на практиці. Я думаю, що це корисне припущення для того, хто починає вивчати теорію складності.
P - клас задач рішення, який можна ефективно вирішити,
тобто задачі рішення, які мають поліноміально-часові алгоритми.
Більш офіційно ми говоримо, що проблема вирішення питання Q в P iff
існує ефективний алгоритм A такий, що
для всіх входів x ,
- якщо Q(x)=YES то A(x)=YES ,
- якщо Q(x)=NO тоді A(x)=NO .
Можна просто писати A(x)=Q(x) , але я пишу це таким чином , щоб ми могли порівняти його з визначенням NP .
NP = Проблеми з ефективними алгоритмами дляперевіркидоказів / довідок / свідків
Іноді ми не знаємо жодного ефективного способу пошуку відповіді на проблему рішення, однак якщо хтось каже нам відповідь і дає нам підтвердження,
ми можемо ефективно перевірити правильність відповіді, перевіривши доказ, щоб переконатися, що це дійсний доказ . Це ідея складності класу Н П .
Якщо доказ занадто довгий, він не дуже корисний, він може зайняти занадто багато часу, щоб просто прочитати доказ, не кажучи вже про перевірку, чи він дійсний. Ми хочемо, щоб час, необхідний для перевірки, був розумним у розмірі вихідного вводу, а не в розмірі даного доказу! Це означає, що ми дійсно хочемо не довільних довгих доказів, а коротких доказів. Зауважте, що якщо час роботи верифікатора має поліном у розмірі вихідного входу, він може читати лише поліноміальну частину доказу. Отже, короткі ми маємо в виду полиномиального розміру .
Формуйте цей пункт щоразу, коли я вживаю слово "доказ", я маю на увазі "короткий доказ".
Ось приклад проблеми, яку ми не знаємо, як ефективно вирішити, але ми можемо ефективно перевірити докази:
Вхід розділу : кінцевий набір натуральних чисел S ,
Питання: чи можна розділити S на два множини А і Б
( A ∪ B = S і A∩B=∅ )
таким чином, що сума чисел у A дорівнює сума числа в Б ( ∑x ∈ Ax=∑x∈Bx )?
Якщо я дам вам S і запитаю вас, чи можемо ми розділити його на два набори, щоб їх суми були рівними, ви не знаєте жодного ефективного алгоритму для його вирішення. Ви, мабуть, спробуєте всі можливі способи розділення чисел на два набори, поки не знайдете розділ, де суми рівні, або поки ви не спробуєте всі можливі розділи, і жоден не спрацював. Якщо хтось із них працював, ви б сказали "ТАК", інакше ви б сказали "НІ".
Але є експоненціально багато можливих розділів так що це займе багато часу. Однак , якщо я дам вам дві множини A і B , ви можете легко перевірити , якщо суми рівні , і якщо A і B є розбиттям S . Зауважте, що ми можемо ефективно обчислити суми.
Тут пари A і B які я вам даю, є доказом відповіді ТАК. Ви можете ефективно перевірити мою претензію, переглянувши мій доказ і перевіривши, чи є він дійсним доказом . Якщо відповідь ТАК, то є вагомий доказ, і я можу надати його вам, і ви можете перевірити це ефективно. Якщо відповідь "НІ", то немає достовірних доказів. Тож все, що я вам даю, ви можете перевірити і побачити, що це не є вагомим доказом. Я не можу вас обдурити неправдивим доказом того, що відповідь ТАК. Нагадаємо, що якщо доказ занадто великий, для його перевірки знадобиться багато часу, ми не хочемо, щоб це сталося, тому ми дбаємо лише про ефективні докази, тобто докази, які мають поліноміальний розмір.
Іноді люди використовують " довідку " або " свідка " замість "доказів".
Примітка. Я даю вам достатньо інформації про відповідь на заданий вхід x
щоб ви змогли знайти та перевірити відповідь ефективно. Наприклад, у нашому прикладі розділів я не кажу вам відповіді, я просто даю вам розділ, і ви можете перевірити, чи він дійсний чи ні. Зауважте, що ви повинні перевірити відповідь самостійно, ви не можете мені довіряти, що я говорю. Більше того, ви можете лише перевірити правильність мого доказу. Якщо мій доказ справедливий, це означає, що відповідь ТАК. Але якщо мій доказ недійсний, це не означає, що відповідь "НІ". Ви бачили, що один доказ був недійсним, а не те, що немає дійсних доказів. Ми говоримо про докази ДА. Ми не говоримо про докази НІ.
Подивимось на приклад:
A={2,4} і B={1,5} є доказом того, що
S={1,2,4,5} можна розділити на два множини з рівними сумами. Нам просто потрібно додати числа у A і число в B і подивитися , якщо результати рівні, і перевірити , якщо , B є розбиття S .ABS
Якщо я дав вам A={2,5} і B={1,4} , ви перевірите і переконаєтесь, що мій доказ недійсний. Це не означає, що відповідь "НІ", це просто означає, що цей конкретний доказ був недійсним. Ваше завдання тут - не знайти відповідь, а лише перевірити, чи підтверджений вами доказ дійсний.
Це як студент, який вирішує питання на іспиті, а професор перевіряє, чи відповідь правильна. :) (на жаль, часто студенти не дають достатньо інформації, щоб перевірити правильність своєї відповіді. Викладачі повинні відгадати решту своєї часткової відповіді та вирішити, скільки оцінок вони повинні дати студентам за їх часткові відповіді, справді досить складно завдання).
Дивовижна річ у тому, що така ж ситуація стосується багатьох інших природних проблем, які ми хочемо вирішити:
ми можемо ефективно перевірити, чи є даний короткий доказ дійсним, але ми не знаємо жодного ефективного способу пошуку відповіді . Це мотивація , чому складність класу NP є надзвичайно цікавим
(хоча це не було початковим мотивом для його визначення). Що б ви не робили (не лише в КС, а й з математики, біології, фізики, хімії, економіки, менеджменту, соціології, бізнесу, ...), ви зіткнетеся з обчислювальними проблемами, які потрапляють у цей клас. Щоб отримати уявлення про те, скільки проблем виявляється в NP ознайомтесь
збірник проблем оптимізації NP . На насправді у вас буде важко знайти природні проблеми , які не перебувають в NP . Це просто дивовижно.
NP - клас задач, які мають ефективні верифікатори, тобто
існує поліноміальний алгоритм часу, який може перевірити правильність даного рішення.
Більш формально ми говоримо, що проблема вирішення Q полягає в NP iff
існує ефективний алгоритм V називається верифікатором таким, що
для всіх входів x ,
- якщо Q(x)=YES то існує доказ y такий, що V(x,y)=YES ,
- якщо Q(x)=NO , то для всіх доказів y , V(x,y)=NO .
Ми кажемо, що верифікатор є здоровим,
якщо він не приймає ніяких доказів, коли відповідь "НІ". Іншими словами, перевіряти звук не можна, щоб прийняти доказ, якщо відповідь дійсно НЕ. Немає помилкових позитивних результатів.
Аналогічно, ми кажемо, що верифікатор завершений,
якщо він приймає принаймні один доказ, коли відповідь ТАК. Іншими словами, повний перевіряючий може бути переконаний у відповіді ТАК.
Термінологія походить від логіки та систем підтвердження . Ми не можемо використовувати систему звукоізоляції для доказу помилкових тверджень. Ми можемо використовувати повну систему доказів, щоб довести всі правдиві твердження.
Верифікатор V отримує два входи,
- x : вихідний вхід дляQ і
- y : запропоноване доказ дляQ(x)=YES .
Зауважимо, що ми хочемо, щоб V був ефективним розміром x . Якщо y великого доказ верифікатор матиме можливість читати тільки поліноміальних частина від y . Ось чому ми вимагаємо, щоб докази були короткими. Якщо y коротко сказати, що V ефективний у x
це те саме, що сказати, що V ефективний у x та y
(оскільки розмір y обмежений фіксованим многочленом розміром x ).
Підсумовуючи це, щоб показати, що проблема Q є в NP
ми повинні дати ефективний алгоритм верифікатора, який є надійним і повним .
Історична довідка: історично це не первинне визначення Н П . Первісне визначення використовує то , що називається недетермінованими машини Тьюринга. Ці машини не відповідають жодній фактичній моделі машини і до них важко звикнути (принаймні, коли ви починаєте дізнаватися про теорію складності). Я читав, що багато експертів думають, що вони б використали визначення верифікатора як основне визначення і навіть назвали б клас V П
(для перевірки в поліноміальний час) замість Н П
якщо вони повернуться до зорі теорії складності обчислювальної техніки. Визначення верифікатор природніше, легше зрозуміти концептуально, і простіше у використанні , щоб показати проблеми в Н П .
P ⊆ N P
Тому ми маємо
П = ефективний рішення, а Н П = ефективно перевіряється . Отже, P = N P якщо проблеми, які можна ефективно перевірити, такі ж, як проблеми, які можна ефективно вирішити.
Зауважте, що будь-яка проблема в П також є в Н П , тобто якщо ви можете вирішити проблему, ви також можете перевірити, чи даний доказ правильний: верифікатор просто ігнорує доказ!
Це тому, що нам це не потрібно, верифікатор може обчислити відповідь сам, він може вирішити, чи відповідь ТАК чи НІ без сторонньої допомоги. Якщо відповідь "НІ", ми знаємо, що доказів не повинно бути, і наш верифікатор просто відкине кожен запропонований доказ. Якщо відповідь ТАК, то повинно бути доказ, а насправді ми просто приймати що - або в якості доказу.
[Ми могли б змусити наш верифікатор прийняти лише деякі з них, це також добре, якщо наш перевіряючий приймає хоча б один доказ, коли перевіряльник працює правильно для проблеми.]
Ось приклад:
Сума
введення: список n + 1 натуральних чисел а1, ⋯ , aн і с ,
Запитання: чи Σнi = 1аi= s ?
Проблема полягає в П оскільки ми можемо підсумувати числа, а потім порівняти їх з с , повертаємо ТАК, якщо вони рівні, і НІ, якщо їх немає.
Проблема також в Н П . Розглянемо верифікатор V який отримує доказ плюс вхід для Суми. Він діє так само, як алгоритм в П який ми описали вище. Це ефективний верифікатор для суми.
Зауважте, що для Суми існують інші ефективні верифікатори, і деякі з них можуть використовувати надані їм докази. Однак того, кого ми розробили, немає, і це теж добре. Так як ми дали ефективний верифікатор для Sum проблема в Н П . Той же трюк працює для всіх інших проблем в П так
P ⊆ N P .
Алгоритми грубої сили / виснажливого пошуку для Н П і N P ⊆ E x p T i m e
Найкращими алгоритмами, які ми знаємо для вирішення довільної задачі в Н П є
алгоритми грубої сили / вичерпності пошуку . Виберіть ефективний верифікатор проблеми (у нас є ефективний верифікатор, за нашим припущенням, що він знаходиться в Н П ) і перевірити всі можливі докази по черзі. Якщо перевіряючий приймає один з них, то відповідь ТАК. Інакше відповідь НІ.
У нашому прикладі розділів ми намагаємося всі можливі розділи та перевіряємо, чи рівні в жодному з них суми.
Зауважимо, що алгоритм грубої сили працює в гіршому випадку експоненціального часу. Розмір доказів є многочленом у розмірі вхідних даних. Якщо розмір доказів м то можливі докази 2м . Перевірка кожного з них забирає поліномальний час верифікатором. Тож загалом алгоритм грубої сили займає експоненціальний час.
Це показує, що будь-яку задачу Н П можна вирішити за експоненціальний час, тобто
N P ⊆ E x p T i m e . (Більше того, алгоритм грубої сили буде використовувати лише поліномійну кількість простору, тобто
N P ⊆ P S p a c e
але це історія для іншого дня).
Проблема в Н П може мати набагато більш швидкі алгоритми, наприклад, будь-яка проблема в П має поліноміально-часовий алгоритм. Однак для довільної задачі в Н П
ми не знаємо алгоритмів, які можуть зробити набагато краще. Іншими словами, якщо ви просто скажете мені, що ваша проблема полягає в Н П
(і нічого іншого про проблему), то найшвидший алгоритм, який ми знаємо для його вирішення, займає експоненціальний час.
Однак це не означає, що немає кращих алгоритмів,
ми цього не знаємо . Наскільки ми знаємо, все ще можливо (хоча вважається, що майже всі теоретики складності) дуже малоймовірні, що
NP=P і всі задачі NP можуть бути вирішені в поліноміальний час.
Крім того, деякі фахівці здогадуються, що ми не можемо зробити набагато кращого, тобто є проблеми в NP які неможливо вирішити набагато ефективніше, ніж алгоритми пошуку грубої сили, які займають експоненціальну кількість часу. Додаткову
інформацію див. У гіпотезі експоненційного часу . Але це не доведено, це лише здогадка . Це просто показує, як далеко ми знаходимо алгоритми поліноміального часу для довільних задач NP
Ця асоціація з експоненціальним часом бентежить деяких людей: вони неправильно вважають, що
проблеми NP потребують вирішення експоненціального часу (або ще гірше, що алгоритму для них взагалі немає). Заявлення про те, що проблема є в NP
, не означає, що проблему важко вирішити, це просто означає, що це легко перевірити, це верхня межа складності вирішення проблеми, і багато проблем з NP легко вирішити. так як P⊆NP .
Тим не менш, є проблеми NP які, здається, важко вирішити. Я повернусь до цього, коли ми обговоримо NP твердість.
Нижні межі здаються складно довести
Гаразд, тому ми тепер знаємо, що існує
багато природних проблем, що є в NP і ми не знаємо жодного ефективного способу їх вирішення, і ми підозрюємо, що вони дійсно потребують експоненціального часу для вирішення. Чи можемо ми це довести?
На жаль, завдання довести нижню межу дуже складна. Ми навіть не можемо довести, що ці проблеми потребують більше, ніж лінійного часу ! Не кажучи вже про необхідність експоненціального часу.
Довести нижню межу лінійного часу досить просто: алгоритм повинен зрештою прочитати вхід. Доведення суперлінійних нижніх меж - зовсім інша історія. Ми можемо довести суперлінійні нижні межі з більшими обмеженнями щодо того, який алгоритм ми розглядаємо, наприклад, сортування алгоритмів за допомогою порівняння, але ми не знаємо нижніх меж без цих обмежень.
Для доведення верхньої межі проблеми нам просто потрібно розробити достатньо хороший алгоритм. Для створення такого алгоритму часто потрібні знання, творче мислення і навіть винахідливість.
Однак завдання значно простіше порівняно з доведенням нижньої межі. Треба показати, що немає хороших алгоритмів . Не те, що ми зараз не знаємо про якісь досить хороші алгоритми, але про те, що не існує жодних хороших алгоритмів , щоб ніхто ніколи не придумав хорошого алгоритму . Подумайте про це хвилину, якщо ви цього не робили раніше, як ми можемо показати такий результат неможливості ?
Це ще одне місце, де люди плутаються. Тут "неможливість" - це математична неможливість , тобто недовгий з нашого боку деякий геній може виправити в майбутньому. Коли ми кажемо неможливе, ми маємо на увазі, що це абсолютно неможливо, як неможливо, як 1=0 . Жоден науковий прогрес не може зробити це можливим. Це те, що ми робимо, коли доводимо нижчі межі.
Довести нижню межу, тобто показати, що проблема потребує певного часу, щоб вирішити, означає, що ми повинні довести, що така єАлгоритм, навіть дуже винахідливий, який ще не знає, не може вирішити проблему швидше. Є багато розумних ідей, про які ми знаємо (жадібні, відповідність, динамічне програмування, лінійне програмування, напіввизначене програмування, програмування суми квадратів та багато інших розумних ідей) і є багато ще багатьох, про які ми ще не знаємо. Виключення одного алгоритму чи однієї конкретної ідеї розробки алгоритмів недостатньо, нам потрібно виключити всі вони, навіть ті, про яких ми ще не знаємо, навіть ті, про кого вони ніколи не знають! І все це можна комбінувати в алгоритмі, тому нам потрібно виключити і їх комбінації. Був досягнутий певний прогрес у тому, щоб показати, що деякі ідеї не можуть вирішити складний NPпроблеми, наприклад, жадібні та їх розширення не можуть працювати, і є деякі роботи, пов'язані з алгоритмами динамічного програмування, і є деякі роботи над певними способами використання лінійного програмування. Але вони навіть не близькі до того, щоб виключити відомі нам інтелектуальні ідеї (шукайте нижчі межі в обмежених моделях обчислень, якщо вас цікавить).
Бар'єри: нижні межі є Важко довести
З іншого боку, у нас є математичні результати, які називаються
бар'єрами,
які говорять про те, що нижня межа не може бути такою і такою, і таке і таке майже охоплює всі методи, які ми використовували для доведення нижчих меж! Насправді багато дослідників відмовилися працювати на доказ нижніх оцінок після Олександра Razbarov і Стівена Рудич в
природних доказах бар'єрного результату. Виявляється, існування конкретного роду доказів мало би означало невпевненість криптографічних генераторів псевдовипадкових чисел та багатьох інших криптографічних інструментів.
Я кажу майже тому, що останніми роками спостерігається певний прогрес, головним чином Райан Вільямс
, який зміг інтелектуально обійти бар'єрні результати, але результати поки що є для дуже слабких моделей обчислення та досить далеких від виключення загальних поліноміально-часових алгоритмів .
Але я розходяся. Основний момент , який я хотів зробити, що доводить нижні межі важко , і ми не маємо сильні нижні оцінки для загальних алгоритмів , які вирішують NP проблем.
[З іншого боку, робота Райана Вільямса показує, що між доведенням нижньої межі і доведенням верхньої межі існує тісний зв’язок. Дивіться його розмову на ICM 2014, якщо вас цікавить.]
Скорочення: вирішення проблеми з використанням іншої проблеми як підпрограми / Oracle / Black Box
Ідея скорочення дуже проста: для вирішення проблеми використовуйте алгоритм для іншої проблеми.
Ось простий приклад: припустимо, що ми хочемо обчислити суму списку n натуральних чисел, і у нас є алгоритм Sum який повертає суму двох заданих чисел. Чи можемо ми використовувати Sum для складання чисел у списку? Звичайно!
Проблема:
Вхід: список з n натуральних чисел x1,…,xn ,
вихід: повернення ∑ni=1xi .
Алгоритм скорочення:
- s=0
- для i від 1 до n
2.1. s=Sum(s,xi)
- повернути s
Тут ми використовуємо Sum в нашому алгоритмі як підпрограму . Зауважте, що нам не байдуже, як працює Sum , він діє як чорний ящик для нас, нам не байдуже, що відбувається всередині Sum . Ми часто називаємо підпрограму Sum як oracle . Це як оракул Дельфі в грецькій міфології, ми задаємо питання, а оракул відповідає на них і використовуємо відповіді.
По суті, це скорочення: припустимо, що у нас є алгоритм для проблеми і використовувати його як оракул для вирішення іншої проблеми. Тут ефективно означає ефективне припущення, що оракул відповідає за одиницю часу, тобто ми рахуємо кожне виконання оракула за один крок.
Якщо оракул поверне велику відповідь, нам потрібно її прочитати, і це може зайняти деякий час, тому ми повинні порахувати час, який нам знадобиться , щоб прочитати відповідь, яку нам дав оракул. Аналогічно для написання / задавання питання від оракула. Але oracle працює миттєво, тобто, як тільки ми задаємо питання оракулу, оракул пише відповідь для нас за одну одиницю часу. Вся робота, яку робить Oracle, рахується одним кроком, але це виключає час, який нам потрібен, щоб написати запитання і прочитати відповідь.
Оскільки нам не байдуже, як працює oracle, але лише щодо відповідей, які він повертає, ми можемо зробити спрощення і вважати оракул самою проблемою замість алгоритму для нього. Іншими словами, нам байдуже, чи оракул не є алгоритмом, нам не байдуже, як оракул придумує свої відповіді.
Наприклад,
Sum у вищезазначеному питанні - сама функція додавання (не алгоритм обчислення складання).
Ми можемо задати кілька запитань у оракула, і запитання не потрібно заздалегідь визначати: ми можемо задати питання і виходячи з відповіді, що оракул повертається, ми виконуємо деякі обчислення самостійно, а потім задаємо інше запитання, виходячи з відповіді, яку ми отримали за попереднє питання.
Іншим способом дивитися на це є мислення про це як про інтерактивне обчислення . Інтерактивне обчислення саме по собі є великою темою, тому я тут не вникатиму, але я думаю, що згадка про цю перспективу скорочень може бути корисною.
Алгоритм , який використовує оракул / чорний ящик O зазвичай позначається як A O .AOAO
Скороченням ми обговорювали вище , є найбільш загальною формою скорочення і відомо як скорочення чорного ящика
(він же скорочення оракула , скорочення Тьюринга ).
Більш офіційно:
Ми говоримо, що проблема Q зводиться до чорної скриньки до задачі O і записує Q≤TO якщо
існує алгоритм A такий, що для всіх входів x ,
Q(x)=AO(x) .
Іншими словами , якщо існує алгоритм який використовує оракула O в якості підпрограми і вирішує проблему Q .AOQ
Якщо наш алгоритм редукції працює в поліноміальний час ми називаємо це скорочення чорного ящика поліноміальний час або просто скорочення Кук
(в честь
Стівен А. Кук ) і писати Q ≤ P T O . (Підписка T означає «Тьюрінг» на честь
Алана Тьюрінга ).AQ≤PTOT
Однак ми можемо захотіти поставити деякі обмеження щодо взаємодії алгоритму скорочення з оракулом. Існує кілька обмежень, які вивчаються, але найбільш корисним обмеженням є те, яке називається скороченням багато-одне
(воно також називається скороченням відображення ).
Ідея тут полягає в тому, що на заданому вході x ми виконуємо кілька поліноміально-часових обчислень і генеруємо y
що є прикладом проблеми, яку вирішує оракул. Потім ми запитуємо оракул і повертаємо відповідь, яку він нам повертає. Нам дозволяється задати одне питання від оракула, і відповіді оракула - це те, що буде повернено.
Більш офіційно,
Ми говоримо, що проблема Q багато-одна зводиться до задачі O і записує Q≤mO якщо
існує алгоритм A такий, що для всіх входів x ,
Q(x)=O(A(x)) .
Коли алгоритм редукції є поліноміальний час ми називаємо це
поліноміальний час багатьох один скорочення або просто скорочення Короп (в честь
Річарда М. Короп ) і позначимо його через Q≤PmO .
Основна причина зацікавленості в цьому конкретному неінтерактивному скороченні полягає в тому, що воно зберігає NP проблеми: якщо існує багаточленне скорочення багато-одного від проблеми A до задачі NPB , то A також є в NP .
Просте поняття редукції - одне з найбільш фундаментальних понять в теорії складності поряд з P , NP і NP -комплект (про які ми поговоримо нижче).
Повідомлення стало занадто довгим і перевищує межу відповіді (30000 символів). Я продовжую відповідь у частині II .