https://github.com/epiqc/ScaffCC
Raw File
Tip revision: 9d2cca71cf54ddfebda26e247d82ae7b71d9e03c authored by Pranav Gokhale on 30 June 2018, 18:56:21 UTC
Fix OpenQASM output formatting of Rx and Ry
Tip revision: 9d2cca7
cnp2.c

// Class Number Algorithm -- Phase II (structure of the class group)
//
// Sect 6 of the GFI indicates the inputs to Phase II are delta, the
// approximation of the regulator R (from Phase I), and q, k, N, and M.
//
// We further assume that the classical step of producing k generators
// g[0], ..., g[k-1], was done (see GFI section 4.1.3)
//
// Finally, we assume the classical precomputation of logdelta = 
// ceiling(log_2(delta)), lognr = ceiling(log_2(N*R), logm = ceiling(log_2(M))
// sdelta = sqrt(Delta), and the jitter jp, and bound (see cnp1.c)
//
// res is the output array for the k q-qubit results
//
// See 4.1.4 of the GFI for details
//
cnp2(delta, q, k, g, R, N, M, logdelta, lognr, logm, sdelta, jp, bound, res)
{
  qreg in[q*k];                      // input registers
  qreg I[logdelta];
  qreg i[lognr];
  qreg j[lognr];
  qreg fout[logdelta+lognr];
  qreg x[logm + lognr];
  qreg y[lognr];
  qreg size[logdelta+lognr];
  qreg dist[lgdelta];
  qreg found[1];
  qreg c1[logm + lognr];
  qreg c2[logm + lognr];
  qreg d1[lognr];
  qreg d2[lognr];
  qreg a[logm + lognr];
  qreg b[lognr];

  gfor (i=0; i < q*k; i++)
  {
    zprepare(in[i], 0);               // init qubits to |0>
    H(in[i]);                         // put into uniform superposition
  }
  zprepare(I);                        // prepare all 6 output registers
  zprepare(i);
  zprepare(fout);
  zprepare(x);
  zprepare(y);
  zprepare(size);

  
  ghat(I, g, in, k, delta, sdelta);    // oracle that produces I

  H(i);                                // put i into uniform superposition

  fjn(bound, delta, sdelta, I, in[q..q+t-1], dist); 

  do {
    do {
      H(x);
      H(y);
      h(x, y, bound, delta, sdelta, i, size, dist);

      // measure the output of our oracle
      for (i=0; i < logdelta+lognr; i++)
	measX(size[i], result[i]);
      
      qft(x);
      qft(y);
     
      for (i=0; i < logm+lognr; i++)
	measX(x[i], c1[i]);
      
      for (i=0; i < lognr; i++)
	measX(y[i], d1[i]);

      H(x);
      H(y);
      h(x, y, bound, delta, sdelta, i, size, dist);

      // measure the output of our oracle
      for (i=0; i < logdelta+lognr; i++)
	measX(size[i], result[i]);
      
      qft(x);
      qft(y);
     
      for (i=0; i < logm+lognr; i++)
	measX(x[i], c2[i]);
      
      for (i=0; i < lognr; i++)
	measX(y[i], d2[i]);
    }
    while (gcd(d1, d2, a, b) != 1);
    
  } while (xd(c1, c2, a, b, N, M, R) != dist);

  fjn(bound, delta, sdelta, I, in[q..q+t-1], dist); 
  h(x, y, bound, delta, sdelta, i, size, dist);
  ghat(I, g, in, k, delta, sdelta); 

  for (i=0; i < logdelta+lognr; i++)
	measX(fout[i], result[i]);

  qft(result);
  
  for (j=0; j < k; j++)
    for (i=0; i < q; i++)
      measX(in[j][i], res[j][i]);
}
back to top