| 262 | } |
| 263 | |
| 264 | QProg QDiv(QVec& a, QVec& b, QVec& c, QVec& k, ClassicalCondition& t) |
| 265 | { |
| 266 | auto len = a.size(); |
| 267 | QProg prog; |
| 268 | prog << CNOT(a[len - 1], k[len * 2 + 2]) |
| 269 | << CNOT(b[len - 1], k[len * 2 + 3]); |
| 270 | prog << CNOT(k[len * 2 + 2], a[len - 1]) |
| 271 | << CNOT(k[len * 2 + 3], b[len - 1]); |
| 272 | prog << QDivider(a, b, c, k, t); |
| 273 | QCircuit circ; |
| 274 | circ << X(c[len - 1]); |
| 275 | prog << CNOT(k[len * 2 + 2], k[len * 2 + 3]); |
| 276 | prog << circ.control(k[len * 2 + 3]); |
| 277 | prog << CNOT(k[len * 2 + 2], k[len * 2 + 3]); |
| 278 | prog << CNOT(k[len * 2 + 2], a[len - 1]) |
| 279 | << CNOT(k[len * 2 + 3], b[len - 1]); |
| 280 | prog << CNOT(a[len - 1], k[len * 2 + 2]) |
| 281 | << CNOT(b[len - 1], k[len * 2 + 3]); |
| 282 | return prog; |
| 283 | } |
| 284 | |
| 285 | QProg QDivider( |
| 286 | QVec& a, |