当前位置: 首页>>代码示例>>C++>>正文


C++ PrimeSeq类代码示例

本文整理汇总了C++中PrimeSeq的典型用法代码示例。如果您正苦于以下问题:C++ PrimeSeq类的具体用法?C++ PrimeSeq怎么用?C++ PrimeSeq使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。


在下文中一共展示了PrimeSeq类的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: ECM_stage_two

// returns a non-trivial factor q of ZZ_p::modulus(), or 1 otherwise
void ECM_stage_two(ZZ& q, EC_p& Q, PrimeSeq& seq, long bound, long D) {
  long B1 = seq.next();
  if (B1<=2*D) {
    // no primes to work with
    set(q);
    return;
  }

  EC_p R;
  mul(R,B1,Q);
  // check R for divisor
  if (IsZero(R)) {
    set(q);
    return;
  }
  GCD(q,ZZ_p::modulus(),rep(R.Z));
  if (!IsOne(q))
    return;
  EC_p T;
  mul(T,B1-2*D,Q);

  // compute point multiples S[d]=2*d*Q
  EC_p S[D+1];
  S[0]=Q;
  doub(S[1],Q);
  doub(S[2],S[1]);
  for (long d=3; d<=D; ++d)
    addh(S[d],S[d-1],S[1],S[d-2]);
  ZZ_p beta[D+1];
  for (long d=0; d<=D; ++d)
    mul(beta[d],S[d].X,S[d].Z);

  ZZ_p g,t,t2;
  set(g);
  ZZ_p alpha;
  long r=B1;
  long p=seq.next();
  do {
    mul(alpha,R.X,R.Z);
    do {
      long delta = (p-r)/2;
      if (delta>D) break;
      //g *= (R.X-S[delta].X) * (R.Z+S[delta].Z) - alpha + beta[delta];
      sub(t,R.X,S[delta].X);
      add(t2,R.Z,S[delta].Z);
      t*=t2;
      t-=alpha;
      t+=beta[delta];
      g*=t;
      // next prime
      p = seq.next();
      if (p==0) {
	// ran out of primes (should never happen)
	p=NTL_MAX_LONG;
	break;
      }
    } while (p<=bound);
    if (p>bound)
      break;
    addh(T,R,S[D],T);
    swap(R,T);
    r+=2*D;
  } while (true);
  if (!IsZero(g))
    GCD(q,ZZ_p::modulus(),rep(g));
  else
    set(q);
}
开发者ID:onechip,项目名称:ecm,代码行数:69,代码来源:ZZFactoring.cpp


注:本文中的PrimeSeq类示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。