Применение функтора
Функторы — это фабрики, которые обеспечивают доступ к определенным реализациям специализаций вызываемого объекта. В Q# в настоящее время поддерживаются два функтора: Adjoint
и Controlled
. Оба они могут применяться к операциям, которые обеспечивают необходимые специализации.
Функторы Controlled
и Adjoint
являются коммутируемыми: если операция ApplyUnitary
поддерживает оба функтора, разницы между Controlled Adjoint ApplyUnitary
и Adjoint Controlled ApplyUnitary
нет.
Оба имеют один и тот же тип, и при вызове выполните реализацию, определенную controlled adjoint
для специализации.
Функтор Adjoint
Если операция ApplyUnitary
определяет унитарное преобразование U квантового состояния, Adjoint ApplyUnitary
обращается к реализации U†. Функтор Adjoint
является самоинверсным, так как по определению (U†)† = U. Например, Adjoint Adjoint ApplyUnitary
— это тоже самое, что и ApplyUnitary
.
Выражение Adjoint ApplyUnitary
является операцией того же типа, что и ApplyUnitary
. Она имеет тот же аргумент и тип возвращаемого значения и поддерживает те же функторы. Как и любую операцию, ее можно вызвать с аргументом подходящего типа. Следующее выражение применяет сопряженную специализацию ApplyUnitary
к аргументу arg
:
Adjoint ApplyUnitary(arg)
Функтор Controlled
Для операции ApplyUnitary
, определяющей унитарное преобразование U квантового состояния, Controlled ApplyUnitary
обращается к реализации, которая условно применяет U ко всем кубитам в массиве управляющих кубитов в состоянии |1⟩.
Выражение Controlled ApplyUnitary
— это операция с тем же типом возвращаемого значения и характеристиками операций, что и ApplyUnitary
, а значит поддерживает те же функторы.
Она принимает аргумент типа (Qubit[], <TIn>)
, где <TIn>
следует заменить типом аргумента ApplyUnitary
с учетом эквивалентности одноэлементного кортежа.
Операция | Тип аргумента | Контролируемый тип аргумента |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
В частности, если cs
содержит массив кубитов, q1
и q2
— два кубита и операция SWAP
соответствует данному определению, то следующее выражение производит обмен состояний для q1
и q2
при условии, что все кубиты в cs
находятся в состоянии |1⟩:
Controlled SWAP(cs, (q1, q2))
Примечание.
Условное применение операции на основе кубитов элемента управления в состоянии, отличном от состояния |1⟩, может быть достигнуто путем применения соответствующего привязываемого преобразования к кубитам управления перед вызовом и применением обратных операций после. Например, условное преобразование всех управляющих кубитов в состоянии |0⟩ может быть реализовано путем применения операции X
до и после. Это можно легко выразить с помощью сопряжения. Однако такая пространная конструкции может в будущем поддерживать более компактный синтаксис.