void mutation( individual *chr, double rate, my_random * rand ){ int l = NUM_UAVS / 2; // number of indexes in chromosome arrays double num; int i,j,k; for(i = 0; i < l; ++i){ for(j = 0; j < 8; ++j){ num = doub( rand ); // flip the current bit if( num <= rate) chr->genes[i] = chr->genes[i] ^ ( 1 << ( 7 - j )) ; } } }
// 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); }