#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include "QuEST.h"
void applyOracle(Qureg qureg, int numQubits, int solElem) {
for (int q=0; q<numQubits; q++)
if (((solElem >> q) & 1) == 0)
pauliX(qureg, q);
int ctrls[numQubits];
for (int q=0; q<numQubits; q++)
ctrls[q] = q;
multiControlledPhaseFlip(qureg, ctrls, numQubits);
for (int q=0; q<numQubits; q++)
if (((solElem >> q) & 1) == 0)
pauliX(qureg, q);
}
void applyDiffuser(Qureg qureg, int numQubits) {
for (int q=0; q<numQubits; q++)
hadamard(qureg, q);
for (int q=0; q<numQubits; q++)
pauliX(qureg, q);
int ctrls[numQubits];
for (int q=0; q<numQubits; q++)
ctrls[q] = q;
multiControlledPhaseFlip(qureg, ctrls, numQubits);
for (int q=0; q<numQubits; q++)
pauliX(qureg, q);
for (int q=0; q<numQubits; q++)
hadamard(qureg, q);
}
int main() {
QuESTEnv env = createQuESTEnv();
int numQubits = 15;
int numElems = (int) pow(2, numQubits);
int numReps = ceil(M_PI/4 * sqrt(numElems));
printf("numQubits: %d, numElems: %d, numReps: %d\n",
numQubits, numElems, numReps);
srand(time(NULL));
int solElem = rand() % numElems;
Qureg qureg = createQureg(numQubits, env);
initPlusState(qureg);
for (int r=0; r<numReps; r++) {
applyOracle(qureg, numQubits, solElem);
applyDiffuser(qureg, numQubits);
printf("prob of solution |%d> = " REAL_STRING_FORMAT "\n",
solElem, getProbAmp(qureg, solElem));
}
destroyQureg(qureg, env);
destroyQuESTEnv(env);
return 0;
}