示例#1
0
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;
	}
}
示例#3
0
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;
}
示例#4
0
// 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;
}