Example #1
0
File: 131.c Project: savanto/prob
int main() {
  unsigned char* comp = primesieve(P);
  unsigned long long p, n, k, m, count = 0;

  // By generating such primes under 100 by brute force, a pattern becomes
  // apparent: 
  //  n^3 + n^2 * p = m^3
  //  n = k^3 for k = {1, 2, 3, ...}
  //  m = k^3 + k^2 = n + k^2
  //  p = (m^3 - n^3) / n^2  --> reduces down to p = 3(k^2 + k) + 1
  // From here, it is sufficient to iterate over positive integers k,
  //  deriving n, m, and p, and checking p for primeness.
  // If p is prime, relationship holds, otherwise skip this k/n.
  for (k = 1, p = 3 * (k*k + k) + 1; p < P; ++k, p = 3 * (k*k + k) + 1) {
    if (! comp[p]) {
      n = k*k*k;
      m = k*k + n;
      printf("%llu^3 + %llu^2 * %llu = %llu^3\n", n, n, p, m);
      ++count;
    }
  }

  printf("%llu primes < %llu have this property.\n", count, P);
  free(comp);
  return 0;
}
Example #2
0
int main () {

  const ulong limit = 100000000; ulong c = 0;
  std::vector<bool> primesieve (limit, 0), sieve (limit, 1);
  primesieve[2], primesieve[3] = 1;
  for (ulong x = 1; x < sqrt (limit); x++) {
    for (ulong y = 1; y < sqrt (limit); y++) {
      ulong n = 4*x*x+y*y;
      if (n <= limit && (n % 12 == 1 || n % 12 == 5)) {
        primesieve[n] = !primesieve[n];
      }
      n = 3*x*x+y*y;
      if (n <= limit && n % 12 == 7) {
        primesieve[n] = !primesieve[n];
      }
      n = 3*x*x-y*y;
      if (x > y && n <= limit && n % 12 == 11) {
        primesieve[n] = !primesieve[n];
      }
    }
  }
  for (ulong n = 5; n < sqrt (limit); n++) {
    if (primesieve[n]) {
      ulong nn = n*n;
      for (ulong i = nn; i < limit; i += nn) {
        primesieve[i] = 0;
      }
    }
  }
  for (ulong i = 2; i <= limit; ++i) {
    ulong ii = i;
    while (ii < limit) {
      if (!primesieve[i+ii/i]) {
        sieve[ii] = 0;
      }
      ii += i;
    }
  }
  for (ulong i = 1; i < limit; ++i) {
    if (sieve[i]) { c += i; }
  }
  std::cout << c << std::endl;
  return 0;
}
Example #3
0
File: 072.c Project: savanto/prob
int main() {
  // It appears that the solution to the problem is given by the sum of all
  // totients of d:
  // # elements = SUM(phi(d)) for d in {2..1000000}

  // Prime sieve for use in totient calculation prime factorization.
  unsigned char* comp = primesieve(D+1);
  unsigned long long int d, p, f, phi, sum = 0;

  for (d = 2; d <= D; ++d) {
    // Totient of a prime number d = d - 1.
    if (! comp[d]) {
      sum += d - 1;
//      printf("phi(%llu) = %llu\n", d, d-1);
    }
    else {
      // Produce prime factorization of d.
      phi = p = d;
      if (d % 2 == 0) {
        phi /= 2;
        p /= 2;
      }
      for (f = 3; f <= p; f += 2)
        if (! comp[f])
          if (d % f == 0) {
            phi = phi * (f - 1) / f;
            p /= f;
          }

      sum += phi;

//      if (d % 10000 == 0)
//        printf("phi(%llu) = %llu\n", d, phi);
    }
  }

  printf("%llu reduced proper fractions for d <= %llu.\n", sum, D);

  free(comp);
  return 0;
}
Example #4
0
File: 087.c Project: savanto/prob
int main() {
  unsigned char* comp = primesieve(I);
  unsigned char* found = (unsigned char*) calloc(M, sizeof(unsigned char));
  unsigned long long count = 0;
  int i, j, k;

  for (i = 2; i < I; ++i)
    if (! comp[i])
      for (j = 2; j < J; ++j)
        if (! comp[j])
          for (k = 2; i*i + j*j*j + k*k*k*k < M; ++k)
            if (! comp[k]) {
              if (! found[i*i + j*j*j + k*k*k*k])
                ++count;
              ++found[i*i + j*j*j + k*k*k*k];
            }

  printf("Numbers expressible as the sum of a prime square, prime cube,\n"
         "and prime fourth power below %llu: %llu\n", M, count);

  free(comp);
  return 0;
}