Безумовно, достатньо завжди обчислювати повне 2n×2n унітарна матриця, а потім застосуйте її до 2n-вкладний вектор стану. Якщо це ви вирішили зробити, це все, що вам потрібно зробити, оскільки вся інформація про заплутування міститься в цьому векторі. Швидкий і простий спосіб зрозуміти, чи заплутався той чи інший кубіт - це простежити частковий слід вашого (чистого) вектора стану над усіма іншими кубітами. Якщо отримана матриця має ранг 1, цей кубіт знаходиться в роздільному стані, інакше він заплутаний.
Я припускаю, що питання вашого питання насправді "Як можна уникнути цієї величезної обчислювальної вартості?". Взагалі, це не може - якщо ви використовуєте повну потужність квантового комп'ютера, вам завжди знадобиться це2n-вкладний вектор стану. Однак існують різні хитрощі, які знижують обчислювальні витрати, такі як затримка потреби в такому великому векторі стану шляхом відстеження заплутаності.
Підвищення ефективності
Найбільша економія, яку ви можете зробити в порівнянні з наївним реалізацією вище, - це уникати 2n×2nунітарні матриці. Наприклад, якщо ви використовуєте лише 1-або 2-кубітні ворота, просто використання розрідженості матриць означає, що вам потрібно лишеO(2n) зберігання замість O(22n).
Тоді є інші тактики, які ви можете використовувати. Наприклад, уявіть, що ви хочете застосувати унітарні двері з двома кубітамиU на кубітах i і j. Ви можете взяти набори з 4 елементів із вашого вектора стану (|x⟩1,2,…n∖i,j|y⟩i,j для фіксованих x∈{0,1}n−2 приймаючи всіх різних y∈{0,1}2) та просто застосування 4×4 унітарний Uна цьому 4-елементному векторі. Повторюючи це для кожногоx повернеться U діє на вихідний вектор стану.
Я думаю, є й інші стратегії, які можна було б придумати. Той, який запропонував себе з оригінального питання, - це відстеження заплутаності. Це забезпечує покращення пам’яті та швидкості на початку обчислення, але в кінцевому підсумку стає рівноцінним, оскільки (імовірно) все в квантовому комп’ютері в кінцевому підсумку заплутається.
Відстеження заплутаності
Припустимо, що ваше обчислення складається лише з унітарної еволюції та вимірювання на множиніn кубіти, тобто немає декогерентності, імовірнісних карт тощо. Давайте припустимо, що ви починаєте з повністю відокремленого стану, такого як |0⟩⊗n. У цей момент кожен кубіт відокремлений, і його достатньо для утриманняnрізні регістри, кожен з яких передає стан відокремленого кубіта. Якщо ваш перший хвірт - це лише операція з одним кубітомU на кубіт i, тоді ви просто оновите стан, збережений на кубіті i як |ψi⟩↦U|ψi⟩, і більше нічого не потрібно чіпати.
Якщо ви хочете зробити двоквітні ворота V між кубітами i і j, скажімо, тоді вам доведеться поєднувати штати на обох сайтах. Отже, ви замінюєте два регістри розмірності 2 на один регістр розмірності 4, що містить станV|ψi⟩|ψj⟩. Проблема полягає в тому, що тепер ви не можете знову розділити цей стан, тому вам доведеться зберігати ці два кубіти в реєстрі назавжди після. Звичайно, якщо у вас коли-небудь є 1-кубітна брамаU подати заявку на кубіт iтепер вам доведеться подати заявку |ψi,j⟩↦U⊗I|ψi,j⟩. Потім, наступного разу, коли ви захочете 2-кубітний ворота між, скажімо,j і k, вам доведеться поєднати пробіли для (i,j) і k. Ці простори будуть постійно зростати, але якщо ворота локалізовані лише на одному просторі, потрібно лише застосувати його там (використовуючиI оператори розміщують його на решті кубітів), і вам не потрібно нічого робити в інших просторах.
Якщо ви робите такі речі, у вас не буде (принаймні, протягом перших кроків алгоритму) жодного 2nреєстр елементів. Вам доведеться мати купу різних регістрів і відслідковувати, які кубіти описуються, які реєструються в окремому масиві. Кожного разу, коли ви поєднуєте пробіли деяких кубітів, ви оновлюватимете цей додатковий масив.
Ось кілька дуже грубих псевдокодів, які можуть допомогти передати мій сенс:
#initialise variables
entangled_blocks={{1},{2},{3},...,{n}}
quantum_states={{1,0},{1,0},...,{1,0}}
#apply action of each gate
for each gate
for each gate_target
target_block=entangled_blocks entry containing gate_target
next gate_target
if all target_blocks equal then
apply gate on target_block (pad with identity on other qubits)
else
new_entangled_block=union(target_blocks)
new_state_vec=tensor_product(quantum_states for each target block)
apply gate on new_state_vec (pad with identity on other qubits)
replace all target_blocks in entangled_blocks with new_entangled_block
replace all quantum_states(all target blocks) with new_state_vec
end if
next gate
Інші параметри
(Ні в якому разі не вичерпний)
Можливо, вам буде цікаво почитати про стани Matrix Product, які є приємним способом інкапсуляції інформації про не надто заплутані стани, і які можуть запропонувати вам альтернативний шлях, залежно від того, що саме ви намагаєтеся досягти.