私は最近 Project Euler にはまっているので、次はこれをやろうとしています! 私はそれについていくつかの分析を開始し、すでに問題を大幅に削減しています。これが私の仕事です:
A = pqr および
1/A = 1/p + 1/q + 1/r だから pqr/A = pq + pr + qr
そして、最初の方程式のために:
pq+pr+qr = 1
p、q、r の 2 つだけが負でなければならないため、式を次のように単純化できます。
ab = ac+bc+1 の abc
c について解くと、次のようになります。
ab-1 = (a+b)c
c = (ab-1)/(a+b)
これは、次の a と b を見つける必要があることを意味します。
ab = 1 (mod a+b)
そして、これらの a と b の A 値は次のとおりです。
A = abc = ab(ab-1)/(a+b)
それが多くの数学である場合は申し訳ありません!しかし、ここで取り扱わなければならないのは、1 つの条件と 2 つの方程式だけです。ab = 1(mod a + b)でab(ab-1)/(a + b)として記述された150,000番目に小さい整数を見つける必要があるため、理想的には、Aができるだけ小さく。
簡単にするために、a < b と仮定し、gcd(a, b) = 1 であることにも気付きました。
私の最初の実装は単純明快で、150,000 の解を十分に速く見つけることさえできます。ただし、150,000 個の最小解を見つけるには時間がかかりすぎます。とにかくコードは次のとおりです。
n = 150000
seen = set()
a = 3
while len(seen) < n:
for b in range(2, a):
if (a*b)%(a+b) != 1: continue
seen.add(a*b*(a*b-1)//(a+b))
print(len(seen), (a, b), a*b*(a*b-1)//(a+b))
a += 1
私の次の考えは、Stern-Brocot ツリーを使用することでしたが、解決策を見つけるには遅すぎます。私の最終的なアルゴリズムは、中国の剰余定理を使用して、a+b の異なる値が解をもたらすかどうかを確認することでした。そのコードは複雑で、高速ではありますが、十分に高速ではありません...
だから私は絶対にアイデアがありません!誰でもアイデアはありますか?