.
#13 (251)
.
March 2019
59
Computer Science
oracle(stateNumParam, stateNumParam) = 1;
oracle = I - 2 * oracle;
%
Расчет
количества
итераций
iterationsCount = fix( (pi/4) * sqrt( statesCount)) + iterationsCountParam;
% 1-
ое
состояние
.
Применение гейта Адамара к начальному состоянию регистра
state1 = hadamardGate * state0;
% Начало оператора Гровера.
for
i = 1 : iterationsCount
% 2-
ое состояние. Применение оракула.
state2 = oracle * state1;
% 3-
е состояние. Применение гейта Адамара к результату оракула
state3 = hadamardGate * state2;
% 4-
ое состояние. Применение условного сдвига фазы
state4 = faseShift * state3;
% 5-
ое состояние. Применение гейта Адамара к результату выполнения
% условного фазового сдвига. Заключительный шаг оператора Гровера.
state5 = hadamardGate * state4;
% запоминаем
конечное состояние текущей итерации, перезаписывая им
% начальное состояние для следующей итерации.
state1 = state5;
end
plotGraph();
grover = abs(state5);
function
plotGraph()
xVals = 0:statesCount - 1;
xVals = categorical(
...
cellstr( dec2bin( xVals, qbitsCountParam)));
bar(xVals, abs(state5));
ylim([0 1]);
end
end
oracle(stateNumParam, stateNumParam) = 1;
oracle = I - 2 * oracle;
%
Расчет
количества
итераций
iterationsCount = fix( (pi/4) * sqrt( statesCount)) + iterationsCountParam;
% 1-
ое
состояние
.
Применение гейта Адамара к начальному состоянию регистра
state1 = hadamardGate * state0;
% Начало оператора Гровера.
for
i = 1 : iterationsCount
% 2-
ое состояние. Применение оракула.
state2 = oracle * state1;
% 3-
е состояние. Применение гейта Адамара к результату оракула
state3 = hadamardGate * state2;
% 4-
ое состояние. Применение условного сдвига фазы
state4 = faseShift * state3;
% 5-
ое состояние. Применение гейта Адамара к результату выполнения
% условного фазового сдвига. Заключительный шаг оператора Гровера.
state5 = hadamardGate * state4;
% запоминаем
конечное состояние текущей итерации, перезаписывая им
% начальное состояние для следующей итерации.
state1 = state5;
end
plotGraph();
grover = abs(state5);
function
plotGraph()
xVals = 0:statesCount - 1;
xVals = categorical(
...
cellstr( dec2bin( xVals, qbitsCountParam)));
bar(xVals, abs(state5));
ylim([0 1]);
end
end
Симуляция алгоритма Гровера для 2-х кубитов, искомого 3-его состояния и без дополнительных итераций:
Симуляция алгоритма Гровера для 3-х кубитов без дополнительных итераций:
Контрольный пример для 4-х кубитов, искомого 5-ого состояния и без дополнительных итераций:
Поскольку алгоритм Гровера является вероятностным, он выдаст правильный ответ только с какой-то очень высо-
кой вероятностью. Таким образом, например, в случае с двумя кубитами, выполнив одну итерацию мы нашли функ-
цию, которая принимает значение 1 только на одном из 4-х вариантов входных значений. Следовательно, процедура
поиска заметно ускорилась теоретически на
𝜋𝜋
4
√𝑁𝑁
по сравнению с расчетами на классическом компьютере. [2]
Если попробовать увеличить количество итераций, свыше расчетного количества, то результаты исказятся. Ам-
плитуда вероятности искомого базисного состояния в таком случае станет уменьшаться, а остальные амплитуды —
увеличиваться, приводя к ошибочным результатам. [4]
Так, к примеру, если выполнить функцию Grover для поиска 4-ого состояния в 3-х кубитном регистре дополни-
тельной 1 итерацией, то результаты будут следующие:
«Молодой учёный»
Do'stlaringiz bilan baham: |