Grover
осуществляется строкой кода, пред-
ставленной ниже.
Встроенная функция
abs()
нужна для получения абсолютных значений.
Демонстрация работы программы:
полный код функции и примеры его выполнения с графиками приведены ниже.
function
grover = Grover(qbitsCountParam, stateNumParam, iterationsCountParam)
if
~(qbitsCountParam > 0 && stateNumParam > 0 && stateNumParam <= 2^qbitsCountParam)
error(
'
Ошибка
параметра
. '
+
...
'
Количество
кубитов
должно
быть
больше
0, '
+
...
'
а
номер
указанного
во
втором
параметре
номер
состояния
должен
быть
от
1
до
2^n,
где
n -
количество
кубитов
.'
);
end
%
Инициализация
%
Определение
кубита
в
состоянии
0.
qbit = [1; 0];
%
Расчет
количества
базисных
состояний
statesCount = 2^qbitsCountParam;
%
Расчет
состояния
двухкубитового
регистра
.
state0 = kron(qbit, qbit);
%
Расчет
состояния
регистра
при
3
и
более
кубитов
for
i = 3 : qbitsCountParam
state0 = kron(state0, qbit);
end
%
Расчет
гейта
Адамара
hadamardGate = 1/sqrt(statesCount) * hadamard(statesCount);
%
Расчет
матрицы
условного
фазового
сдвига
faseShiftDensityMatrix = state0 * transpose(state0);
I = eye(statesCount);
faseShift = 2 * faseShiftDensityMatrix - I;
%
Расчет
матрицы
оракула
oracle = zeros(statesCount);
Встроенная функция
abs()
нужна для получения абсолютных значений.
Демонстрация работы программы:
полный код функции и примеры его выполнения с графиками приведены ниже.
function
grover = Grover(qbitsCountParam, stateNumParam, iterationsCountParam)
if
~(qbitsCountParam > 0 && stateNumParam > 0 && stateNumParam <= 2^qbitsCountParam)
error(
'
Ошибка
параметра
. '
+
...
'
Количество
кубитов
должно
быть
больше
0, '
+
...
'
а
номер
указанного
во
втором
параметре
номер
состояния
должен
быть
от
1
до
2^n,
где
n -
количество
кубитов
.'
);
end
%
Инициализация
%
Определение
кубита
в
состоянии
0.
qbit = [1; 0];
%
Расчет
количества
базисных
состояний
statesCount = 2^qbitsCountParam;
%
Расчет
состояния
двухкубитового
регистра
.
state0 = kron(qbit, qbit);
%
Расчет
состояния
регистра
при
3
и
более
кубитов
for
i = 3 : qbitsCountParam
state0 = kron(state0, qbit);
end
%
Расчет
гейта
Адамара
hadamardGate = 1/sqrt(statesCount) * hadamard(statesCount);
%
Расчет
матрицы
условного
фазового
сдвига
faseShiftDensityMatrix = state0 * transpose(state0);
I = eye(statesCount);
faseShift = 2 * faseShiftDensityMatrix - I;
%
Расчет
матрицы
оракула
oracle = zeros(statesCount);
«Молодой учёный»
.
№ 13 (251)
.
Март 2019 г.
58
Информатика
Встроенная функция
abs()
нужна для получения абсолютных значений.
Демонстрация работы программы:
полный код функции и примеры его выполнения с графиками приведены ниже.
function
grover = Grover(qbitsCountParam, stateNumParam, iterationsCountParam)
if
~(qbitsCountParam > 0 && stateNumParam > 0 && stateNumParam <= 2^qbitsCountParam)
error(
'
Ошибка
параметра
. '
+
...
'
Количество
кубитов
должно
быть
больше
0, '
+
...
'
а
номер
указанного
во
втором
параметре
номер
состояния
должен
быть
от
1
до
2^n,
где
n -
количество
кубитов
.'
);
end
%
Инициализация
%
Определение
кубита
в
состоянии
0.
qbit = [1; 0];
%
Расчет
количества
базисных
состояний
statesCount = 2^qbitsCountParam;
%
Расчет
состояния
двухкубитового
регистра
.
state0 = kron(qbit, qbit);
%
Расчет
состояния
регистра
при
3
и
более
кубитов
for
i = 3 : qbitsCountParam
state0 = kron(state0, qbit);
end
%
Расчет
гейта
Адамара
hadamardGate = 1/sqrt(statesCount) * hadamard(statesCount);
%
Расчет
матрицы
условного
фазового
сдвига
faseShiftDensityMatrix = state0 * transpose(state0);
I = eye(statesCount);
faseShift = 2 * faseShiftDensityMatrix - I;
%
Расчет
матрицы
оракула
oracle = zeros(statesCount);
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
“Young Scientist”
Do'stlaringiz bilan baham: |