예제 #1
0
파일: ZZFactoring.cpp 프로젝트: onechip/ecm
// returns a non-trivial factor q of ZZ_p::modulus(), or 1 otherwise
void ECM_stage_one(ZZ& q, EC_p& Q, PrimeSeq& seq, long bound) {
  long sbound = (long)sqrt((double)bound);
  seq.reset(0);
  long p = seq.next();
  for (; p<=sbound; p=seq.next()) {
    long pp,t=p;
    do { pp=t; t*=p; } while (t>pp && t<=bound); // we might overflow t here
    mul(Q,Q,pp);
  }
  for (; p<=bound; p=seq.next())
    mul(Q,Q,p);
  if (!IsZero(Q))
    GCD(q,ZZ_p::modulus(),rep(Q.Z));
  else
    set(q);
}
예제 #2
0
/* Find a primitive root modulo N */
long primroot(long N,long phiN)
{
  long g=2,p;
  PrimeSeq s;
  bool flag=false;

  while (flag==false)
    { flag=true;
      s.reset(1);
      do
        { p=s.next();
          if ((phiN%p)==0)
            { if (PowerMod(g,phiN/p,N)==1)
                { flag=false; }
            }
        }
      while (p<phiN && flag);
      if (flag==false) { g++; }
    }
  return g;
}
예제 #3
0
int main(){
        long n = 183783600;
        long b = 18;
        long rootn=SqrRoot(n);
        long p;
        PrimeSeq s;
        vector<long> values;
        vector<long> logV;
        for(long m=n+1;m<1.66*n;m++){
                values.push_back(m);
                logV.push_back(log(m));
        }
                s.reset(b);
                p=s.next();
                int temp=log(p);
                while(p<rootn){
        for(int i=0;i<logV.size();i++){
                        long t=pow(10,(logV[i]/temp));
                        if(ceil(t)-t<0.05 || t-floor(t)<0.05){
//                        cout<<"here at "<<i<<endl;
                                values[i]=0;
                                
                                break;
                        }
                }
                        p=s.next();
        }
        int y=0;
        cout<<"arr=[";
        for(int i=0;i<values.size();++i){
                if(values[i]!=0)cout<<values[i]<<",";
//                if(temp[i]!=0)cout<<temp[i]<<endl;
        }
        cout<<"0]"<<endl;
        cout<<"ND = numdiv("<<n<<"); nd = 0; i = 1; while( nd<=ND, nd = numdiv(arr[i]); i = i+1); print(arr[i-1])"<<endl;

        return 0;
}