本文整理汇总了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);
}