| 512 | } |
| 513 | |
| 514 | QCircuit constModMul(QVec &qvec, int base, int module_Num, QVec &qvec1, QVec &qvec2, QVec &qvec3) |
| 515 | { |
| 516 | QCircuit circuit, tmpcir, tmpcir1; |
| 517 | int tmpvalue, qsize = qvec.size(); |
| 518 | |
| 519 | for (int i = 0; i < qsize; i++) |
| 520 | { |
| 521 | tmpvalue = (base * (1 << i)) % module_Num; |
| 522 | circuit << constModAdd(qvec1, tmpvalue, module_Num, qvec2, qvec3).control(qvec[i]); |
| 523 | } |
| 524 | |
| 525 | for (int i = 0; i < qsize; i++) |
| 526 | { |
| 527 | circuit << CNOT(qvec[i], qvec1[i]) << CNOT(qvec1[i], qvec[i]) << CNOT(qvec[i], qvec1[i]); |
| 528 | } |
| 529 | |
| 530 | int Crev = modReverse(base, module_Num); |
| 531 | |
| 532 | for (int i = 0; i < qsize; i++) |
| 533 | { |
| 534 | tmpvalue = (Crev * (1 << i)) % module_Num; |
| 535 | tmpcir1 << constModAdd(qvec1, tmpvalue, module_Num, qvec2, qvec3).control(qvec[i]); |
| 536 | } |
| 537 | |
| 538 | circuit << tmpcir1.dagger(); |
| 539 | |
| 540 | return circuit; |
| 541 | } |
| 542 | |
| 543 | QCircuit constModExp(QVec &qvec, QVec &result, int base, int module_Num, QVec &qvec1, QVec &qvec2, QVec &qvec3) |
| 544 | { |
no test coverage detected