关于QDK中受控操作中令人惊讶的行为的查询
Query regarding surprising Behavior in Controlled operations in QDK
我一直在学习 QDK,我观察了以下程序提供的输出:
程序:
'''
operation BitIsOne( qs : Qubit[] ): Unit is Adj+Ctl
{
Message( "Is One" );
X(qs[0]); // added in update
}
operation BitIsZero( qs: Qubit[] ): Unit is Adj+Ctl
{
Message( "Is Zero" );
}
operation RandomBehavior( qs: Qubit[] ) : Unit is Adj+Ctl
{
X( qs[0] );
Controlled BitIsZero( [qs[0]], Rest( qs ) );
X( qs[0] );
Controlled BitIsOne( [qs[0]], Rest( qs ) );
DumpMachine(""); // added in update
}
operation TestFunc3() : Unit is Adj+Ctl
{
using( qs = Qubit[3] )
{
RandomBehavior( qs[0..1] );
}
}
@EntryPoint()
operation Start2() : Unit {
Message(" Started Execution");
TestFunc3();
}
输出:
Started Execution
Is Zero
Is One
我不明白为什么这里打印Is One?我以为输入的量子比特是00,那为什么第二个受控操作执行了BitIsOne函数?
更新以提供支持答案中解释的请求信息
(代码编辑以获取信息并确认包含解释)
已更改 BitIsOne 函数以包含 X(qs[0])。这表明else部分没有执行量子操作,但执行了经典函数“Message”。
尝试测量最后的量子位并分享结果。应该是 00,不管打印了什么。量子中的“控制”不像经典的 IF 语句那样表现,因为“THEN”部分和“ELSE”部分都得到“执行”。非量子“消息”语句在“ELSE”部分被“执行”,即使在量子术语中“ELSE”部分是“No-Op”(身份)。
我一直在学习 QDK,我观察了以下程序提供的输出:
程序: '''
operation BitIsOne( qs : Qubit[] ): Unit is Adj+Ctl
{
Message( "Is One" );
X(qs[0]); // added in update
}
operation BitIsZero( qs: Qubit[] ): Unit is Adj+Ctl
{
Message( "Is Zero" );
}
operation RandomBehavior( qs: Qubit[] ) : Unit is Adj+Ctl
{
X( qs[0] );
Controlled BitIsZero( [qs[0]], Rest( qs ) );
X( qs[0] );
Controlled BitIsOne( [qs[0]], Rest( qs ) );
DumpMachine(""); // added in update
}
operation TestFunc3() : Unit is Adj+Ctl
{
using( qs = Qubit[3] )
{
RandomBehavior( qs[0..1] );
}
}
@EntryPoint()
operation Start2() : Unit {
Message(" Started Execution");
TestFunc3();
}
输出:
Started Execution
Is Zero
Is One
我不明白为什么这里打印Is One?我以为输入的量子比特是00,那为什么第二个受控操作执行了BitIsOne函数?
更新以提供支持答案中解释的请求信息 (代码编辑以获取信息并确认包含解释)
已更改 BitIsOne 函数以包含 X(qs[0])。这表明else部分没有执行量子操作,但执行了经典函数“Message”。
尝试测量最后的量子位并分享结果。应该是 00,不管打印了什么。量子中的“控制”不像经典的 IF 语句那样表现,因为“THEN”部分和“ELSE”部分都得到“执行”。非量子“消息”语句在“ELSE”部分被“执行”,即使在量子术语中“ELSE”部分是“No-Op”(身份)。