Problem 136

Problem 136 - Project Euler

正整数かつ等差数列である3つの数x, y, zと、正整数nについての方程式を考える。n=20のとき、方程式はただ一つの解を持つ。

100未満のnについて、そのうち25個が方程式に対しだた一つの解を持つ。
5千万より小さいnについて、ただ一つの解を持つものがいくつあるか答えよ。

解答

nの値としてあり得るのは、pを奇素数または1として

  1. ()

の3パターンしかない。なので、5千万までの素数表さえ用意出来ればすぐに解ける。フォーラム覗いてみてもこのやり方の人が多い。といっても5千万以下ともなるとパッと求めるのは厳しいのでなんか別の方法があるかも。

証明

等差数列の公差をaとおき、整理すると

また, すなわち
よって

となり、上記不等式も満たすようなyがただ一つ存在するようなnの条件を求めればよい。

nが素数のとき

は整数でなければならないので、yとしては1またはnのみがあり得る。y=1では不等式を満たさないが、y=nならば必ず満たす。よって

すなわち
()
を満たすnは全てただ一つの解を持つ。

nが合成数のとき

nが異なる2つの奇数o, rに分解できたとして、y=oのとき解が出来たとする。

整理すると

ここで、y = n = orとした上、上式を代入する。

pは奇数なので、の様に書ける。これを代入すると

が得られるので、y=nも解を作る。よって解は2つ以上となる。
以上より、nは約数として2つ以上の奇数を含まず、次の形に素因数分解できる。

よって



もしくは

と書ける。この式を成立させるためには、かつもしくはかつのいずれかでなければならない。
不等式を考慮すると、かつのときはのみが必ず成立する。つまり、は必ず解を一つ作る。
また、では2つ以上の解を必ず作ることができる。
よってのみが残る可能性となる。
yとしてあり得るのは10通りしかないのですべて調べると、のときに必ず、またそのときのみ解が出来ることがわかる。よっても必ず解を一つ作る。(証明終)

ソース
limit <- 5e7
sieve <- logical(limit)
sieve[1] <- TRUE
sieve[seq(4, limit, by=2)] <- TRUE
for(i in seq(3, sqrt(limit), by=2)){
  sieve[seq(i*2, limit, i)] <- TRUE
}
prime <- c(1, (1:limit)[!sieve][-1])

sum(prime %% 4 == 3) + 
  sum(4 * prime < limit) + 
  sum(16 * prime < limit)

45秒程度。ほとんどは素数表を求める時間で、残りは1sec以下で計算できる。
(追記)エラトステネスの篩を見直したら6.7秒に短縮できた。

limit <- 5e7

sieve <- logical((limit-1)/2)
for(i in 1:(floor(sqrt(limit)-1)/2)){
  if(!sieve[i]){
    sieve[seq(2*i*(i+1), length(sieve), by = 2*i+1)] <- TRUE
  }
}
prime <- c(2, (1:length(sieve))[!sieve] * 2 + 1)

sum(prime %% 4 == 3) + 
  sum(4 * prime < limit) + 
  sum(16 * prime < limit)