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; };