int main(int argc, char **args) { Q_UNUSED(argc); Q_UNUSED(args); Primes *primes = newPrimes(); int i = 0; int p1; int dmul; int p2mul; int d; qint64 sum = 0; for (int p2 = 7; p2 <= 1000003; p2 += 2) { /* last p2 == 1000003*/ updatePrimes(p2, primes); if (isPrime(p2, *primes) == false) continue; i += 1; p1 = primes->l[primes->s[p2] - 1]; d = pow(10, floor(log10(p1))+1); Q_ASSERT(d > p1 && p1*10 > d); int t = extendedEuclid(d, p2, &dmul, &p2mul); Q_ASSERT(t == 1); Q_ASSERT((qint64) d * (qint64) dmul + (qint64) p2 * (qint64) p2mul == 1); qint64 x = (qint64) -p1 * (qint64) dmul; while (x < 0) { x += p2; } x = (x + p2) % p2; qint64 wantedNumber = (qint64)x * (qint64)d + p1; Q_ASSERT(wantedNumber > p1 && wantedNumber > p2); Q_ASSERT(wantedNumber % p2 == 0); Q_ASSERT((wantedNumber - p1) % d == 0); if (i % 1000 == 0 || p2 > 998999 || p2 < 200) { qDebug() << QString("%1 %2: %3 % %4 == 0").arg(p1, 7).arg(p2, 7).arg(wantedNumber, 20).arg(p2, 7); } sum += wantedNumber; Q_ASSERT(sum > 0); } qDebug() << sum; deletePrimes(primes); return 0; }
void extendedEuclid(int a, int b) { if(b == 0) { d = a; x = 1; y = 0; } else { extendedEuclid(b, a % b); int tmp = x; x = y; y = tmp - (a / b) * y; } }
long mod_inverse( long base, long m) { long d, x, y; long retValue = 0; d = 1; x = 1; y = 1; if(GCD(base, m) == 1) { extendedEuclid( base, m, &x, &y, &d); retValue = x; if(retValue < 0) { retValue = retValue + m;} return retValue; } return -1; }
// returns greatest common divisor of a, b static int extendedEuclid(int a, int b, int *amul, int *bmul) { if (a > b) { int t1 = a; a = b; b = t1; int *t2 = amul; amul = bmul; bmul = t2; } if (b % a == 1) { *bmul = 1; *amul = -(b/a); return 1; } int ret = extendedEuclid(b % a, a, amul, bmul); int t = *bmul; *bmul = *amul; *amul = t + *amul * -(b/a); return ret; }
int modularInverse(int a, int n) { pii ret = extendedEuclid(a, n); return ((ret.x % n) + n) % n; }
int modInverse(int a, int m) { extendedEuclid(a, m); return (x % m + m) % m; }