next up previous contents
Next: About this document ... Up: shor.cxx Previous: Functions   Contents

Main Program


word number;                    // number to be factored
word factor;                    // found factor
int width=duallog(number);      // length of N in bits
int nreg1=2*width,nreg2=width;  // width of registers
quBaseState qubase(nreg1+nreg2);// basestate
quWord reg1(nreg1,0,qubase);    // register 1
quWord reg2(nreg2,nreg1,qubase);// register 2
word x;                         // base value
word mreg1,mreg2;               // measurements of 1st and 2nd register
word pow;                       // pow^2==1 mod number
word a,b;                       // possible factors
word p,q;                       // fraction p/q for rational approximation
double qmax=1<<width;           // maximal period

while(1) {
  qubase.reset();                       // reseting state
  opFFT(nreg1)(reg1);                   // 1st Fourier transformation
  x=randcoprime(number);                // selecting random x
  opEXPN(nreg1,nreg2,x,number)(qubase); // modular exponentiation
  mreg2=reg2.measure().get-word();       // measure 2nd register
  opFFT(nreg1)(reg1);                   // 2nd Fourier transformation
  mreg1=reg1.select().getword();        // measure 1st register
  if(mreg1==0) continue;                // failed if measured zero

  // finding rational approximation for mreg1/rmax^2
  approx((double) mreg1/(qmax*qmax),(int) qmax,&p,&q);
  if(q%2) continue;                     // failed if q is odd.
  pow=powmod(x,q/2,number);             // pow = x^(q/2) mod number
  a=(pow+1)%number;                     // candidates with possible
  b=(pow+number-1)%number;              // common factors with number
  
  // testing for common factors with number                    
  if(a>1 && (factor=gcd(number,a))>1) break; 
  if(b>1 && (factor=gcd(number,b))>1) break;
};




(c) Bernhard Ömer - oemer@tph.tuwien.ac.at - http://tph.tuwien.ac.at/~oemer/