CNumber SC(const CNumber& n, const CNumber& boundary) { CNumber a,b,c,d; for(a=SQRT(n)+1;a<=boundary;++a){ b=a*a; c=Modulo(b,n); d=SQRT(c); if(d*d==c) return NWD(n,b-a*d); //NWD==GCD } return 1; }