寫個修課的作業。

有錯再麻煩指正。

實作邏輯閘

第二章的內容就是先介紹了 CCNOT 邏輯閘 (請參考之前文章 “Quantum Toffoli Gate (CCNOT) Decomposition)"。此邏輯閘的出現可以讓古典運算做對照,也就是可以用量子邏輯閘來模擬古典邏輯閘的特性。不過並非純粹模擬,而是利用同樣輸入輸出的特性來得以描述同一問題,並嘗試利用量子特性來加速解決問題的時間。

本章作業內容是利用 CCNOT 可類推到 AND 的特性 (如下圖) 來將給定的邏輯閘轉換成使用 CCNOT。

OuO

OuO

這裡會大量使用笛摩根定理 1 將主要邏輯閘換成 AND。另外這裡使用的符號跟課本所用的符號不太一樣 (因為 $\bar{x}$ 在多層下不太方便):

  • $\lnot x$: NOT x
  • $x\lor y$: x OR y
  • $x\land y$: x AND y

另外量子的表達方法用 OpenQASM 的方式呈現,$x$ 對應 q[0], $y$ 對應 q[1], 輸出為 q[2],其中 q[0], q[1] 會用 Hadamard 使輸入變成疊加態。篇幅問題重複部分 (標頭檔、宣告、Hadamard、測量) 就不寫如簡化後版本:

  • 例如: $\lnot x \land y$ 簡化前:
    OPENQASM 2.0;
    include "qelib1.inc";
    qreg q[5];
    creg c[3];
    h q[0];
    h q[1];
    // ---
    x q[0];
    ccx q[0], q[1], q[2];
    x q[0]; // 回復 q[0]
    // ---
    measure q[0] -> c[0];
    measure q[1] -> c[1];
    measure q[2] -> c[2];
    
  • 例如: $\lnot x \land y$ 簡化後:
    x q[0];
    ccx q[0], q[1], q[2];
    x q[0]; // 回復 q[0]
    

$\lnot x \lor y$

$\lnot x \lor y \Longleftrightarrow \lnot(\lnot\lnot x \land \lnot y) \Longleftrightarrow \lnot(x \land \lnot y)$

x q[1];
x q[2]; // AND 後 NOT 的做法是把 target bit 先 NOT
ccx q[0], q[1], q[2];
x q[1];

$x \lor \lnot y$

$x \lor \lnot y \Longleftrightarrow \lnot(\lnot x \land \lnot\lnot y) \Longleftrightarrow \lnot(\lnot x \land y)$

x q[0];
x q[2]; // AND 後 NOT 的做法是把 target bit 先 NOT
ccx q[0], q[1], q[2];
x q[0];

$\lnot y \land (x \lor \lnot x)$

比較特別是 $x$ 跟 $\lnot x$ 需要分開,另外會需要用到兩個暫存 qubit (q[3], q[4])。

$\lnot y \land (x \lor \lnot x)
\Longleftrightarrow (\lnot y \land x) \lor (\lnot y \land \lnot x)
\Longleftrightarrow \lnot \Big(\lnot (\lnot y \land x) \land \lnot(\lnot y \land \lnot x)\Big)$

// (\lnot y \land x)
x q[1];
ccx q[0], q[1], q[3];
x q[1];
barrier q[0],q[1],q[2],q[3],q[4];

// (\lnot y \land \lnot x)
x q[0];
x q[1];
ccx q[0], q[1], q[4];
x q[0];
x q[1];
barrier q[0],q[1],q[2],q[3],q[4];

x q[3];
x q[4];
x q[2];
ccx q[3], q[4], q[2];
x q[3];
x q[4];

OuO

$\lnot x \land (y \lor \lnot y)$

其實跟上面類似,只是 $x, y$ 互換

$\lnot x \land (y \lor \lnot y)
\Longleftrightarrow \lnot \Big(\lnot (\lnot x \land y) \land \lnot(\lnot x \land \lnot y)\Big)$

// (\lnot x \land y)
x q[0];
ccx q[0], q[1], q[3];
x q[0];
barrier q[0],q[1],q[2],q[3],q[4];

// (\lnot x \land \lnot y)
x q[0];
x q[1];
ccx q[0], q[1], q[4];
x q[0];
x q[1];
barrier q[0],q[1],q[2],q[3],q[4];

x q[3];
x q[4];
x q[2];
ccx q[3], q[4], q[2];
x q[3];
x q[4];

$\lnot x \land y$

直接用 CCNOT 實作 AND。

x q[0];
ccx q[0], q[1], q[2];
x q[0];

$x \land \lnot y$

同上。

x q[1];
ccx q[0], q[1], q[2];
x q[1];

References

Footnotes

  1. De Morgan’s laws - wiki ↩︎

  • ⊛ Back to top
  • ⊛ Go to bottom