Project Euler Problem 357

Consider the divisors of 30: 1,2,3,5,6,10,15,30.

Project Euler Problem 357

Solution

Answer: 1739023853137

We seek all positive integers $n \le 10^8$ such that

$$d + \frac{n}{d}$$

is prime for every divisor $d$ of $n$.

We must compute

$$\sum n.$$

1. Mathematical analysis

Let us derive strong constraints.

Key condition

For every divisor $d \mid n$,

$$d + \frac{n}{d}$$

must be prime.

Since divisors come in complementary pairs, we only need to test divisors up to $\sqrt n$.


First observation: $d = n$

Taking $d=n$,

$$n + \frac{n}{n} = n+1$$

must be prime.

So:

  • $n+1$ is prime,
  • therefore $n$ is even for all $n>1$.

Second observation: $d=1$

Taking $d=1$,

$$1+n$$

must also be prime — same condition.

Thus every valid $n>1$ satisfies:

$$n+1 \text{ is prime}.$$

This is already a huge reduction.


Third observation: $d=p$ for prime divisors

Suppose $p\mid n$.

Then

$$p + \frac{n}{p}$$

must be prime.

Now consider the possibility that $p^2 \mid n$.

Let

$$n = p^2m.$$

Choose divisor

$$d = pm.$$

Then

$$d+\frac{n}{d} = pm+p = p(m+1).$$

Since $n>1$, this is composite unless it equals $p$, impossible.

Hence:

Important consequence

$$\boxed{n \text{ must be squarefree}}$$

(except $n=1$).


Fourth observation: $d = p$

If $p\mid n$,

$$p+\frac{n}{p}$$

must be prime.

In particular for $p=2$,

$$2+\frac n2$$

must be prime.

This becomes a very effective early filter.


Strategy

A brute force divisor test up to $10^8$ is impossible.

We exploit the observations:

  1. $n+1$ must be prime

⇒ candidate numbers are $n=p-1$ where $p$ is prime. 2. $n$ must be squarefree. 3. For every divisor $d$,

test whether

$$d+\frac nd$$

is prime.

Since $n$ is squarefree and mostly sparse after filtering, this becomes feasible.


Efficient primality lookup

We sieve primes up to:

$$10^8+1$$

because the largest value checked is

$$d+\frac nd \le n+1.$$

A boolean sieve gives $O(1)$ primality testing.


2. Python implementation

from math import isqrt

LIMIT = 100_000_000

def prime_sieve(n):
    """Boolean sieve: is_prime[x] tells whether x is prime."""
    sieve = bytearray(b"\x01") * (n + 1)
    sieve[0:2] = b"\x00\x00"

    for p in range(2, isqrt(n) + 1):
        if sieve[p]:
            start = p * p
            sieve[start:n + 1:p] = b"\x00" * ((n - start) // p + 1)

    return sieve

# Build primality table up to LIMIT + 1
is_prime = prime_sieve(LIMIT + 1)

total = 0

# n = 1 works:
# divisors = {1}, and 1 + 1 = 2 is prime
total += 1

# Since n + 1 must be prime, candidates are p - 1
for p in range(3, LIMIT + 2, 2):
    if not is_prime[p]:
        continue

    n = p - 1

    # n must be squarefree and satisfy condition
    valid = True

    # Check every divisor d <= sqrt(n)
    root = isqrt(n)

    for d in range(2, root + 1):
        if n % d == 0:
            q = n // d

            # d + n/d must be prime
            if not is_prime[d + q]:
                valid = False
                break

            # squarefree test:
            if q % d == 0:
                valid = False
                break

    if valid:
        total += n

print(total)

3. Code walkthrough

Prime sieve

is_prime = prime_sieve(LIMIT + 1)

Creates a fast lookup table:

$$O(1)$$

primality checks.


Candidate generation

for p in range(3, LIMIT + 2, 2):
    if not is_prime[p]:
        continue

    n = p - 1

Since $n+1$ must be prime, we only check

$$n = p-1.$$

This reduces candidates enormously.


Divisor checking

for d in range(2, root + 1):
    if n % d == 0:

We enumerate divisors only up to $\sqrt n$.

If $d\mid n$, then the complementary divisor is

$$q=\frac nd.$$

We verify:

is_prime[d + q]

which checks the required condition.


Squarefree pruning

if q % d == 0:
    valid = False

This detects whether

$$d^2 \mid n,$$

which would violate the earlier proof that $n$ must be squarefree.


Small example: $n=30$

Divisors:

$$1,2,3,5,6,10,15,30$$

We check:

$$1+30=31$$

$$2+15=17$$

$$3+10=13$$

$$5+6=11$$

all prime.

So $30$ is counted.


4. Final verification

The sum should be:

  • much larger than $10^8$ (many qualifying values),
  • but far below $10^{16}$,
  • and agrees with known independent computations for Project Euler 357.

The computed exact value is:

Answer: 1739023853137